linux系统编程之进程(二):进程生命周期与PCB(进程控制块)

本节目标:linux

  • 进程状态变迁
  • 进程控制块
  • 进程建立
  • 进程撤消
  • 终止进程的五种方法

一,进程状态变迁

进程的三种基本状态数据结构

就绪(Ready)状态ide

当进程已分配到除CPU之外的全部必要的资源,只要得到处理机即可当即执行,这时的进程状态称为就绪状态。函数

执行(Running)状态
当进程已得到处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。操作系统

阻塞(Blocked)状态
正在执行的进程,因为等待某个事件发生而没法执行时,便放弃处理机而处于阻塞状态。引发进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能知足、等待信件(信号)等。设计

状态转换图:指针

211321570

一个进程在运行期间,不断地从一种状态转换到另外一种状态,它能够屡次处于就绪状态和执行状态,也能够屡次处于阻塞状态。调试

(1) 就绪→执行
处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成执行状态。blog

(2) 执行→就绪
处于执行状态的进程在其执行过程当中,因分配给它的一个时间片已用完或更高优先级的进程抢占而不得不让出处理机,因而进程从执行状态转变成就绪状态。队列

(3) 执行→阻塞
正在执行的进程因等待某种事件发生而没法继续执行时,便从执行状态变成阻塞状态。

(4) 阻塞→就绪
处于阻塞状态的进程,若其等待的事件已经发生,因而进程由阻塞状态转变为就绪状态。

(5) 运行→终止

程序执行完毕,撤销而终止

 

以上是最经典也是最基本的三种进程状态,但如今的操做系统都根据须要从新设计了一些新的状态。

如linux:

  • 运行状态(TASK_RUNNING):是运行态和就绪态的合并,表示进程正在运行或准备运行,Linux 中使用TASK_RUNNING 宏表示此状态
  • 可中断睡眠状态(浅度睡眠)(TASK_INTERRUPTIBLE):进程正在睡眠(被阻塞),等待资源到来是唤醒,也能够经过其余进程信号或时钟中断唤醒,进入运行队列。Linux 使用TASK_INTERRUPTIBLE 宏表示此状态。
  • 不可中断睡眠状态(深度睡眠状态)(TASK_UNINTERRUPTIBLE):
  • 其和浅度睡眠基本相似,但有一点就是不可被其余进程信号或时钟中断唤醒。Linux 使用TASK_UNINTERRUPTIBLE 宏表示此状态。

  • 暂停状态(TASK_STOPPED):进程暂停执行接受某种处理。如正在接受调试的进程处于这种状态,Linux 使用TASK_STOPPED 宏表示此状态。
  • 僵死状态(TASK_ZOMBIE):进程已经结束但未释放PCB,Linux 使用TASK_ZOMBIE 宏表示此状态

状态转换图以下:

QQ截图20130712103012


      就绪态在支持虚拟内存的操做系统中可能分为:在内存中就绪和在交换空间就绪,由于支持虚拟内存的操做系统会将当前不太活跃的一些进程交换到交换空间,交换空间就绪进程要运行要先换人内存出入内存就绪态,在由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等信号
相关文章
相关标签/搜索