天天看点

操作系统原理第三章:进程1 进程概念2 进程状态3 进程控制块PCB4 操作系统调度5 进程操作6 创建进程7 进程通信:共享存储8 进程通信:消息传递

目录

  • 1 进程概念
    • 1.1 顺序执行环境
    • 1.2 并发执行环境
    • 1.3 进程的定义
  • 2 进程状态
  • 3 进程控制块PCB
    • 3.1 进程控制块PCB中的内容
    • 3.2 PCB的组织方式
  • 4 操作系统调度
  • 5 进程操作
  • 6 创建进程
  • 7 进程通信:共享存储
  • 8 进程通信:消息传递

1 进程概念

操作系统的基本特性是并发与共享,即在系统中同时存在几个相互独立的程序,他们交叉地运行,并共享资源,在这样的过程中就会出现诸多问题,比如多个程序就要进行资源的竞争,程序之间的合作和协同,程序之间的通信,要解决这些问题 , 用程序的概念已经不能描述程序在内存中运行的状态 ,必须引入新的概念进程。

1.1 顺序执行环境

顺序环境计算机系统只有一个程序在运行,该程序独占系统中所有资源,其执行不受外界影响,下图是顺序执行的两个作业的执行过程图:

操作系统原理第三章:进程1 进程概念2 进程状态3 进程控制块PCB4 操作系统调度5 进程操作6 创建进程7 进程通信:共享存储8 进程通信:消息传递

顺序执行的特征:

  • 顺序性:按照程序结构所指定的次序(可能有分支或循环);
  • 封闭性:独占系统的资源;
  • 可再现性:初始条件相同则结果相同。如:可通过空指令控制时间关系。

1.2 并发执行环境

并发环境一定时间内,物理机器上有两个或两个以上的程序同处于开始运行但尚未结束的状态,并且次序不是事先确定的,如下图所示:

操作系统原理第三章:进程1 进程概念2 进程状态3 进程控制块PCB4 操作系统调度5 进程操作6 创建进程7 进程通信:共享存储8 进程通信:消息传递

并发执行的特征:

  • 间断(异步)性:“走走停停”,一个程序可能走到中途停下来,失去原有的时序关系;
  • 失去封闭性:共享资源,受其他程序的控制逻辑的影响。如:一个程序写到存储器中的数据可能被另一个程序修改,失去原有的不变特征;
  • 失去可再现性:失去封闭性导致失去可再现性;外界环境在程序的两次执行期间发生变化,失去原有的可重复特征。
例如:观察者/报告者,有两个循环程序A和B,它们共享一个变量N。程序A每执行一次时都要做

N=N+1

操作;程序B每执行一次时,都要做

print(N)

操作,然后再将N置成“0”,程序A和B以不同的速度运行。可能出现多报或漏报。(假定某时刻变量N的值为5)
  • 程序执行为A->B:

    N=N+1

    print(N)

    N=0

    之前,

    N=6,N=6,N=0

  • 程序执行为B->A:

    N=N+1

    print(N)

    N=0

    之后,

    N=5,N=0,N=1

  • 程序执行为B->A->B:

    N=N+1

    print(N)

    N=0

    之间,

    N=5,N=6,N=0

因此多道程序设计对操作系统提出了新的要求:

  • 如何描述并发程序的执行:引入进程及其状态;
  • 如何实现并发程序运行:进程控制与调度;
  • 如何处理资源的竞争与程序间的合作:并发控制与通信;
  • 如何解决死锁:死锁策略。

1.3 进程的定义

为了描述程序在并发执行时对系统资源的共享,我们需要一个描述程序执行时动态特征的概念,这就是进程,一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程,相比程序,程序是一个静态的实体,而进程是一个动态的实体,引入多进程,提高了对硬件资源的利用率,但又带来额外的空间和时间开销,增加了操作系统的复杂性

一个进程包括如下内容:

  • 程序代码(Program code);
  • 当前活动(Current activity);
  • 相关数据(Related data):栈、堆、数据段,栈通常是一些临时数据,如函数参数,返回地址,局部变量等,堆通常是程序运行时申请的动态内存,数据段通常是全局变量。

