本章思维导图
2.1 前趋图和程序执行
程序执行有顺序执行方式和并发执行方式,而更好地描述这两种执行方式需要用到前驱图。
2.1.1 前驱图
前驱图(precedence graph)指一个有向无环图(DAG),用于描述进程之间执行的先后顺序。图中每个节点均可表示一个进程或一段程序或一条语句。
程序之间的前驱关系可用“——>”表示。
前驱图中是不允许有循环的。如图(b)中是循环的就是不对的。
2.1.2 程序顺序执行
1 程序的顺序执行
用节点来代表各程序段的操作,I代表输入操作,C代表计算操作,P代表打印操作。
2 程序顺序执行时的特征
顺序性;封闭性;可再现性
2.1.3 程序并发执行
引入多道程序技术,是程序之间可能并发执行。只有不存在前驱关系的程序才能并发执行。
1 程序的并发执行
例如:S1:a:=x+2;S2:b:=y+4;S3:c:=a+b;S4:d:=c+b
由此可看出,S1和S2可并发执行。
2 程序并发执行时的特征
间断性;失去封闭性;不可再现性
2.2 进程的描述
2.2.1 进程的定义与特征
1 进程的定义
PCB:进程控制块,一种专门管理进程的数据结构。
进程实体:简称进程,由程序段、相关的数据段和PCB三部分组成。
进程是程序的执行过程,是系统进行资源分配和调度的一个独立单位。
2 进程的特征
(1)动态性
进程的实质是程序的执行过程,动态性是进程最基本的特征。
(2)并发性
并发性是进程的另一个重要特征。多个进程共存于内存中,且能在一段时间内同时执行。
(3)独立性
(4)异步性(以不可预知的速度向前推进)
2.2.2 进程的基本状态与转换
1 进程的三种基本状态
(1)就绪状态(ready)
进程已处于准备好执行的状态,即进程已分配到除CPU以外的所有必要资源后,只有再次获得CPU即可立即执行。
如果有多个处于就绪态的进程,他们就会排列成一个队列,称为就绪队列。
(2)运行状态(running)
进程获得CPU后其程序正在进行的状态。
(3)阻塞状态(block)
正在执行的进程由于发生某事件而无法继续进行,即进程在执行过程中受到了阻塞。
2 进程三种基本状态间的转换
3 创建状态和终止状态
(1)创建状态。
进程申请一个空白PCB,并向PCB中填写用于控制和管理进程的信息;为进程分配运行时必序的资源;把该进程的状态转换为就绪状态并插入就绪队列中。
(2)终止状态
等待OS进程善后处理;将进程的PCB清零,并将PCB空间返还OS。
阻塞是进程主动请求的,所以没有就绪到阻塞。
运行到阻塞是主动行为;阻塞到运行是被动行为,不受自身控制,故没有。
2.2.3 挂起操作和进程状态的转换
1 挂起操作的引入
终端用户的需要;父进程的需要;负荷调节的需要;OS的需要
挂起作用在某进程时表明该进程处于静止状态。
2 引入挂起操作后3个基本状态间的转换
(1)活动就绪——>静止就绪
进程处于未被挂起的就绪状态,称为活动就绪状态(Readya),此时进程可以被调度。当使用挂起原语Suspend将该进程挂起后,状态就转换为静止就绪状态(Readys),此时进程不可以被调度。
(2)活动阻塞——>静止阻塞
进程处于未被挂起的阻塞状态,称为活动阻塞状态(Blockeda)。当使用挂起原语Suspend将该进程挂起后,状态就转换为静止阻塞状态(Blockeds)。
(3)静止就绪——>活动就绪
处于Readys状态的进程,若用激活原语Active将其激活,则该进程的状态会转换为Readya。
(4)静止阻塞——>活动阻塞
处于Blockeda状态的进程,若用激活原语Active将其激活,则该进程的状态会转换为Blockeds。
3 引入挂起操作后5个基本状态间的转换
(1)NULL——>创建
一个新进程产生时,该进程处于创建状态。
(2)创建——>活动就绪
在当前系统的性能和内存容量均允许的情况下,完成进程创建时,状态会转换为活动就绪。
(3)创建——>静止就绪
在当前系统的性能和内存容量要求不允许的情况下,状态会转换为静止就绪。此时未完成进程创建。
(4)运行——>终止
进程完成任务时,变为终止状态。
2.2.4 进程管理中的数据结构 (PCB)
PCB:管理资源和控制进程的数据结构
1 PCB的作用
(1)作为独立运行基本单位的标志。
(2)实现间断性运行方式。
(3)提供进程管理所需要的信息。
(4)提供进程调度所需要的信息。
(5)实现与其他进程的同步与通信。进程同步时要采用信号量机制,设置同步信号量。
PCB中还具有实现进程通信的区域和通信队列指针。
2 PCB中的信息
(1)进程标识符(PID)
进程标识符用于唯一地标志一个进程。分外部和内部标识符。
外部标识符:由字母和数字组成,由创建者提供。
内部标识符:数字标识符,进程的序号。
(2)处理机状态
处理机状态信息,称为处理机的上下文,主要由处理机的各种寄存器中的内容组成。
通用寄存器:被用户程序访问,用于暂存信息。
指令技术器:存放要访问的下一条指令的地址。
程序状态字寄存器:含状态信息。
用户栈指针寄存器:用于存放进程和系统的调用参数及调用地址。
(3)进程调度信息
进程状态;进程优先级;进程调度所需要的其他信息;事件。
(4)进程控制信息
程序和数据的地址;进程同步和通信机制;资源清单;链接指针(下一个进程的PCB的始址)。
3 PCB的组织方式
(1)线性方式
将系统中所有的PCB都组织在一张线性表中,将该表的起始地址存放在内存的一个专用区域中。该方式实现简单且开销小,但每次查找时都需要扫描整张表,因此适合进程数目不多的系统。
(2)链接方式
通过PCB中的链接字,将具有相同状态的进程的PCB分别链接成一个队列。这样即可形成就绪队列、若干个阻塞队列和空闲队列等。对就绪队列而言,其往往会按进程的优先级将PCB从高到低进行排列,即将优先级高的进程的PCB排在队列的前面。
(3)索引方式
系统根据所有进程状态的不同,建立几张索引表,如就绪索引表、阻塞索引表等,并把各索引表在内存中的起始地址记录在内存的一些专用单元中。在每个索引表的表目中,记录具有相应状态的某个PCB在PCB表中的地址。
2.3 进程控制
进程控制是进程管理中最基本的功能。
2.3.1 进程的创建
1 进程的层次结构
在OS中,允许一个进程创建另一个进程,通常把创建进程的进程称为父进程,而把被创建的进程成为子进程。子进程可以继续创建其自己的子进程(父进程的孙进程),由此形成了进程的层次结构。
在UNIX系统中,就存在进程层次结构。但在Windows系统中无进程层次结构,所有进程都是相同的地位。
在一个进程创建了另一个进程后,创建进程获得一个句柄,相当于一个令牌,用来控制被创建的进程。
2 进程图
3 进程创建的条件
引起进程创建的基本事件有4类:用户登录,作业调度,提供服务,应用请求(但这个是自己创建自己的进程)。
4 进程的创建
步骤(四个原语):
(1)申请空白PCB。为新进程申请一个唯一的数字标识符,并从PCB集合中索取一个空白PCB。
(2)为新进程分配其运行所需的资源。
(3)初始化PCB。
(4)如果进程就绪队列能够接纳新进程,就将新进程插入就绪队列。
2.3.2 进程的终止
1 进程终止的条件
(1)正常结束(用户交互界面右(左)上角点×关闭)
在批处理系统中,会在程序的最后安排一条Holt指令,用于表示OS运行结束。
在分时系统中,用户可利用Logs off表示进程运行完毕(中断)。
(2)异常结束(电脑蓝屏死机)
常见异常事件有:越界错;保护错;指令错;特权指令错;运行超时;等待超时;算术运算错;I/O错。
(3)外界干预(任务管理器)
操作员或OS干预;父进程请求;父进程终止。
2 进程的终止
步骤(五个原语):
①PCB集合中检索出该进程的PCB:并从该进程的PCB中读出该进程的状态
②若被终止进程正处于执行状态,立即剥夺CPU
③终止其所有子孙进程:以防止它们成为不可控的进程;
④将被终止的进程所拥有的全部资源,或归还给其父进程,或归还给系统;
⑤将被终止进程的PCB从所在队列(或链表)中移出:等待其他程序来搜集信息
2.3.3 进程的阻塞与唤醒
引起进程阻塞与唤醒的情况(4个):
向系统请求共享资源失败;等待某种操作的完成;新数据尚未到达;等待新任务的到达。
阻塞原语block(主动):首先停止执行该进程;把PCB中的由运行态改为阻塞态;将PCB插入阻塞队列。
唤醒原语wakeup(被动):首先把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的阻塞态改为就绪态,将PCB插入就绪队列中。
阻塞原语和唤醒原语是成对出现的,作用相反的一对原语。
2.3.4 进程的挂起与激活
1 进程的挂起
挂起原语Suspend
过程:将活动就绪状态的进程改为静止就绪状态;将活动阻塞状态的进程改为静止阻塞状态;把该进程的PCB复制到某指定的内存区域;若被挂起的进程正在执行,则转向调度程序重新调度。
2 进程的激活
激活原语Active
过程:将进程从外存调入内存,如果该进程状态为静止就绪就改为活动就绪;如果该进程状态为静止阻塞就改为活动阻塞。由调度程序将被激活的进程与当前进程两者的优先级进程比较,如果被激活的进程的优先级较低,就不必重新调度;否则,立即终止该进程的运行,并把处理机分配给刚激活的进程。
2.4 进程通信
2.4.1 进程通信的类型
高级通信机制可归结为4类:共享存储器系统、管道通信系统、消息传递系统以及客户机-服务器系统。
1 共享存储器系统(基于数据结构和存储区)
基于数据结构理解成共享全局变量(低级通信),基于存储区理解成共享内存池(高级通信)。
(1)基于共享数据结构的通信方式。
要求各进程共享某些数据结构、以实现各进程间的信息交换,如生产者-消费者问题中的有界缓冲区。
(2)基于共享存储区的通信方式。
需要通信的进程在通信前向系统申请获得共享存储区中的一个分区,将其附加到自己的地址空间中。
2 管道通信系统
管道(pipe),用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,又名pipe文件。
管道机制必须提供3方面的协调能力:
(1)互斥
当一个进程正在进行操作时,另一进程必须等待。
(2)同步
即当写(输入)进程把一定数量(如4KB)的数据写入管道后,便去睡眠(等待),直到读(输出)进程取走数据后,再把它唤醒。当读进程读一空管道时,也应睡眠(等待),直至写进程将数据写入管道后,再把它唤醒。
(3)确定对方是否存在
确定对方存在才能进行通信。
3 消息传递系统(直接通信+间接通信)
(1)直接通信方式
发送进程利用OS所提供的发送原语Send,直接把消息发送给目标进程。
(2)间接通信方式
发送进程和接收进程都通过共享中间实体(信箱)的方式进行消息的发送和接收(Receive)。
4 客户机-服务器系统
(1)套接字(socket)
socket是UNIX系统下的网络通信接口。套接字分为两类:文件型和网络型。如FTP端口号21,HTTP端口号为80。
(2)远程过程调用和远程方法调用
远程过程调用(RPC)是一个通信协议,用于网络连接的系统。该协议允许运行于一台主机系统上的进程调用另一台主机(远程)系统上的进程。如果涉及的软件采用面向对象编程,那么远程过程调用就可称作远程方法调用。
2.4.2 消息传递通信的实现方式
1 直接通信(直接消息传递系统)
(1)直接通信原语
对称寻址方式:要求发送进程和接收进程都必须以显示方式提供对方的标识符。
发送原语:send;接收原语:receive
例:send(receiver,message)
receive(sender,message)
非对称寻址方式:与对称寻址方式类似,但在接受原语有所不同。
(2)消息的格式
单处理机系统中,采用较短的定长消息格式;采用变长消息格式。
(3)进程的同步方式
一:发送进程阻塞,接收进程阻塞。
二:发送进程不阻塞,接收进程阻塞。
三:发送进程和接收进程均不阻塞。
(4)通信链路
单向通信链路和双向通信链路。
2 间接通信(信箱通信)
信箱通信采用间接通信,即进程通信之间需要通过某些中间实体实现。
(1)信箱的结构
信箱被定义为一种数据结构。分为两个部分:信箱头和信箱体。
(2)信箱通信原语
信箱的创建和撤销:进程可利用信箱创建原语来建立一个新信箱。可用撤销原语将其撤销。
消息的发送和接收:
send(mailbox,message):将一个消息发送到指定信箱。
receive(mailbox,message):从指定信箱中接收一个消息。
(3)信箱的类型
私用信箱(用户创建);公用信箱(OS创建);共享信箱(进程创建)。
2.4.3 实例:Linux进程通信
见课本P60-63
2.5 线程的概念
线程是比进程更小的基本单位,是为了提高程序的并发执行程度。
引入线程是为了解决进程内部的矛盾,比如QQ只可以聊天,不能边聊天边发文件、打视频,线程的出现解决了这个问题。
引入了线程之后,CPU的服务对象就不再是进程,而是进程当中的线程,每一个进程当中可能会包含多个线程,然后CPU会用一定的算法轮流地为这些线程进行服务。
2.5.1 线程
1 进程的两个基本属性
进程是一个可拥有资源的独立单位。
进程同时又是一个可独立调度和分派的基本单位。
2 程序并发执行所须付出的时空开销
创建进程;撤销进程;进程切换。
3 线程——作为调度和分派的基本单位
可以把线程理解为“轻量级进程”。线程是一个基本的CPU执行单元,也是程序执行流的最小单位。引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务(如QQ视频、文字聊天、传文件)。引入线程后,进程只作为除CPU之外的系统资源的分配单元(如打印机、内存地址空间等都是分配给进程的)。线程则作为处理机的分配单元。
2.5.2 进程与线程的比较
(1)调度的基本单位:传统为进程,现在为线程(引入线程概念)。
(2)并发性:进程之间可以并发,一个进程中的多个线程也可以并发执行,允许一个进程中的所有线程并发执行。
(3)拥有资源:线程拥有TCB,可拥有资源。
(4)独立性:同一进程中的不同线程之间的独立性低,不同进程之间的独立性高。
(5)系统开销:线程的系统开销远小于进程。在一些OS中,进程的切换、同步以及通信都无须OS内核的干预。
(6)支持多处理机系统
2.5.3 线程状态和线程控制块
1 线程执行的3个状态
执行状态:线程已获得处理机正在执行。
就绪状态:线程已具备条件,只需再次获得CPU即可执行。
阻塞状态:线程以某些事件而受阻,处于暂停阶段。
2 线程控制块TCB
线程标识符(TID是唯一标识);一组寄存器;线程执行状态;优先级;线程专有存储区;信号屏蔽;堆栈指针。
3 多线程OS中的进程属性
(1)进程是一个可拥有资源的基本单位。
(2)多个线程可并发执行。如Java的运行环境是单进程多线程的,Windows2000、Solaris等的运行环境是多进程多线程的。
(3)进程已不是可执行的实体。