第六章进程间互斥同步与通信
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
► 原语(原子操作):操作过程不可中断,必须以 一个整体进行执行地系统基本操作
► 对于信号量操作的原语只有两个:UP和DOWN
PPT文档演模板
第六章进程间互斥同步与通信
DOWN原语(P操作)
►(1)若信号量S大于0,则 将S减1,P操作返回, 该进程继续执行
►(2)若信号量S等于0,则 将进程挂入S的等待队列, 将进程设置为阻塞状态, 并转调度程序
PPT文档演模板
第六章进程间互斥同步与通信
互斥(Mutual Exclusion)
►互斥:一组并发进程中的一个或多个程序 段,因共享某一公有资源而导致他们不能 同时进入临界区称为互斥。
PPT文档演模板
第六章进程间互斥同步与通信
互斥方案应满足的4个条件
►任何两个进程不能同时处于临界区 ►不应对CPU的数目和速度做任何假设 ►临界区外的进程不得阻塞其他进程 ►不得使进程在临界区外无休止地等待
第六章进程间互斥同步与通信
临界区(Critical Section)
►临界资源:一次仅允许一个进程使用的资源 称为临界资源。
►临界区:进程中对于临界资源访问的程序段 称为临界区。
►间接制约:由于共享某一公有资源而引起的 在临界区内不允许并发进程交叉执行的现象, 称为由共享公有资源造成的并发进程执行速 度的间接制约,简称间接制约。
} }
PPT文档演模板
第六章进程间互斥同步与通信
低效率的互斥可行解法
#define N 5 semaphor mutex=1; void philosopher(int i) {
while(true) { think(); down(mutex); take-fork(i); take-fork((i+1)%N); eat(); put-fork(i); put-fork ((i+1)%N); up(mutex);
down(mutex); state[i]=THINKING; test(LEFT); test(RIGHT); up(mutex); }
PPT文档演模板
第六章进程间互斥同步与通信
读者-写者问题
►设想一个飞机订票系统,其中有许多竞争的 进程试图读写其中的数据。多个进程同时读 是可以接受的,但一个进程正在更新数据库, 则所有其他进程都不能访问数据库,即使读 操作也不行。
PPT文档演模板
第六章进程间互斥同步与通信
生产者进程
void producer()
{
int item;
while(true){
produce-item(&item); //产生消息
down(empty);
//获得一个消息缓冲块
down(mutex);
//对消息的缓冲要互斥
enter-item(item); //将消息送入缓冲区
up(mutex);
//结束互斥
up(empty);
//增加一个空缓冲区
}
}
PPT文档演模板
第六章进程间互斥同步与通信
哲学家进餐问题
►五个哲学家围坐在一 张圆桌周围,每个哲 学家面前都有一盘通 心粉,由于通心粉很 滑,所以要两把叉子 才能夹住。相邻两盘 子之间有一把叉子, 餐具摆放如右图所示
PPT文档演模板
PPT文档演模板
第六章进程间互斥同步与通信
哲学家过程
void philosopher(int i) {
while (true){ think(); take-forks(i); eat(); put-forks(i);
} }
PPT文档演模板
void test(i) {
if (state[i]==HUNGRY&& state[LEFT]!=EATING&& state[RIGHT]!=EATING) {
第六章进程间互斥同步与通信
哲学家生活的过程
►哲学家的生活包括两种活动:即吃饭和思考。 当一个哲学家觉得饿时,他就试图分两次去 取他左边和右边的叉子,每次得到一把,并 且不分次序。如果成功的获得两把叉子,他 就开始吃饭,吃完以后放下叉子继续思考。
►问题:为每一个哲学家写一段程序来描述其 行为,要求不能死锁。
第六章进程间互斥、同 步与通信
PPT文档演模板
2020/11/28
第六章进程间互斥同步与通信
问题纲要
►间接制约和直接制约是什么? ►什么是临界区? ►什么是信号量? ►什么是同步、互斥? ►如何应用信号量实现同步和互斥? ►信号量在Windows编程中是如何实现的?
PPT文档演模板
第六章进程间互斥同步与通信
PPT文档演模板
第六章进程间互斥同步与通信
信号量(semaphore)
► 信号量使E.W.Dijkstra在1965年提出的一种方法, 他建议引入一个新的变量类型,称作信号量。信 号量是一个整数,其值可以为0或某个正整数, 分别表示不可进入临界区以及能够进入的进程数 目。
► 信号量:是一个仅能由同步原语对其进行操作的 整型变量。
PPT文档演模板
第六章进程间互斥同步与通信
互斥的实现方案
►关中断 ►锁变量 ►严格轮换法 ►Peterson方案 ►TSL硬件指令(Intel平台为BTS指令) ►信号量 ►管程 ►消息传递
PPT文档演模板
第六章进程间互斥同步与通信
关中断
► 处理机的调度都是由中断所引起的(主要是定时器中断)
► 如果进入临界区前将所有外部中断屏蔽,则在运行临界 区时将不会响应所有外部中断事件,也就不可能发生进 程切换,待进程执行完临界区后再开中断。
►异步环境下的一组并发进程,因直接制约而 互相发送消息而进行相互合作、相互等待, 使得各进程按一定的速度执行的过程称为进 程间的同步。
PPT文档演模板
第六章进程间互斥同步与通信
生产者-消费者问题信号量定义
#define N 100 semaphore mutex=1; //互斥信号量 semaphore empty=N; //开始时候可用的消息缓冲区数为N semaphore full=0; //开始时候可用的消息为0
state[i]=EATING; up(s[i]); } }
第六章进程间互斥同步与通信
哲学家的两个主要动作
void take-forks(int i) {
down(&mutex); state[i]=HUNGRY; test(i); up(mutex); down(s[i]); }
void put-forks(int i) {
► 缺点:交由用户进程管理中断的开关是非常不安全的, 一旦用户程序关中断后忘记打开,则整个系统将无法响 应外部事件而崩溃;另外,在多处理器系统中,关中断 也仅屏蔽本处理器的中断响应,对其他处理器中运行的 进程无法屏蔽。
► 因而通常中断屏蔽都由OS进行管理,由OS使用它来保证 一些核心操作的不可中断性。
互斥的需要
•void SendPrint() •{ •1 if ((in+1)%N==out) •2 exit(0); •3 else •4 in=(in+1)%N; •5 file[in]=printfile; •6 return; •}
•ProcessA(){ •…… •SendPrint() •} •ProcessB(){ •…… •SendPrint() •}
► 当消费者试图从缓冲区中取信息而发现缓冲区为空 时,它就睡眠,直到生产者向其中放入一些消息再 将其唤醒。
PPT文档演模板
第六章进程间互斥同步与通信
生产者过程
PPT文档演模板
第六章进程间互斥同步与通信
消费者过程
PPT文档演模板
第六章进程间互斥同步与通信
直接制约与同步
►一组在异步环境下的并发进程,各自的执行 结果互为对方的执行条件,从而限制各进程 的执行速度的过程称为并发进程间的直接制 约。
} }
PPT文档演模板
第六章进程间互斥同步与通信
理发师睡觉问题
► 理发店里有一位理发师、一把理发椅和n把供等 候理发顾客坐的椅子。如果没有顾客,则理发师 便在理发椅上睡觉。
进程并发运行所带来的问题
►由于系统资源的共享性,并发进程的执行结 果失去了封闭性和可再现性。
►满足Bernstein条件的并发进程能够保持封闭 性,但是Bernstein条件限制太过严格,不符 合大多数实际环境的需要。
►因而,OS需要寻求一种机制,满足进程间共 享资源的需要。
PPT文档演模板
第六章进程间互斥同步与通信
down(mutex); rc=rc-1; if (rc==0) up(db); up(mutex); use-data-read(); } }
PPT文档演模板
第六章进程间互斥同步与通信
写者过程
void writer() {
while(true){ think-up-data(); down(db); write-data-base(); up(db);
lock=0; //退出临界区后解锁,使其他进程可以进入
non_critical_section();
}
PPT文档演模板
第六章进程间互斥同步与通信
严格轮转法
PPT文档演模板
第六章进程间互斥同步与通信
Peterson方案
PPT文档演模板
第六章进程间互斥同步与通信
TSL指令(测试与设置指令)
•Intel CPU中对应的TSL指令汇编指令码为BTS
►问题:如何对读者和写者编写线程?
PPT文档演模板
第六章进程间互斥同步与通信
semaphore mutex=1; semaphore db=1; int rc=0; void reader() {
while (true){ down(mutex); rc+=1; if (rc==1) down(db); up(mutex); read-data-base();
} }
PPT文档演模板
第六章进程间互斥同ห้องสมุดไป่ตู้与通信
经典解法
#define N 5 #define LEFT (i-1)%N #define RIGHT (i+1)%N #define THINKING 0 #define HUNGRY 1 #define EATING 2 int state[N] semaphore mutex=1 semaphore s[N]={0, 0, ..., 0}
up(mutex);
//互斥结束
up(full);
//增加一个可用消息
}
}
PPT文档演模板
第六章进程间互斥同步与通信
消费者进程
void consumer()
{
int item;
while(true){
down(full);
//获得一可用消息
down(mutex); //互斥访问消息缓冲区
get-item(&item); //取得消息并从队列删除
放回
•S=S+1
•返回
PPT文档演模板
第六章进程间互斥同步与通信
生产者-消费者问题
► 问题描述:两个进程共享一个公共的固定大小的缓 冲区。其中的一个,生产者,将信息放入缓冲区; 另一个,消费者,从缓冲区中取出信息。
► 当缓冲区已满,而此时生产者还想向其中放入一个 新的信息则让生产者睡眠,待消费者从缓冲区取走 一个或多个信息时再唤醒它。
PPT文档演模板
第六章进程间互斥同步与通信
锁变量
int lock=0;
//初始情况下没有进程进入临界区
Processi()
{
while (lock==1) ;//当其他进程在临界区工作时,忙等待
lock=1;
//设置锁变量,防止其他进程进入
critical_section(); //进行临界区相关操作
PPT文档演模板
第六章进程间互斥同步与通信
不正确解法
#define N 5 void philosopher(int i) {
while(true) { think(); take-fork(i); take-fork((i+1)%N); eat(); put-fork(i); put-fork ((i+1)%N);
进程间通信IPC
►在两个或多个进程间传递信息或共享数据的 机制,称之为进程间通信(Inter-Process Communication)
►UNIX操作系统中的管道技术(Pipe)就是一 种IPC
►在IPC的过程中,主要要解决两类问题:互斥 和同步
PPT文档演模板
第六章进程间互斥同步与通信
PPT文档演模板
•P原语
•否
•S>0
•是
•调用进程进入等待队列
•S=S-1
•返回
•转进程调度
PPT文档演模板
第六章进程间互斥同步与通信
UP原语(V操作)
►(1)若信号量S的等待队
•V原语
列中有等待进程,则取
队首进程,将其置为就
•是
•是否有等待进程
绪状态并返回。
►(2)否则信号量S加1,并
•否
•取队首进程置为就绪态