由于各 进程 要求使用共享资源( 变量 、文件等),而 这些 资源需要排他性使用各进程之间 竞争使用这些 资源—— 这一关系称为 进程互斥
临界资源:critical resource 系统中某些资源一次只允许一个进程使用,称这样的资源为 临界资源 或 互斥资源 或 共享变量
临界区( ( 互斥区) ) :critical section(region) 各个进程中对某个临界资源(共享变量)实施操作 的程序 片段
没有进程在临界区时,想进入临界区的进程可进入
不允许两个进程同时处于其临界区 中
临界区外运行的进程不得阻塞其他进程进入临界区
不得使进程无限期等待进入临界区
软件方案
- Dekker 解法、Peterson 解法
硬件 方案
- 屏蔽中断、TSL(XCHG) 指令
进程同步:synchronization 指系统中多个进程中发生的事件存在某种时序关系 ,需要相互合作,共同完成一项任务
具体地说,一个进程运行到某一点时,要求另一伙伴进程为它提供消息,在未获得消息之前,该进程进入阻塞态,获得消息后被唤醒进入就绪态
三、信号量及PV操作 1、信号量及PV操作一个特殊变量
用于进程间传递 信 息 的 一个整数值
定义如下:
struc semaphore
{
int count;
queueType queue;
}
- 对信号量可以实施的操作:初始化、P 和V (P 、V 分别是荷兰语的test(proberen) 和increment(verhogen) )
P( s )
{
s.count--;
if ( s.count < 0 )
{
该进 状 态 置 为阻 塞 状 态 ;
将 该进 插入相应的等待 队
列 s.queue 末 尾 ;
重新 调 度 ;
}
}
P( s )
{
s.count--;
if ( s.count < 0 )
{
该进 状 态 置 为阻 塞 状 态 ;
将 该进 插入相应的等待 队
列 s.queue 末 尾 ;
重新 调 度 ;
}
}
3、有关说明
P 、V 操作为原语 操作(primitive or atomic action)
在 信号量上定义了三个操作:初始化( 非负数) 、P 操作、V 操作
最初提出的是二元信号量 (解决互斥 )之后, 推广 到一般信号量(多值)或计数信号量(解决同步)
是一个特殊的模块
有一个名字
由关于共享资源的数据结构及在其上操作的一组过程组成
进程 只能通过调用 管程中的过程 来间接地访问管程中的数据结构
3、管程需要保证什么?作为一种同步机制,管程要解决两个问题
互斥
- 管程是 互斥 进入 的(为了保证管程中数据结构的数据完整性)
- 管程的互斥性是由编译器负责保证的
同步
- 管程中设置 条件 变量及等待/ 唤醒操作 以 解决同步问题
- 可以让一个进程或 线程在 条件变量上等待(此时,应先释放管程的使用权),也可以通过发送信号将等待在条件变量上的进程或线程唤醒
管程 : 抽象数据类型
- 有一个明确定义的操作集合,通过它且只有通过它才能操纵该数据类型的实例
实现管程结构必须保证下面几点:
(1)只能通过管程的某个过程才能访问资源;
(2) 管 程是互斥的 , 某个时刻只能有一个进程或线程调用 管程中 的过程
条件变量:为 提供进程与其他进程通信或同步 而引入
- wait/signal 或 wait/notify 或 wait/broadcast
消息传递
共享 内存
管道
套接 字
远程过程调用
不可分割,在执行完之前不会被其他任务或事件中断
常用于实现资源的引用计数
一种同步机制( ( 又称栅栏、关卡) )
用于对一组线程进行协调
应用场景
- 一组线程协同完成一项任务,需要所有线程都到达一个汇合点后再一起向前推进
本文整理自:《操作系统原理》北京大学_陈向群 讲义 个人微信公众号:
作者:jiankunking 出处:http://blog.csdn.net/jiankunking