进程和程序的区别:

  • 进程是动态的,程序是静态的:程序是有序代码的集合;进程是程序的执行。通常进程不可在计算机之间迁移;而程序通常对应着文件、静态和可以复制;
  • 进程是暂时的,程序是永久的:进程是一个状态变化的过程,程序可长久保存;
  • 进程与程序的组成不同:进程的组成包括程序、数据和进程控制块(即进程状态信息);
  • 进程与程序的对应关系:通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。

进程的特征:

  • 结构特征:进程实体=程序段+相关的数据段+PCB;
  • 动态性:进程的实质是进程实体的一次执行过程,因此动态性是进程的最基本的特征;
  • 并发性:多个进程实体同存在于内存中,且能在一段时间内同时运行。是最重要的特征;
  • 独立性:指进程实体是一个能独立运行、独立分配资源和独立接受调度的基本单位;
  • 异步性:进程按各自独立的、不可预知的速度向前推进。

进程描述信息:

  • 处于某种状态(运行、就绪、等待);
  • 进程控制块PCB(数据结构);
  • 进程的执行程序(一个可执行文件);
  • 进程位于某个队列(就绪、等待某事件队列);
  • 占用某些系统资(内存,打开某些文件、处理机、外设)。

2 进程状态

进程在执行时,会不断地改变其状态,进程有以下的状态:

  • 新建(new):创建进程,构造了进程标识符,创建了 管理进程所需的表格;
  • 就绪(ready):进程等待分配处理器,存在于处理机调度队列中的那些进程,它们已经准备就绪,一旦得到CPU,就立即可以运行(有多个进程处于此状态),如进程所分配的时间片用完后,会用运行状态转换为就绪状态,等待下一次分配时间片;
  • 运行(running):指令在执行,当进程由调度/分派程序分派后,得到CPU控制权,它的程序正在运行(在系统中,总只有一个进程处于此状态);
  • 等待(waiting):进程等待某些事件发生,进程正在等待某个事件的发生(如等待I/O的完成),而暂停执行即使给它CPU时间,它也无法执行;
  • 终止(terminated):进程执行完毕,终止后进程移入该状态,它不再有执行资格,表格和其它信息暂时由辅助程序保留,如为处理用户帐单而累计资源使用情况的帐务程序,当数据不再需要后,进程(和它的表格)被删除。

各个状态之间的转换关系如下图所示:

操作系统原理第三章:进程1 进程概念2 进程状态3 进程控制块PCB4 操作系统调度5 进程操作6 创建进程7 进程通信:共享存储8 进程通信:消息传递

3 进程控制块PCB

上面说到进程有多种状态,但操作系统该如何知晓当前进程的状态呢,所以我们要把进程的状态保存下来,这里就引入了一种描述进程信息的数据结构-进程控制块PCB(Process Control Block):

  • PCB (Process Control Block)一个专门的数据结构,系统用它来记录进程的外部特征,描述进程的运动变化过程;
  • PCB是进程管理和控制的最重要的数据结构,在创建进程时,建立PCB,并伴随进程运行的全过程,直到进程撤消而撤消,跟随进程的生命周期;
  • PCB是系统感知进程存在的唯一标志,进程与PCB是一一对应的,有一个进程就会有一个PCB,有一个PCB就会有一个进程;
  • PCB经常被系统访问,如,调度程序、资源分配程序、中断处理程序等,所以PCB应常驻内存。

3.1 进程控制块PCB中的内容

进程控制块PCB保存了同进程有关的信息,一般有下面这些必要内容:

  • 进程状态(Process state):说明进程当前所处的状态;
  • 程序计数器(Program counter):指向执行程序的下个指令的地址;
  • CPU寄存器(CPU registers):当进程因某种原因不能继续占用CPU时(如:等待打印机),释放CPU,这时就要将CPU的各种状态信息保护起来,为将来再次得到处理机恢复CPU的各种状态,继续运行;
  • CPU调度信息(CPU scheduling information):包括CPU优先级,调度队列指针等;
  • 内存管理信息(Memory-management information):包括基址寄存器,界限寄存器以及页表或段表等;
  • 计账信息(Accounting information):包括CPU时间,实际使用时间,作业或进程数量等;
  • I/O状态信息(I/O status information):包括分配给进程的I/O设备列表,打开文件列表等。
    操作系统原理第三章:进程1 进程概念2 进程状态3 进程控制块PCB4 操作系统调度5 进程操作6 创建进程7 进程通信:共享存储8 进程通信:消息传递

3.2 PCB的组织方式

系统把 PCB 组织在一起,并放在内存的固定区域,就构成了 PCB 表,PCB 表的个数决定了系统中最多可同时存在的进程个数,称为系统的并发度,PCB表的组织方式有两种:

  • 链接方式:一般通过链表的方式;
  • 索引方式:建立索引表。

4 操作系统调度

在操作系统中多个程序并发的执行,但在单CPU机器中只有一个CPU,那么到底由哪一个程序来使用CPU呢,这就是一个调度问题,进程一般会在下面这些队列被调度:

  • 作业队列:在系统中的所有进程的集合;
  • 就绪队列:在主内存中的,就绪并等待执行的所有进程的集合;
  • 设备队列:等待某一I/O设备的进程队列。

其实上面所讲的进程状态的变化,实际上是在这些队列上不停的迁移,如下图所示:

操作系统原理第三章:进程1 进程概念2 进程状态3 进程控制块PCB4 操作系统调度5 进程操作6 创建进程7 进程通信:共享存储8 进程通信:消息传递

下图是进程调度的描述图:

操作系统原理第三章:进程1 进程概念2 进程状态3 进程控制块PCB4 操作系统调度5 进程操作6 创建进程7 进程通信:共享存储8 进程通信:消息传递

在操作系统的调度分为不同级别的调度:

  • 长程调度(或作业调度):选择可以进入就绪队列的进程,也可以说是从外存中选择进入内存的调度过程;
  • 短程调度(或 CPU 调度):选择可被下一个执行并分配 CPU;
  • 中程调度:为了缓和内存紧张的情况,将内存中处于阻塞状态的进程换至外存上( 挂起 ),降低多道程序的度。当这些进程重新具备运行条件时,再从外存上调入内存,如下图所示:
    操作系统原理第三章:进程1 进程概念2 进程状态3 进程控制块PCB4 操作系统调度5 进程操作6 创建进程7 进程通信:共享存储8 进程通信:消息传递

在操作系统中进程可以分为两类:

  • I/O型进程:花费I/O 时间多于计算,许多短CPU处理;
  • CPU 型进程:花费更多时间于计算,许多长CPU处理。

可以试想若是调度选择的大多数都是I/O型进程,少数CPU 型进程,那么各个进程会在CPU上执行短暂的时间后转到 I/O 设备上,此时 I/O 设备就非常的忙碌,而CPU就相对空闲,反之CPU型的进程过多,也会造成CPU的忙碌,而I/O设备的空闲,这显然不是高效的调度方式

当进程在运行中发生了中断,如I/O操作,那么会执行CPU的切换。如下图所示,在切换时要保存当且 P C B 0 PCB_0 PCB0​的信息,然后加入切换的 P C B 1 PCB_1 PCB1​信息,然后运行完成后再恢复 P C B 0 PCB_0 PCB0​的信息:

操作系统原理第三章:进程1 进程概念2 进程状态3 进程控制块PCB4 操作系统调度5 进程操作6 创建进程7 进程通信:共享存储8 进程通信:消息传递

上述切换的过程,我们称为上下文切换,当CPU切换至另一个进程时,系统必须保存旧进程状态并为新进程调入所保留的状态,而上下文切换的时间开销较重;在切换时,系统没有做有用的工作,时间取决于硬件的支持

5 进程操作

  • 进程是有生命周期的:产生、运行、暂停、终止。对进程的这些操作叫进程控制,对进程的操作如下图所示;
  • 进程控制的职责是对系统中进程实施有效的管理,它是CPU管理的一部分(还有进程同步、通信和调度);
  • 当系统允许多进程并发执行时,为了实现共享、协调并发进程的关系,处理机管理必须对进程实行有效的管理。
    操作系统原理第三章:进程1 进程概念2 进程状态3 进程控制块PCB4 操作系统调度5 进程操作6 创建进程7 进程通信:共享存储8 进程通信:消息传递

