进程

1.进程的定义

进程是操作系统中最重要、最基本的概念。目前没有对进程的统一的定义。一般认为,进程是一个可并发执行的具有独立功能的程序关于某个数据结合的一次执行过程,也是操作系统进行资源分配和保护的基本单位

进程具有多种属性:

  • 结构性:进程是程序在某个数据集合上的执行过程,会配置一个进程控制块来描述和记录进程的动态变化过程。每个进程至少由程序块、数据块和进程控制块组成。
  • 共享性:同一个程序可以同时运行在不同的数据集合上。(也就是说,进程和程序并不是一一对应的
  • 动态性:由定义可知,进程是程序在数据集合上的执行过程,因此是一个动态过程,具有生命周期,会消亡;而程序是静态的,作为一种系统资源一直保留在系统中。
  • 独立性:由定义可知,是操作系统进行资源分配和保护的基本单位。
  • 制约性:并发进程之间存在相互制约关系,在存在共享资源或者关键点上需要互相等待或者互通消息。
  • 并发性:进程可以并发执行,m个进程可能轮流占用处理器并发的执行。(注意并发和并行:并发是指两个或多个事件在同一时间间隔发生,是在同一实体上的多个事件;并行是指两个或者多个事件在同一时刻发生,是在不同实体上的多个事件)

2.进程的状态和转换

由进程的定义和属性可知,进程具有动态性,从进程创建开始,到进程执行过程,到进程被销毁,进程存在不同的状态和各个状态之间的转换。

2.1.三态模型

  • 就绪态(Ready):进程具备运行条件,等待系统分配处理器以便运行。一个进程在创建后就处于就绪状态。
  • 运行态(Running):进程占有处理器正在运行。
  • 等待态(Wait): 也称为阻塞(Blocked)或睡眠(Sleep)态,指进程不具备运行条件,正在等待某个事件的发生或者完成。

一个进程只能处于上述3中状态其中之一,各个状态间会由于某种原因进行切换:

  • 运行态-->等待态:等待使用某资源或某事件发生,如等待IO信号、等待数据传送到。
  • 等待态-->就绪态:资源得到满足或者某事件已经发生,如IO信号产生、等待的数据已经传送到。
  • 运行态-->就绪态:运行时间片到,或者优先级别更高的进程获得了CPU。
  • 就绪态-->运行态:CPU空闲选中一个就绪态进程运行。

2.2.五态模型

 实际系统里进程状态比三态模型更复杂,增加了新建台(New)和终止态(Exit)。

  • 新建态(New):进程刚刚被创建的状态,创建一个新进程,首先需要创建必要的关系信息,然后让其进入就绪态。
  • 终止态(Exit):一个进程达到了自然结束点(出现不可克服的错误、被OS终结、被其他进程终结等)

进程在五态之间的转换:

  • NULL-->新建态:执行一个程序,创建一个子进程。
  • 新建态-->就绪态:OS完成了进程创建的必要操作,且当前系统性能和内存容量允许。
  • 运行态-->终止态:进程达到自然结束点、或出现了不可克服的错误、或被OS终结、或被其他进程终结等。
  • 终止态-->NULL:OS完成后续处理工作,如其他进程完成对终止态进程信息的提取、OS删除该进程。
  • 就绪态-->终止态:父进程终止子进程。
  • 等待态-->终止态:父进程终止子进程。

2.3.具有挂起功能系统的进程状态

由于进程的不断创建,系统的资源和内存容量已不能满足运行进程的需求,此时需要把某些进程挂起Suspend),对换到磁盘镜像区中,释放它所占有的某些资源,暂时不参与低级调度,起到平滑系统操作负荷的目的。也可能是由于系统出现故障,需要暂时挂起一部分进程,故障消除后再接触挂起并回复进程运行。进程挂起可能的原因有:

  • 进程竞争资源,导致系统资源不足,此时需要挂起部分进程;
  • 把一些定期执行的进程(如监控程序)对换出去以减轻系统负荷;
  • 用户要求挂起自己的进程(调试、检查等);
  • 父进程要求挂起子进程;
  • OS需要挂起某些进程,检查运行中资源使用情况,或系统出现故障时需要挂起某些进程以消除故障。

 状态转换过程:

  • 等待态-->挂起等待态:如果当前不存在就绪进程,那么,至少有一个等待态进程将被对换出去成为挂起等待态;操作系统根据当前资源状况和性能要求,可以决定把等待态进程对换出去成为挂起等待态。
  • 挂起等待态-->挂起就绪态:引起进程等待的事件发生之后,挂起等待态进程将转换为挂起就绪态。
  • 挂起就绪态-->就绪态:当内存中没有就绪态进程,或者挂起就绪态进程具有比就绪态进程更高的优先级,OS将把挂起就绪态进程调回主存并转换成就绪态。
  • 就绪态-->挂起就绪态:OS根据当前资源状况和性能要求,把就绪态进程对换出去成为挂起就绪态。
  • 挂起等待态-->等待态:当一个进程等待一个事件时,原则上不需要把它调入内存。但是在下面一种情况下,这一状态变化是可能的。当一个进程退出后,主存已经有了足够的自由空间,而某个挂起等待态进程具有较高的优先级并且操作系统已经得知导致它阻塞的事件即将结束,便可能发生这一状态变化。
  • 运行态-->挂起就绪态:一个具有较高优先级的挂起等待态进程的等待事件结束后,需要抢占 CPU,而此时主存空间不够,从而,可能导致正在运行的进程转化为挂起就绪态。另外,处于运行态的进程也可以自己挂起自己。
  • 新建态-->挂起就绪态:考虑到系统当前资源状况和性能要求,可以决定新建的进程将被对换出去成为挂起就绪态。

3.进程的描述

3.1.OS的控制结构

OS通过一组控制表来掌握每一个进程和资源的当前状态。控制表包括:

  • 进程控制表:管理进程及其相关信息;
  • 存储控制表:管理主存储器和辅存储器的分配信息、存储保护和分区共享信息、虚拟存储器管理信息;
  • I/O控制表:管理计算机系统的IO设备和通道(是否可用、IO分配信息、IO操作的状态进展等);
  • 文件控制表:管理文件(被打开文件的信息、文件在存储器中的位置、文件状态等)。

3.2.进程的内存映像和进程控制块(Process Control Block,PCB)

一个程序进入主存储器进行计算就构成了进程。OS把进程物理实体和其运行环境称为进程上下文Process Context)。一个进程状态转换、OS切换进程时,进程上下文都会改变,可以认为,进程的运行是在上下文中执行的。OS中,进程上下文分为:

  • 用户级上下文(user-level context):由用户进程的程序块、用户数据块(含共享数据块)和用户堆栈组成的进程地址空间。
  • 系统级上下文(system-level context):包括进程的标识信息、现场信息和控制信息,进程环境块,以及系统堆栈等组成的进程地址空间。
  • 寄存器上下文(register-level context):由程序状态字寄存器、各类控制寄存器、地址寄存器、通用寄存器、用户栈指针等组成。

进程的组成可以用进程映像(Process Image)来描述,一个进程映像包括:

  • 进程程序块:被执行的程序,纯代码,作为系统资源可被多个进程共享;
  • 进程数据块:程序的加工处理对象,全局变量、局部变量、常量等;
  • 系统/用户堆栈:解决进程调用或系统调用时信息存储和参数传递;
  • 进程控制块:存储进程标识信息、现场纤细和控制信息。进程撤销时,回收进程控制块。

进程控制块是OS记录和描述进程状态及相关信息的数据结构,也是OS掌握和管理进程的唯一资料结构和依据。进程控制块包括:

  • 标识信息:唯一标识一个进程。
  • 现场信息:保留一个进程在运行时存放在处理器现场中的各种信息,任何一个进程在让出处理器时必须把此时的处理器现场信息保存到进程控制块中,而当该进程重新恢复运行时也应恢复处理器现场。常用的现场信息包括:通用寄存器的内容、控制寄存器(如 PSW 寄存器)的内容、用户堆栈指针、系统堆栈指针等。
  • 控制信息:用于管理和调度一个进程。常用的控制信息包括: 1)进程调度相关信息,如进程状态、等待事件和等待原因、进程优先级、队列指引元等; 2)进程组成信息,如正文段指针、数据段指针; 3)进程间通信信息,如消息队列指针、信号量等互斥和同步机制; 4)进程在辅存储器内的地址; 5) CPU资源的占用和使用信息,如时间片余量、进程己占用 CPU 的时间、进程己执行的时间总和,记账信息; 6)进程特权信息,如在内存访问权限和处理器状态方面的特权; 7)资源清单,包括进程所需全部资源、已经分得的资源,如主存资源、 I/O 设备、打开文件表等。

4.进程的管理

4.1.进程队列Process Queues

OS中同时存在多个进程,每个进程可能处于不同的状态,进程的主要特征由PCB来刻画。OS把处于同一状态(如运行态)的所有PCB链接在一起,组成一个进程队列Process Queues)。对于都是运行态的PCB还可以细分,比如进入运行态的原因等。进程队列中,可通过单向链接或双向链接的方式连接前后队列。当队列中某个进程控制块被回收,或者新加入一个进程控制块,OS对进程队列的操作类似于在队列数据结构中删除或插入一个节点。一个进程进入到一个指定队列的事件叫“入队”,对应着,一个进程从一个所在的队列中退出的事件称为“出队”。

4.2.进程切换和模式切换

中断是激活OS的唯一方法,它暂时中止当前运行进程的执行,把处理器切换到OS的控制之下。而当OS获得了处理器的控制权之后,它就可以实现进程切换。所以,进程切换必定在核心态而不是在用户态下发生。当发生中断事件,或进程执行系统调用后,有可能引发内核进行进程上下文切换,由于一个进程让出处理器时,其寄存器上下文将被保存到系统级上下文的相应的现场信息位置,这时内核就把这些信息压入系统栈的一个上下文层。当内核处理中断返回,或一个进程完成其系统调用返回用户态,或内核进行上下文切换时,内核就从系统栈弹出一个上下文层( context layer)。因此,上下文的切换总会引起上下文的压入和弹出堆栈。在进程进入等待态、或当进程完成系统调用返回用户态但尚不能获得CPU时、或当进程执行结束时、或当内核完成中断处理进程返回用户态但尚没有资格获得CPU时,内核允许发生上下文切换。

上下文切换的过程如下:

  • 保存被中断进程的处理器现场信息。
  • 修改被中断进程的进程控制块的有关信息,如进程状态等。
  • 把被中断进程的进程控制块加入有关队列。
  • 选择下一个占有处理器运行的进程。
  • 修改被选中进程的进程控制块的有关信息。
  • 根据被选中进程设置操作系统用到的地址转换和存储保护信息。
  • 根据被选中进程的信息来恢复处理器现场。

模式切换指的是从用户态到内核态或从内核态到用户态的转变,是CPU模式的改变,而不是进程上下文的改变。当中断发生
的时候,暂时中断正在执行的用户进程,把进程从用户状态切换到内核状态,去执行操作系统例行程序以获得服务,这就是一次模式切换,注意,此时仍在该进程的上下文中执行,仅仅模式变了。被中断的进程可以是正在用户态下执行的,也可以是正在核心态下执行的,内核都要保留足够信息以便在后来能恢复被中断了的进程执行。内核在核心态下对中断事件进行处理时,决不会再产生或调度一个特殊进程来处理中断事件。模式切换的步骤如下:

  • 保存被中断进程的处理器现场信息。
  • 根据中断号置程序计数器。
  • 把用户状态切换到内核状态,以便执行中断处理程序。

模式切换不同于进程切换,它不会导致进程状态的变化,大多数情况下也不会引起进程切换。大多数现代操作系统存在两种进程:系统进程和用户进程。它们并不是指两个具体的进程实体,而是指一个进程的两个侧面,系统进程是在核心态下执行操作系统代码的进程,用户进程在用户态下执行用户程序的进程。用户进程因中断或系统调用进入内核态,系统进程就开始执行,这两个进程(用户进程和系统进程)使用同一个PCB,所以,实质上是一个进程实体。但是这两个进程所执行的程序不同,映射到不
同物理地址空间、使用不同堆栈。

 5.进程的控制

处理器管理的工作之一是对进程的控制(创建进程、阻塞进程、挂起进程、唤醒进程、终止进程、撤销进程等)。这些控制功能是由操作系统中的原语Primitive)来实现的。原语(Primitive)是在管态下执行、完成系统特定功能的过程。原语和机器指令类似,其特点是执行过程中不允许被中断,是一个不可分割的基本单位,原语的执行是顺序的而不可能是并发的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冯Jungle

您的支持是对我最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值