操作系统精髓与设计原理--并发性:互斥和同步(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)
端口通常归接收进程所有,并由接受进程创建,因此当一个进程被销毁的时候,他的端口也随之被毁灭。
对于通用的信箱,操作系统可能提供一个创建信箱服务,这样信箱可以看作是由创建它的进程所有。
消息格式:
包含相关消息的消息头和包含实际内容的消息体。
读者和写者的问题(自己钻研)
(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)
端口通常归接收进程所有,并由接受进程创建,因此当一个进程被销毁的时候,他的端口也随之被毁灭。
对于通用的信箱,操作系统可能提供一个创建信箱服务,这样信箱可以看作是由创建它的进程所有。
消息格式:
包含相关消息的消息头和包含实际内容的消息体。
读者和写者的问题(自己钻研)
相关文章推荐
- 操作系统精髓与设计原理--并发性:互斥和同步
- <<操作系统精髓与设计原理>>读书笔记(一) 并发性:互斥与同步(1)
- 操作系统精髓与设计原理--并发性:死锁和饥饿
- 操作系统精髓与设计原理(原书第6版)——学习笔记(11)
- 操作系统精髓与设计原理之线程
- 操作系统精髓与设计原理--内存(2)
- 操作系统---精髓与设计原理 之 虚拟存储器(MMU)
- <操作系统:精髓与设计原理> 嵌入式操作系统
- 操作系统精髓与设计原理--多处理器和实时调度
- 操作系统精髓与设计原理-计算机系统概述
- 操作系统精髓与设计原理(原书第6版)——学习笔记(5)
- <操作系统:精髓与设计原理> 计算机安全
- 操作系统课程设计 线程的同步与互斥
- 操作系统精髓与设计原理-线程、对称多处理(SMP)和微内核
- 操作系统精髓与设计原理-线程、对称多处理(SMP)和微内核
- 操作系统精髓与设计原理(原书第6版)——学习笔记(3)
- 操作系统精髓与设计原理--单处理器调度
- 操作系统精髓与设计原理(原书第6版)——学习笔记(2)
- 操作系统---精髓与设计原理 之 计算机系统概述
- 操作系统-精髓与设计原理(第六版)读书笔记