6 创建进程

进程创建的时机有以下几种:

  • 作业调度:批处理系统中,作业调度程序调度到某个作业以后,就把这个作业装入内存,并分配必要的资源,创建进程,插入就绪队列;
  • 用户登录:在分时系统中,用户在终端键入登录命令后,若是合法用户,系统建立一个进程,并插入就绪队列;
  • 提供服务:用户向系统提出请求后,系统专门建立一个进程为用户服务。如打印请求;
  • 应用请求:应用进程的需要,由它自己创建一个新进程,使新进程以并发运行方式完成特定任务(输入数据并将处理结果输出到表格上)。
一个进程创建之后还可以创建进程,也就是父进程创建子进程,如此轮流创建进程下去,构成一个进程树,典型UNIX系统中的进程树如下图所示:
操作系统原理第三章:进程1 进程概念2 进程状态3 进程控制块PCB4 操作系统调度5 进程操作6 创建进程7 进程通信:共享存储8 进程通信:消息传递
关于资源共享问题,有如下三种情况:
  • 父进程子进程共享所有的资源
  • 子进程共享父进程资源的子集
  • 父进程和子进程无资源共享
关于进程执行问题,有如下两种情况:
  • 父进程和子进程并发执行
  • 父进程等待,直到子进程终止
关于进程地址空间问题,有如下两种情况:
  • 子女复制双亲
  • 子女有一个程序被调入

7 进程通信:共享存储

由生产者-消费者问题讨探进程之间是如何共享存储,生产者-消费者问题是一类问题的抽象,它描述的是一类事物提供另一类事物所需的事物,比如某一个进程提供计算数据,另一个进程负责计算输出结果,不提供数据就无法进行计算输出,此时提供计算数据的进程就是生产者,负责计算输出的进程就是消费者,如下图所示,这个问题抽象出来的数据模型就是共享队列:

操作系统原理第三章:进程1 进程概念2 进程状态3 进程控制块PCB4 操作系统调度5 进程操作6 创建进程7 进程通信:共享存储8 进程通信:消息传递

8 进程通信:消息传递

消息传递是操作系统中的一个机制,能够使进程之间进行消息传递,若P与Q要通信,需要建立通信连接,通过

send/receive

交换消息,通信链路的实现分为两种,一种是物理上的通过电子线路的实现,另一种是逻辑上的实现,我们主要考虑的是逻辑上的实现连接的建立分为两种:

  • 直接通信:进程必须显式的命名,如

    send (P, message)

    向进程P发消息,

    receive(Q, message)

    从进程Q收消息,这种情况下连接自动建立,连接精确的与一对在通信的进程相关,在每一对之间就存在一个连接,连接可以无向,但通常是双向的,这种通信方式的缺点就是收模块化限制,比如某个时候进程P名字被修改,那么所有代码都需要修改;
直接通信也有一个特殊的通信方式就是非对称通信方式(asymmetric communication),也就是说发送消息的时候是显示命名的,但接收消息的时候不指明接收方
  • 间接通信:进程双方不是直接建立连接的,而是通过一个媒介,可以想象成一个信箱或端口,每个信箱都有一个唯一的ID,不管是发送消息还是接收消息,都是通过这个信箱来完成的,如

    send(A, message)

    为向信箱A发送消息,

    receive(A, message)

    为从信箱A接收消息,此时仅当进程共有一个信箱时连接才能建立,连接可同多个进程相关,每一对进程可共享多个通信连接,连接可是无向或双向的,但是为了确定发送者和接受者的唯一性,间接通信允许一个连接最多同2个进程相关,并且只允许一个时刻有一个进程执行接受操作,通过允许系统任意选择接收者,发送者被通知谁是接收者,这样发送方和接收方就被唯一的确定。
相应的对信箱也有对应的操作,如创建新的信箱,通过信箱发送和接收消息,通信结束后销毁信箱等

继续阅读