进程(Process) 的定义
从不同的角度,进程可以有不同的定义,传统典型的定义:
进程是程序的一次执行过程。 或者:一个正在执行的程序的实例
进程是一个程序及其数据在处理机上顺序执行所发生的活动
进程是具有独立功能的程序在数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位
通过htop命令显示的进程列表
进程和程序的关系
进程是一个动态概念,程序是一个静态概念。
进程具有并发特征,程序没有(程序全部是顺序的)。
进程是竞争资源的基本单位。
一个程序对应多个进程,一个进程为多个程序服务。进程的状态(State)
创建(New): 进程正在被建立的阶段。
就绪(Ready):当进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行,进程这时的状态称为就绪状态。在一个系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列
运行(Running):进程占有CPU,并在CPU上运行指令。
等待/阻塞(Waiting /blocked):正在执行的进程由于发生某事件而暂时无法继续执行时,便放弃处理机而处于暂停状态,亦即进程的执行受到阻塞,把这种暂停状态称为阻塞状态,也称为等待状态或封锁状态。致使进程阻塞的典型事件有:请求I/O,申请缓冲空间等。通常将这种处于阻塞状态的进程也排成一个队列。有的系统则根据阻塞原因的不同而把处于阻塞状态的进程排成多个队列。
终止(Terminated):进程已经完成了执行。
进程的五种基本状态及转换进程控制块(PCB)
进程控制块(Process Control Block PCB) 是操作系统核心中一种数据结构,用来表示进程状态,记录进程的外部特征,描述进程的运动变化过程。同时,操作系统可以利用PCB来控制和管理进程。
一般情况下,PCB中包含以下内容:标识信息:
用于存放唯一标识该进程的信息。系统分配的标识号、系统分配的进程组标识号、用户定义的进程名、用户定义的进程组名。现场信息:
用于存放该进程运行时的处理器现场信息。用户可见寄存器内容:数据寄存器、地址寄存器、控制与状态寄存器内容:PC(程序计数器)、IR(指令寄存器)、PSW(程序状态字)。栈指针内容:核心栈与用户栈指针控制信息:
用于存放与管理、调度进程相关的信息。调度相关信息:状态、等待事件/原因、优先级。进程组成信息:代码/数据地址、外存映像地址。进程队列指引元:进程队列指针、父子兄弟进程指针。
进程通信相关信息:消息队列、信号量、锁。进程处理器使用信息:占用的处理器、时间片、处理器使用时间/已执行总时间、记账信息。进程特权信息:如内存访问权限、处理器特权。进程资源清单信息:如正占有的资源、已使用的资源。
进程控制块PCB
PCB的作用
PCB 可以被操作系统中的多个模块读或修改,如被调度程序、资源分配程序、中断处理程序以及监督和分析程序等读或修改。 操作系统是根据 PCB来对并发执行的进程进行控制和管理的,它是操作系统中最重要的记录型数据结构。
Linux系统中PCB结构用 task_struct 数据结构, Windows系统的PCB:EPROCESS,
PCB使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位, 一个能与其它进程并发执行的进程。进程的组成
PCB、程序段、数据段组成了进程实体,也叫进程映像。一般情况下,我们把进程实体就简称为进程,所谓创建进程,实质上创建进程实体中的PCB;而撤销进程,实质上就是撤销进程实体中的PCB。进程上下文(context)
除了进程实体(进程映像),进程的执行还需要环境支持,包括CPU现场和Cache中的执行信息, 操作系统中的进程物理实体(代码和数据等)和支持进程运行的环境合成进程上下文,用于刻画进程的执行情况,进程在当前上下文中运行。
在前面的操作系统基础4我们已经说过关于CPU的内核模式与用户模式。在操心系统基础6也已经说过关于中断。 正是有了不同运行状态的划分,才有了上下文的概念。
用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递很多变量、参数的值给内核,内核模式运行的时候也要保存用户进程的一些寄存器值、变量等。所谓的“进程上下文”,可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。
硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。所谓的“中断上下文”,其实也可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被打断执行的进程环境)。
进程上下文可以划分为:
(1)用户级上下文:用户程序块/用户数据区/用户堆栈/用户共享内存组成的用户空间信息
(2)寄存器上下文:即进程的现场信息,包括PSW/栈指针/通用寄存器。
(3)系统级上下文:由进程控制块(进程的状态)、内存管理信息(进程页表或段表)和系统核心栈(进程内核态运行时的工作区)等操作系统管理进程需要的信息。
用户级上下文地址空间和系统级上下文地址空间一起构成了一个进程的整个存储器映像。进程的组织方式
把处于同一状态的所有进程的PCB链接在一起的数据结构称为进程队列,有两种常用的队列组织方式:
(1)链接方式:即把具有相同状态的进程的PCB分别通过链接指针连接成一个队列,系统为每个队列设置队列标志以便标识和识别队列。这样,可以形成就绪队列、若干个阻塞队列和空白队列等。对其中的就绪队列常按进程优先级的高低排列,把优先级高的进程的 PCB 排在队列前面。此外,也可根据阻塞原因的不同而把处于阻塞状态的进程的 PCB 排成等待 I/O 操作完成的队列和等待分配内存的队列等。
(2)索引方式:系统根据所有进程的状态建立几张索引表。例如,就绪索引表、阻塞索引表等,并把各索引表在内存的首地址记录在内存的一些专用单元中。在每个索引表的表目中,记录具有相应状态的某个 PCB 在 PCB 表中的地址。
进程控制
进程控制对应的进程队列模型
进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。
简化理解:进程控制就是要实现进程状态的转换。
进程创建:进程列表加一项,申请PCB并初始化,分配唯一进程标识符,建立映像,分配资源,移入就绪队列
进程撤销:从队列中移除,归还资源,撤销标识符,回收PCB,移除进程表项(先要撤销子进程)
进程阻塞:保存现场信息,修改PCB,移入等待队列,转向进程调度程序调度其它进程执行
进程唤醒:等待队列中移出,修改PCB,移入就绪队列(该进程优先级高于运行进程,则重新设置调度标志)
队列管理模块是操作系统实现进程控制管理的核心模块。进程与资源调度围绕进程队列展开。
操作系统建立多个进程队列,如只有一个进程的运行队列、按照优先级或FCFS排列的就绪队列、等待I/O操作完成的队列、等待信号量的队列等。按需组织为先进先出队列与优先队列
当发生某个事件使进程状态发生转换时,此进程退出所在队列进入另一个队列。
原语:用原语实现进程控制。原语的特点是执行期间不允许中断,只能一气呵成。这种不可中断的操作即原子操作。原语采用“关中断”指令和“开中断指令”实现。关中断指令执行后,外部中断信号将被忽略,直到开中断执行。
进程控制会导致进程状态的转换。原语要做的三类事情:
1. 更新PCB中的信息(如修改进程状态标志、将运行环境保存到PCB、从PCB恢复运行环境)
a. 所有的进程原语一定都会修改进程状态标志
b. 剥夺当前运行进程的CPU使用权必然需要保存其运行环境
c. 某进程开始运行前必然要恢复其运行环境。
2. 将PCB插入合适的队列
3. 分配/回收资源