linux系统编程之进程(二):进程生命周期与PCB(进程控制块)
本节目标:
- 进程状态变迁
- 进程控制块
- 进程创建
- 进程撤消
- 终止进程的五种方法
一,进程状态变迁
进程的三种基本状态
就绪(Ready)状态
当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。
执行(Running)状态
当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。
阻塞(Blocked)状态
正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。
状态转换图:
一个进程在运行期间,不断地从一种状态转换到另一种状态,它可以多次处于就绪状态和执行状态,也可以多次处于阻塞状态。
(1) 就绪→执行
处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成执行状态。
(2) 执行→就绪
处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完或更高优先级的进程抢占而不得不让出处理机,于是进程从执行状态转变成就绪状态。
(3) 执行→阻塞
正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。
(4) 阻塞→就绪
处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。
(5) 运行→终止
程序执行完毕,撤销而终止
以上是最经典也是最基本的三种进程状态,但现在的操作系统都根据需要重新设计了一些新的状态。
如linux:
- 运行状态(TASK_RUNNING):是运行态和就绪态的合并,表示进程正在运行或准备运行,Linux 中使用TASK_RUNNING 宏表示此状态
- 可中断睡眠状态(浅度睡眠)(TASK_INTERRUPTIBLE):进程正在睡眠(被阻塞),等待资源到来是唤醒,也可以通过其他进程信号或时钟中断唤醒,进入运行队列。Linux 使用TASK_INTERRUPTIBLE 宏表示此状态。
- 不可中断睡眠状态(深度睡眠状态)(TASK_UNINTERRUPTIBLE):
- 暂停状态(TASK_STOPPED):进程暂停执行接受某种处理。如正在接受调试的进程处于这种状态,Linux 使用TASK_STOPPED 宏表示此状态。
- 僵死状态(TASK_ZOMBIE):进程已经结束但未释放PCB,Linux 使用TASK_ZOMBIE 宏表示此状态
其和浅度睡眠基本类似,但有一点就是不可被其他进程信号或时钟中断唤醒。Linux 使用TASK_UNINTERRUPTIBLE 宏表示此状态。
状态转换图如下:
就绪态在支持虚拟内存的操作系统中可能分为:在内存中就绪和在交换空间就绪,因为支持虚拟内存的操作系统会将当前不太活跃的一些进程交换到交换空间,交换空间就绪进程要运行要先换人内存出入内存就绪态,在由cpu调度执行。
二,进程控制块(PCB)
进程控制块包括:
进程描述信息:
- 进程标识符用于唯一的标识一个进程(pid,ppid)。
进程控制信息:
- 进程当前状态
- 进程优先级
- 程序开始地址
- 各种计时信息
- 通信信息
资源信息:
- 占用内存大小及管理用数据结构指针
- 交换区相关信息
- I/O设备号、缓冲、设备相关的数结构
- 文件系统相关指针
现场保护信息(cpu进行进程切换时):
- 寄存器
- PC
- 程序状态字PSW
- 栈指针
进程标识:PID
- 每个进程都会分配到一个独一无二的数字编号,我们称之为“进程标识”(process identifier),或者就直接叫它PID.
- 是一个正整数,取值范围从2到32768
可以通过:cat /proc/sys/kernel/pid_max 查看系统支持多少进程
- 当一个进程被启动时,它会顺序挑选下一个未使用的编号数字做为自己的PID
- 数字1一般为特殊进程init保留的
init进程实际上是用户进程,它是一个程序,在/sbin/init,linux启动的第一个进程
实际上linux中还存在0号进程(内核进程),它是一个空闲进程,它进行空闲资源的统计及交换空间的换入换出,1(init)进程是由0号进程创建的。
三,进程创建
- 不同的操作系统所提供的进程创建原语的名称和格式不尽相同,但执行创建进程原语后,操作系统所做的工作却大致相同,都包括以下几点:
- 给新创建的进程分配一个内部标识(pcb),在内核中建立进程结构。
- 复制父进程的环境
- 为进程分配资源, 包括进程映像所需要的所有元素(程序、数据、用户栈等),
- 复制父进程地址空间的内容到该进程地址空间中。
- 置该进程的状态为就绪,插入就绪队列。
四,进程撤销
进程终止时操作系统做以下工作:
- 关闭软中断:因为进程即将终止而不再处理任何软中断信号;
- 回收资源:释放进程分配的所有资源,如关闭所有已打开文件,释放进程相应的数据结构等;
- 写记帐信息:将进程在运行过程中所产生的记帐数据(其中包括进程运行时的各种统计信息)记录到一个全局记帐文件中;
- 置该进程为僵死状态:向父进程发送子进程死的软中断信号,将终止信息status送到指定的存储单元中;
- 转进程调度:因为此时CPU已经被释放,需要由进程调度进行CPU再分配。
五,终止进程的五种方法
- 从main函数返回:从return返回,执行完毕退出
- 调用exit:C函数库,实际上也是调用系统调用_exit完成的,在任何一个函数调用exit函数都可使得进程撤销
- 调用_exit:系统调用
- 调用abort:调用abort()函数使得进程终止,实际上该函数是产生一个SIGABRT信号,
- 由信号终止:发送一些信号如SINGINT等信号