一、多任务
多任务并不是一起执行,只是因为所有程序都在获取执行权,CPU处理速度很快,看上去是在进行多任务
二、进程
(一)、进程是一个具有一定独立功能的程序的一次运行活动,同时也是资源分配的最小单元
相关术语:
1、资源:一般指内存 2、CPU时间片:比如给5秒的时间处理一个事件 3、进程控制块:保存进程的启动信息
Linux命令行下查看所有进程:ps -a
(二)、进程状态
执行状态:正在占用CPU
就绪状态:进程已经具备一切条件,正在等待分配CPU的处理时间片
等待状态:进程不能使用CPU,若等待事件发生则可将其唤醒
图释:
(三)、进程特点:
1、并行性 2、互不干扰 3、开销大(缺点)
(四)、Linux进程结构
1、数据段:存放全局标量、常数
2、代码段:存放的为程序代码和数据
3、堆栈段:子程序的返回值,子程序的参数,程序的局部变量
(四)、进程互斥
当有若干个进程都要使用某一共享资源时,任何时刻最多允许一个进程使用,所以需要进程同步,且并发进程需要按顺序执行。
(五)、临界资源
同意时刻只允许一个进程访问的资源,进程中访问临界资源的那段程序代码称为临界区
(六)、进程调度
1、方式:1>抢占式 2>非抢占式
2、死锁:多个进程因竞争资源而形成一种僵局,若无外力作用这些进程,这些进程都将永远无法获取资源,不能再前进。
(七)、创建进程
1、fork
头文件:#include
#include
pid_t fork(void);
执行过程:
1>给子进程分配空间
2>将父进程的数据段、堆栈段拷贝到子进程
3>将父进程的代码段共享给子进程
4>给父进程的PID返回一个大于0的数,给子进程的PID返回等于0的数,错误返回-1
所以fork产生的子进程只共享代码段,不共享堆栈段,数据段,所以父子进程之间互不影响
2、vfork
pid_t vfork(void);
只有当子进程执行之后,父进程才可执行,且共享数据段和堆栈段
vfork在执行完子进程之后应该加exit(1),因为其共享数据段,不加exit(1)异常退出,其数据会被子进程释放,父进程无法执行
3、exec函数族
exec函数族启动一个新程序,替换原有的进程,但不产生新的PID
具体见数p225(不常用)
4、system
可以在一个程序中执行另一个进程,等该程序执行完毕再执行接下来的进程,例如:system("./hello");
(八)、僵尸进程
子进程的资源一定是由父进程交还给系统,如果父进程先于子进程退出,则会出现僵尸进程,可以在父进程中调用wait(NULL);将父进程挂起,等子进程结束再释放