引入前趋图:
描述进程执行前后关系的图
程序顺序执行时的特征:
- 顺序性
处理机的操作严格按程序规定顺序执行 - 封闭性
程序一旦开始执行,其计算结果不受外界因素影响。 - 可再现性
程序执行只要初始条件一样,不论如何停顿,重复执行多少次结果都一样。
并发程序执行时的特征
①间断性(运行表现):
多道 -> 程序并发执行-> 要共享系统的资源 -> 形成相互制约的关系
②失去封闭性:
共享资源,资源状态由多道程序改变,程序运行失去封闭性。
③ 结果不可再现性:
结果不确定,程序执行将没有任何意义。
进程的特征
①结构性特征,进程的根本——PCB
②动态性
③并发性
④独立性
⑤异步性
进程执行时的间断性,决定了其具有多种状态。把握各进程所属的状态对进程 控制至关重要。
进程的三基态的转换
进程控制块PCB
进程实体:代码段+数据段+PCB
进程控制块定义
存放进程的管理和控制信息的数据结构称为进程控制块。
进程标识符信息
每个进程都必须有一个唯一的标识符
内部标示符:唯一的数字序号,方便系统使用
外部标示符:方便用户使用,用户进程访问某进程时使用
处理机状态信息
主要由处理机的各种寄存器中的内容组成,被中断时这些信息要存放到PCB。
通用寄存器:用户程序访问的,暂存信息;
指令计数器:下一条指令地址;
程序状态字PSW:一些状态信息;
用户栈指针:每个用户进程都有的存放过程和系统调用参数及调用地址的一 组系统栈。
进程调度信息
进程状态;
进程优先级;
进程调度所需的其他信息:调度算法相关信息;
事件:状态转换有关的事件
进程控制信息
程序和数据的地址(单个进程)
数据所在的内外存地址
进程同步和通信机制(多进程间)
同步和通信机制的信号量、消息队列指针等
资源清单
链接指针(PCB的组织)
本PCB所在队列的下一个进程PCB首地址。
PCB信息的存放
系统运行中有若干个程序的PCB,它们常驻内存的PCB区。
采用的数据结构:PCB结构体,PCB链表或队列。
进程控制
进程控制的基本过程:
①进程的创建;
②进程的终止;
③进程的阻塞与唤醒;
④进程的挂起和激活。
进程间的父子关系关系着资源的继承。创建和撤销进程时,其父、子进程要相应的被影响。
进程的创建
1)一个进程创建另一进程的事件
用户登录:分时情况下用户的请求;
作业调度:批处理中;
提供服务:运行中的用户程序提出功能请求,要创建服务进程;
应用请求:应用程序自己创建进程,完成特定功能的新进程。
2)创建过程
(1) 申请空白PCB;
(2) 为新进程分配资源;
主要是内存资源的处理
(3) 初始化进程控制块;
标识符(包括父进程的)、程序计数器指向程序入口地址,就绪态、优先 级等信息的填写。
(4) 将新进程插入就绪队列。
进程的终止
1)引起进程终止的事件:
①正常结束
②异常结束
③外界干预
2)终止过程:
对上述事件,OS调用内核终止原语,执行下列过程:
(1) 根据进程标示符,检索出该进程PCB,读其状态。
*IF 执行态,立即终止该进程,置调度标志为真,指示重新进行调度。
*IF 有子孙进程,亦应予以终止,以防成为不可控进程。
(2) 归还全部资源至其父进程或系统。
(3) 将该进程PCB从所在队列或链表中移出。
3.进程的阻塞与唤醒
1)引起进程阻塞和唤醒的事件:
请求系统服务的满足情况;
启动某种需等待(I/O)操作;
合作需要的新数据尚未到达;
执行某功能的进程暂时无新工作可做。
2)阻塞和唤醒过程:
(1)将PCB中的状态改为阻塞
(2)该PCB加入到阻塞队列中
(3)转进程调度,将处理机分配给另一进程
(4)进行进程切换,即根据两切换进程的PCB,保护与重新设置处理机状 态。
4.进程的挂起与激活
(1)检查被挂起进程的状态,活动就绪则改为静止就绪,活动阻塞则改为静止阻塞
(2)将该PCB复制到内存(方便检查)/外存(对换)指定区域
(3)若挂起的进程是执行态,则需重新进行进程调度。
进程同步的主要任务:
使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。
临界区
每个进程中访问临界资源的那段代码叫临界区。
为了正确同步,对临界区的代码要增加控制。
实现互斥的方法应符合如下每条原则:
空闲让进:资源使用最基本原则
忙则等待:保证互斥
有限等待:合适时被唤醒防止死等
让权等待:能主动释放CPU防止忙等
信号量机制
荷兰科学家Dijkstra(狄克斯特拉)提出的一种卓有成效的进程同步机制。
1) 整型信号量
最初的信号量机制,两个原子操作对一个共享整型量进行操作。
①信号量定义为一个整型量;
②根据初始情况赋相应的值;
③仅能通过两个原子操作来访问。
2)记录型信号量
整型信号量符合“有限等待”原则,但不符合“让权等待”原则。
3)信号量的基本应用
①实现进程互斥
②实现进程间的前趋关系(有序)
无论生产者、消费者使用缓冲池时应保证互斥使用(互斥信号量mutex )
生产者和消费者间交叉有序:
有序的控制最根源在产品数量上。
设置两个信号量:
分别针对生产者、消费者设置不同的信号量,empty和full分别表示缓冲池中空缓冲池和满缓冲池(即产品)的数量。
每个程序中用于实现互斥的wait(mutex)和signal(mutex)必须成对地出现。
控制顺序的信号量empty和full的wait和signal操作,成对地出现在不同的进程中。
在每个程序中的多个wait操作顺序不能颠倒。且应先执行对资源信号量的wait操作,再执行对互斥信号量的wait操作,否则可能引起进程死锁。
模拟交替执行过程,检查控制是否正确。
经典的三个信号量问题
生产者—消费者问题
互斥、同步
哲学家就餐问题
互斥、死锁
读者——写者问题
有条件的互斥
读者与写者问题
读者间起作用:
Readcount变量,rmutex信号量
写者间起作用:
writecount变量,mutex信号量
读者与写者间起作用:
wmutex
S
黑白棋子问题
黑
while(没结束){p(m);if (turn<>2)
下一黑子;
turn=2;
v(m)
}
白:
while(没结束){
p(m);
if (turn<>1)
下一白子;
turn=1;
v(m)
}
生产与销售问题
定义资源信号量Sab,Sba表示A、B各自允许生产的数量初始:Sab=m,Sba=n(注意Sab,Sba之间的关系,和始终是m+n。)
信号量机制的不足:
信号量的控制分布在多个进程中
正确性分析困难;
分散的P、V操作:易出错,使用不当可能导致死锁。
修改、维护困难:易读性差,任一修改都可能影响全局;测试期间发现错误困难,即使发现错误也不容易定位出错位置。
管程如何实现同步?
对共享变量互斥操作:
管程的特点直接实现了该要求,进程一次一个进入管程调用内部过程操作共享变量。
管程的互斥访问完全由编译程序在编译时自动添上,无须程序员关心,能保证正确。
操作的同步控制:
靠条件变量的操作管理实现。
进入管程但不能获取资源操作的过程将阻塞,并在满足条件时被唤醒执行。
管程的优点
保证进程互斥地访问共享变量,并方便地阻塞和唤醒进程。管程可以以函数库的形式实现。相比之下,管程比信号量好控制。
管程可增强模块的独立性:系统按资源管理的观点分解成若干模块,用数据表示抽象系统资源,使同步操作相对集中,从而增加了模块的相对独立性
引入管程可提高代码的可读性,便于修改和维护,正确性易于保证:采用集中式同步机制。一个操作系统或并发程序由若干个这样的模块所构成,一个模块通常较短,模块之间关系清晰。
进程通信的类型
a.基于共享数据结构
诸进程公用某些数据结构,借以实现诸进程间的信息交换。
b.基于共享存储区
在存储器中划出了一块共享存储区,诸进程可通过对共享存储区中数据的读或写来实现通信。
消息传递通信的实现方法
1)直接通信方式
发送进程利用OS所提供的发送命令(原语),直接把消息发送给目标进程。此时,发送进程和接收进程都以显式方式提供对方的标识符。通常利用系统通信命令(原语):
Send(Receiver, message);
Receive(Sender, message);
2)间接通信方式
基于共享数据结构的实体用来暂存发送给目标进程的消息;接收进程则从该实体中,取出对方发送给自己的消息。通常把这种实体称为信箱。
单机和网络环境下的高级进程通信广泛采用“消息传递”方式,需要考虑的问题:
通信链路的建立
消息格式
同步方式
利用进程实现的多道程序系统中
进程是一个可拥有资源的独立单位;
是一个可独立调度和分派资源的基本单位
用户级线程需借助某种形式的中间系统取得内核服务,用户程序复杂
运行时系统:管理和控制线程的函数/过程集合。
内核控制线程,轻型进程LWP。