您的位置:首页 > 其它

操作系统精髓与设计原理--并发性:互斥和同步(2)

2016-10-16 10:03 393 查看
进程的交互

(1)进程间相互不知道对方:

(2)进程间接知道对方

(3)进程直接知道对方

互斥的要求

临界资源:假设两个或更多的进程需要访问一个不可共享的的资源,如打印机。每个进程都给该I/O设备发命令,接收状态信息,发送数据和接收数据。

临界区:使用临界资源的那一部分代码称为程序的临界区

互斥产生的两个额外的控制问题

死锁:p1,p2都要R1,R2但是p1有R1,p2有R2则两个都不能一起运行

饥饿:p1,p2,p3都周期性访问资源,但是资源仅在p1,p3传递,则p2可能无限期地被拒绝访问资源

互斥的要求

(1)必须强制实施互斥

(2)一个在非临界区停止的进程必须不干涉其他进程

(3)决不允许出现一个需要访问临界区的进程被无限延迟的情况,即不会死锁或饥饿

(4)当没有进程在临界区中时,任何需要进入临界区的进程必须能够立即进入

(5)对相关今尘大哥速度和处理器的数目没有任何要求和限制

(6)一个进程驻留在临界区中的时间必须是有限的

n个进程并发执行,每个进程包括(1)在某些资源Ra上操作的临界区(2)不涉及访问资源Ra的额外代码

那么要保证在同一时刻只有一个进程在临界区

为了实现互斥,需要两个函数fun1(a),fun2(a)

他们的参数都是竞争使用的资源名,那么对于进程而言

void P1

{

   while(1)

{

   fun1(a);//上锁,当a资源被使用的时候就必须等待

   代码

   fun2(a);//释放a,给其他进程使用

}

}

控制机制必须确保共享数据的完整性

互斥:硬件的支持

(1)中断禁用

while(1)

{

禁用中断

临界区

启用中断

其余部分

}

信号量:

关于信号原语规范的定义:

(1)一个二元信号量可以初始化成0或者1

(2)semWaitB操作检查信号的值,如果值为0,那么进程执行semWaitB就会受阻,如果值为1,那么将值改变为0并且继续执行该进程

(3)semSignalB操作检查是否有任何进程在该信号上受阻,如果有,那么通过semWaitB操作,受阻的进程就会被唤醒,如果没有进程受阻,那么值被设置为1

强信号量:先进先出(FIFO)被阻塞时间最久的进程最先从队列释放

弱信号量:没有策略规定进程从队列中移出的顺序的信号量称为弱信号量。

强信号量保证不会饥饿,弱信号量不能保证。

管程:

管程是一个程序设计语言结构,它提供了与信号量同样的功能,更易于控制。

他是由一个或多个过程,一个初始化序列和局部数据组成的软件模块,其主要特点如下:

(1)局部数据变量只能被管程的过程访问,任何外部过程都不能访问

(2)一个进程通过调用管程的一个过程进入管程

(3)在任何时候,只能有一个进程在管程中执行,调用管程的任何其他进程都被挂起,以等待管程变为可用

管程可以提供一种互斥机制

管程中的数据变量每次只能被一个进程访问到。

因此可以把一个共享数据结构放在管程中,从而提供对它的保护。

管程通过使用条件变量提供对同步的支持:

有两个函数可以操作条件变量:

cwait(c):调用进程的执行在条件c上挂起,管程现在可被另一个进程使用

csignal(c):恢复在xwait之后为某些条件而挂起的进程的执行,如果有多种这样的进程,选择其中一个,如果没有这样的进程,什么也不做。

同步:

关于send和receive原语的组合:

(1)阻塞send,阻塞reveive:发送者和接收者都被阻塞,直到完成信息的交付。

(2)无阻塞send,阻塞receive:尽管发送者可以继续,但是接收者被阻塞知道请求的消息到达。例如,一个服务器进程给其他进程提供服务或资源。

(3)无阻塞send,无阻塞receive:不要求任何一方等待

寻址

显然,在send原语中确定哪个进程接收消息是很有必要的,类似的大多数实现允许接收进程指明接收的消息源。

在send和receive原语中确定进程的方案可分为两类:

(1)直接寻址:

send原语包含目录进程的具体标识符

receive原语有两种处理方式:

1.要求进程显式地指定发送进程

2.不可能指定所期望的源进程,对这类应用使用隐式寻址更为有效

(2)间接寻址

消息不是直接从发送者发送到接收者,而是发送到由临时保存这些消息的队列组成的一个共享数据结构,这些队列通常称为信箱,因此对两个通信进程,一个进程给合适的信箱发送信息,另一个从信箱中获得这些消息。

信箱也通常称为一个端口(port)

端口通常归接收进程所有,并由接受进程创建,因此当一个进程被销毁的时候,他的端口也随之被毁灭。

对于通用的信箱,操作系统可能提供一个创建信箱服务,这样信箱可以看作是由创建它的进程所有。

消息格式:

包含相关消息的消息头和包含实际内容的消息体。

读者和写者的问题(自己钻研)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: