进程间的同步和互斥-
进程同步和互斥的概念
![进程同步和互斥的概念](https://img.taocdn.com/s3/m/1583cbfadb38376baf1ffc4ffe4733687f21fc48.png)
进程同步和互斥的概念
进程同步和互斥是操作系统中的两个关键概念,它们用于控制多个进程并发执行时的互相干扰和冲突。
进程同步指的是多个进程在运行过程中需要相互协调和配合,以便达到某种预期的效果。
这种场景通常需要使用一些机制,如信号量、互斥锁、条件变量等来协调进程之间的执行顺序和同步过程。
互斥则是指多个进程之间的资源访问冲突问题。
在多进程并发执行的情况下,会存在多个进程同时访问同一个共享资源的情况,这样就有可能引发数据竞争和资源的访问冲突。
通过使用互斥信号量或者互斥锁等机制,可以有效地避免这种冲突的发生,保证每个进程对共享资源的访问互不干扰,从而实现进程之间的安全交互。
操作系统第6章 进程互斥与同步
![操作系统第6章 进程互斥与同步](https://img.taocdn.com/s3/m/7a21de63783e0912a2162a0a.png)
Co-begin void Producer_i( ) (i=1,2…k) { item next_p; while(1){ produce an item in next_p P(empty); P(s); add next_p to buffer V(s); V(full); } } void consumer_j( ) (j=1,2…m) { item next_c; while(1){ P(full); P(s); remove an item from buffer to next_c V(s); V(empty); consume the item in next_c}} Co-end
• 进入临界段之前要申请,获得批准方可进入; • 退出临界段之后要声明,以便其他进程进入。
用程序描述: While(1){ entry_section; critical_section; exit_section; remainder_section; }
解决临界段问题的软件算法必须遵循:
准则1:不能虚设硬件指令或假设处理机数目。 准则2:不能假设n个进程的相对速度。 准则3:当一个进程未处于其临界段时,不应阻止 其他进程进入临界段。 准则4:当若干进程欲进入临界段时,应在有限时 间内选出一个进程进入其临界段。 用准则3,4不难推出下面原则 协调各进程入临界段的调度原则: • 当无进程处于临界段时,允许一个进程立即进入临界段。
3.实现临界段的硬件方法
利用处理机提供的特殊指令实现临界区加锁。 常见硬件指令有: ⑴ “Test_and_Set”指令 该指令功能描述为: int *target ( 限定为0,1) int Test_and_Set (int *target) { int temp; temp = *target ; *target = 1; return temp; }
进程间同步的几种方法
![进程间同步的几种方法](https://img.taocdn.com/s3/m/3fd05e3c591b6bd97f192279168884868762b821.png)
进程间同步的几种方法进程间同步是指两个或多个进程之间进行协调,以确保它们能够正确地执行。
这是多任务操作系统中的重要问题,因为进程之间共享资源,包括内存、文件和网络连接等。
进程同步的关键是确保一组进程在处理共享资源时,能够避免发生竞态条件(Race Condition)和死锁(Deadlock)。
竞态条件指多个进程同时访问共享资源,导致不正确的结果。
死锁指多个进程互相等待,导致它们都无法继续执行。
1. 互斥锁互斥锁是最常见的同步方法之一,它被用来保护共享资源,确保同一时刻只有一个进程可以访问它。
当一个进程获取了锁,其他进程必须等待,直到锁被释放。
在 POSIX 系统中,互斥锁可以通过 pthread_mutex_t 数据类型实现。
我们可以使用pthread_mutex_init() 函数初始化锁,使用 pthread_mutex_lock() 函数获取锁,使用pthread_mutex_unlock() 函数释放锁。
下面是一个例子,展示了如何使用互斥锁同步两个进程对共享变量的访问:```c#include <pthread.h>#include <stdio.h>int count = 0;pthread_mutex_t lock;void *increment(void *arg) {for (int i = 0; i < 1000000; i++) {pthread_mutex_lock(&lock); // 获取锁count++;pthread_mutex_unlock(&lock); // 释放锁}return NULL;}在上面的例子中,我们创建了两个线程,它们分别对共享变量 count 进行了一百万次的递增操作。
我们使用了互斥锁来保护 count 变量,确保同一时刻只有一个线程可以访问它。
2. 信号量3. 条件变量条件变量可以被用来支持更高级的同步机制,如互斥锁和信号量。
第4章 进程的同步与互斥
![第4章 进程的同步与互斥](https://img.taocdn.com/s3/m/c2836c25192e45361066f5a9.png)
mxh
同步
生产者活动:
Repeat 加工一件物品
消费者活动:
Repeat wait(full)
wait(empty)
物品放入箱中 signal(full)
箱中取一物品
signal(empty) 消耗这件物品
Until false
Until false
mxh
互斥
生产者活动:
Repeat
认为缓冲区同一时刻只有一个人可
mxh
4.1 进程的同步和互斥
信号量定义(记录型信号量)
semaphore是一个结构体: typedef struct {
int value;
//资源的个数
//进程链表
struct process *L;
} semaphore;
mxh
4.1 进程的同步和互斥 申请一个
• 信号量操作wait现在可按如 下来定义: void wait (semaphore S) { S.value - -; if (S.value <0) { add this process to S.L; block(); } }
mxh
4.1 进程的同步和互斥
• 信号量的应用
–合作进程的执行次序 –共享缓冲区的进程的同步
mxh
4.1 进程的同步和互斥
• 合作进程的执行次序:
–保证一组合作进程按照逻辑需要所确定 的次序进行。
mxh
4.1 进程的同步和互斥
• 合作进程的执行次序
–可以用一个图来表示进程集合的执行次 序。图的连接描述了进程开始和结束的 次序约束,此图称为进程流图. –例如P78,图4-2。 –使用信号量机制实现图4-2的同步。(练 习)
第6章 进程间的制约关系
![第6章 进程间的制约关系](https://img.taocdn.com/s3/m/a70423a62f60ddccda38a0df.png)
私用信号量(同步信号量):它为一组需同步协作完成任务的 并发进程而设置,只有拥有该资源的进程才能对它施加P操作 (即可申请资源),而由其合作进程对它施加V操作(即释放资 源)。
P、V 操 作 是 定 义 在 信 号 量 S 上 的 两 个 操 作 , 其 定 义 分 别 如 下 : P(S):S:=S-1
TS = lock; lock = TRUE; END
lock表示临界资源的两种状态: lock =TRUE表示临界资 源正被占用, lock =FALSE表示临界资源空闲; lock的初 值为FALSE。
互斥算法(TS指令)
while TS(lock) do skip; critical section
利用信号量实现共享打印机的A、B两进程互斥的类 并行PASCAL程序描述如下:
var mutex.value =1 :semaphore;
begin
parbegin
A:begin
B:begin
Input data 1 from I/0 1 ; Input data 2 from I/O 2 ;
Compute……;
... Consumer N
共享缓பைடு நூலகம்区 指针移动方向
下面给出基于环形缓冲区的生产者与消费者关系 的形式描述,设:
(1)公用信号量mutex:初值为1,用于实现临界 区互斥。
(2)生产者私用信号量empty:初值为n,指示空 缓冲块数目。
(3)消费者私用信号量full:初值为0,指示满缓 冲块数目。
•必须成对使用P和V原语:遗漏P原语则不能保 证互斥访问,遗漏V原语则不能在使用临界资源 之后将其释放(给其他等待的进程);P、V原 语不能次序错误、重复或遗漏
操作系统进程通信
![操作系统进程通信](https://img.taocdn.com/s3/m/4739a1a480c758f5f61fb7360b4c2e3f5627256a.png)
P1:count=R1
结果:虽然P1和P2进程各自都执行了对count加1的操作 段,但结果count只增加1。
原因分析:变量count就是临界资源,P1、P2访问count 的两个程序段就是临界区。但是两个进程同时进入了临 界区执行了。
8
19
用中断机制保证锁的安全性
用中断机制保证测试锁状态和关锁操作的原子性。
在测试锁状态前关闭中断; 如果测试不通过,开中断,然后重新测试。 如果测试通过,关锁,然后开中断,进入临界区。
优缺点:
中断关闭时间短,只两条指令。不会影响到中断处理 效率,也不会影响进程的并发特性。
不能用于多CPU系统。
24
刚进入临界区: wanted_in[self] = TRUE CASE1: Wanted_in[other] == FALSE, observer == self CASE2: Wanted_in[other] == TRUE, observer == other, CASE3: Wanted_in[other] == FALSE,且 observer == other(实际上不可能出现)
不在临界区,也没参与竞争临界区:wanted_in[self] == FLASE;
参与竞争临界区,但还没有设置观察进程(刚执行完 wanted_in[self] = TRUE):
刚设置了观察进程,但还没有执行测试进入: wanted_in[self] == TRUE
处于循环等待态: wanted_in[other] = TRUE 并且 observer == self
20
2-4、锁机制的软件实现
背景:
硬件实现需要代价比较大 移植性差,依赖具体的硬件平台 在多处理环境下有些硬件实现方式不使用,如中
详解进程同步与互斥机制
![详解进程同步与互斥机制](https://img.taocdn.com/s3/m/40a22914eef9aef8941ea76e58fafab069dc44f6.png)
详解进程同步与互斥机制⽬录⼀、什么是进程同步⼆、什么是进程互斥三、常见的进程同步与互斥机制⼀、什么是进程同步在多道批处理系统中,多个进程是可以并发执⾏的,但由于系统的资源有限,进程的执⾏不是⼀贯到底的,⽽是⾛⾛停停,以不可预知的速度向前推进,这就是进程的异步性。
那么,进程的异步性会带来什么问题呢?举个例⼦,如果有 A、B 两个进程分别负责读和写数据的操作,这两个线程是相互合作、相互依赖的。
那么写数据应该发⽣在读数据之前。
⽽实际上,由于异步性的存在,可能会发⽣先读后写的情况,⽽此时由于缓冲区还没有被写⼊数据,读进程 A 没有数据可读,因此读进程 A 被阻塞。
进程同步(synchronization)就是⽤来解决这个问题的。
从上⾯的例⼦我们能看出,⼀个进程的执⾏可能影响到另⼀个进程的执⾏,所谓进程同步就是指协调这些完成某个共同任务的并发线程,在某些位置上指定线程的先后执⾏次序、传递信号或消息。
再举个⽣活中的进程同步的例⼦,你想要喝热⽔,于是你打了⼀壶⽔开始烧,在这壶⽔烧开之前,你只能⼀直等着,⽔烧开之后⽔壶⾃然会发⽣响声提醒你来喝⽔,于是你就可以喝⽔了。
就是说⽔烧开这个事情必须发⽣在你喝⽔之前。
注意不要把进程同步和进程调度搞混了:进程调度是为了最⼤程度的利⽤ CPU 资源,选⽤合适的算法调度就绪队列中的进程。
进程同步是为了协调⼀些进程以完成某个任务,⽐如读和写,你肯定先写后读,不能先读后写吧,这就是进程同步做的事情了,指定这些进程的先后执⾏次序使得某个任务能够顺利完成。
⼆、什么是进程互斥同样的,也是因为进程的并发性,并发执⾏的线程不可避免地需要共享⼀些系统资源,⽐如内存、打印机、摄像头等。
举个例⼦:我们去学校打印店打印论⽂,你按下了 WPS 的 “打印” 选项,于是打印机开始⼯作。
你的论⽂打印到⼀半时,另⼀位同学按下了 Word 的 “打印” 按钮,开始打印他⾃⼰的论⽂。
想象⼀下如果两个进程可以随意的、并发的共享打印机资源,会发⽣什么情况?显然,两个进程并发运⾏,导致打印机设备交替的收到 WPS 和 Word 两个进程发来的打印请求,结果两篇论⽂的内容混杂在⼀起了。
pv操作题目 软考
![pv操作题目 软考](https://img.taocdn.com/s3/m/78c07a566d175f0e7cd184254b35eefdc8d315c4.png)
PV操作在软考中的深入探讨1. 基本概念PV操作是用于进程同步的两种基本操作。
P操作通常表示为一个进程需要一个资源,而V操作表示释放一个资源。
这两种操作通常用于实现进程间的同步和互斥。
2. PV操作原理PV操作基于信号量机制。
信号量是一个整数值,通常用于表示资源的数量。
P操作会尝试获取资源,减少信号量的值;而V操作会释放资源,增加信号量的值。
如果P操作不能立即获得资源(即信号量为0),则该进程会被阻塞或等待,直到资源可用。
3. PV操作在进程同步中的应用PV操作在进程同步中有着广泛的应用。
例如,在生产者-消费者问题中,生产者用于生成数据,消费者用于消费数据。
通过PV操作,可以确保生产者在没有数据被消费之前不会继续生产,同时确保消费者在没有数据可供消费时不会继续消费。
4. PV操作和互斥量互斥量是一种特殊的信号量,其值只能为0和1。
当一个进程获得互斥量时,其他任何进程都无法获得该互斥量,直到第一个进程释放它。
这使得互斥量可以用于保护某些临界区域,以实现互斥访问。
PV操作和互斥量通常一起使用,以实现更复杂的同步问题。
5. PV操作的编程实现在大多数编程语言中,PV操作可以通过系统调用或库函数实现。
例如,在UNIX系统中,可以使用semop函数进行PV操作。
在实现PV操作时,需要注意避免死锁和饥饿等问题。
6. PV操作的复杂度分析PV操作的复杂度取决于所使用的算法和数据结构。
在一些算法中,例如二叉堆或斐波那契堆,PV操作的平均时间复杂度可以达到O(1)。
然而,在最坏的情况下,PV操作的复杂度可能会达到O(n),其中n是信号量的值。
7. PV操作与信号量信号量是一种同步机制,用于控制多个进程对共享资源的访问。
PV操作是信号量机制中的基本操作,通过它们可以实现对共享资源的互斥访问和同步。
信号量通常用于保护临界区、实现进程间的同步和互斥等。
8. PV操作与死锁预防死锁是操作系统中的一个重要问题,它发生在两个或多个进程无限期地等待对方释放资源的情况。
进程间的基本关系
![进程间的基本关系](https://img.taocdn.com/s3/m/6793de2f773231126edb6f1aff00bed5b9f373d5.png)
进程间的基本关系
1,同步(直接制约):因合作进程之间协调彼此的工作而控制自己的执行速度,即因相互合作,相互等待而产生的制约关系如:流水线,商品生产和社会消费
2,互斥(间接制约):进程之间竞争临界资源而禁止两个以上的进程同时进入临界区所发生的制约关系.如:篮球比赛,图书馆借书。
在多道程序环境下,当程序并发执行时,由于资源共享和进程合作,使处于同一个系统中的诸多进程之间可能存在着以下两种形式的制
约关系:(1)、间接相互制约关系。
所谓间接相互制约源于资源共享;
(2)、直接相互制约关系。
这种制约主要源于进程间的合作。
进程同步
![进程同步](https://img.taocdn.com/s3/m/eb4d777750e2524de4187e04.png)
执行中会出现什么问题?
死锁
Wait(s);
Wait(s);
……
……
Signal(s);
Signal(s);
Signal(s);
Signal(s);
Signal(s);
Signal(s);
……
……
——记录型信号量机制无法解决
22
解决方法二
And信号量机制无法解决
And信号量——为资源R设置信号量S,初始值5
process B:
wait (Dmutex);
wait(Emutex);
wait (Emutex);
wait(Dmutex);
若进程A和B按下述次序交替执行wait操作:
process A: wait(Dmutex);于是Dmutex=0 process B: wait(Emutex);于是Emutex=0
29
注意: 1、P1有没有直接前趋,有没有Wait操作,P2 有没有直接后继,有没有Signa操作 2、P1有几个直接后继,有几个signal操作,P2 有几个直接前趋,有介个Wait操作。
P1 P1
进入区(前提):
AND型信号量的基本思想:将进程在整个运行过程中需要的所有资源,一次性 全部地分配给进程,待进程使用完后再一起释放。只要尚有一个资源未能分配 给进程,其他所有可能为之分配的资源,也不分配给它。亦即,对若干个临界 资源的分配,采取了原子操作方式:要么全部分配给进程,要么一个也不分配。
17
3. AND型信号量
20
4.信号量集
问题的引入: 两个优先权相同的进程p1和p2在运行的过程中都
需要使用资源R,如果初始情况系统中有5个资 源 R,P1和P2均需要得到3个R资源才可以执行, 怎么解决?
用信号量机制来解决进程的同步与互斥:PV操作
![用信号量机制来解决进程的同步与互斥:PV操作](https://img.taocdn.com/s3/m/4a509d936edb6f1aff001fe6.png)
用信号量机制来解决进程的同步与互斥:PV操作首先确定进程间的关系,然后确定信号量及其值。
判断进程间是否互斥的关键:看进程间是否共享某一公有资源,一个公有资源与一个信号量相对应。
确定信号量的值是一个关键点,它代表了可用资源实体数。
举例:票大厅容纳的人数限制为20人,少于20人时购票者可以进入,否则要在厅外等候。
进程间是同步时:是否存在合作关系,是否需要互通消息首先判断进程间的关系为同步的,且为各并发进程设置私有信号量,然后为私有信号量赋初值,最后利用PV原语和私有信号量规定各进程的执行顺序。
举例:公交车上司机与售票员的行为,司机到站停车后,售票员方可开门,售票员关门后,司机方可开车。
进程同步应用示例讲解:1桌上有一个盘子,可以存放一个水果。
父亲总是把苹果放在盘子中,母亲总是把香蕉放在盘子中;一个儿子专等吃盘中的香蕉,一个女儿专等吃盘中的苹果。
1)系统要设几个进程来完成这个任务?各自的工作是什么?2)这些进程间有什么样的相互制约关系?3)用P,V操作写出这些进程的同步算法(注:标明信号量的含义)。
1)需要四个进程进程描述:Father:父亲放置苹果的进程;Mother:母亲放置香蕉的进程;Son:儿子吃香蕉的进程;Daughter:女儿吃苹果的进程。
分析:四人公用一个盘子;盘子每次只能放一个水果,当盘子为空时,父母均可尝试放水果,但一次只能有一人成功;盘中是香蕉,儿子吃,女儿等;盘中是苹果,女儿吃,儿子等。
2)进程之间既有互斥又有同步关系。
Father进程和Mother进程要互斥的向盘中放水果,应设置一互斥信号量dish,初值为1,表示盘子为空;Father进程要设置同步信号量apple,用于给Daughter进程传送消息,初值为0,表示还没有消息产生,即没有放苹果;相应Daughter进程也要向父、母进程传送盘子为空的消息。
Mother进程要设置同步信号量banana,用于给Son进程传送消息,初值为0,表示还没有消息产生,即没有放香蕉。
pv例题详解
![pv例题详解](https://img.taocdn.com/s3/m/fe125938a36925c52cc58bd63186bceb19e8eda2.png)
pv例题详解
PV操作是操作系统中的一种常见概念,P表示进程请求资源,V表示进程
释放资源。
在PV操作中,通常使用信号量(semaphore)来实现进程间的同步和互斥。
以下是一个PV操作的示例,解决的是“过独木桥”问题:
假设有两个方向的行人需要过同一座独木桥,当某一方向的行人过桥时,另一方向的行人必须等待。
当某一方向无人过桥时,另一方向的行人可以过桥。
首先,定义两个信号量s1和s2,分别表示是否允许某一方向的行人过桥。
初始时,s1和s2都为0。
然后,定义两个进程,一个是代表东行方向行人的进程,另一个是代表西行方向行人的进程。
东行方向的进程执行以下操作:
1. P(s1):如果s1小于0,表示西行方向的行人正在过桥,东行方向的行人需要等待;否则,继续执行下一步。
2. 过桥:表示东行方向的行人正在过桥。
3. V(s2):释放西行方向的行人的过桥权限,将s2加1。
西行方向的进程执行以下操作:
1. P(s2):如果s2小于0,表示东行方向的行人正在过桥,西行方向的行人需要等待;否则,继续执行下一步。
2. 过桥:表示西行方向的行人正在过桥。
3. V(s1):释放东行方向的行人的过桥权限,将s1加1。
通过以上操作,可以保证同一方向的行人连续过桥,当某一方向有人过桥时,另一方向的行人必须等待;当某一方向无人过桥时,另一方向的行人可以过桥。
以上是一个简单的PV操作示例,实际应用中需要根据具体问题进行分析和设计。
第8章 死锁习题及答案
![第8章 死锁习题及答案](https://img.taocdn.com/s3/m/c126144c2e3f5727a5e96215.png)
第八章死锁习题及答案一、填空题1.进程的“同步”和“互斥”反映了进程间①和②的关系。
【答案】①直接制约、②间接制约【解析】进程的同步是指在异步环境下的并发进程因直接制约而互相发送消息,进行相互合作、相互等待,使得各进程按一定的速度执行的过程;而进程的互斥是由并发进程同时共享公有资源而造成的对并发进程执行速度的间接制约。
2.死锁产生的原因是①和②。
【答案】①系统资源不足、②进程推进路径非法【解析】死锁产生的根本原因是系统的资源不足而引发了并发进程之间的资源竞争。
由于资源总是有限的,我们不可能为所有要求资源的进程无限地提供资源。
而另一个原因是操作系统应用的动态分配系统各种资源的策略不当,造成并发进程联合推进的路径进入进程相互封锁的危险区。
所以,采用适当的资源分配算法,来达到消除死锁的目的是操作系统主要研究的课题之一。
3.产生死锁的四个必要条件是①、②、③、④。
【答案】①互斥条件、②非抢占条件、③占有且等待资源条件、④循环等待条件【解析】互斥条件:进程对它所需的资源进行排它性控制,即在一段时间内,某资源为一进程所独占。
非抢占条件:进程所获得的资源在未使用完毕之前,不能被其它进程强行夺走,即只能由获得资源的进程自己释放。
占有且等待资源条件:进程每次申请它所需的一部分资源,在等待新资源的同时,继续占有已分配到的资源,循环等待条件:存在一进程循环链,链中每一个进程已获得的资源同时被下一个进程所请求。
4.在操作系统中,信号量是表示①的物理实体,它是一个与②有关的整型变量,其值仅能由③原语来改变。
【答案】①资源,②队列,③P-V【解析】信号量的概念和P-V原语是荷兰科学家E.W.Dijkstra提出来的。
信号量是一个特殊的整型量,它与一个初始状态为空的队列相联系。
信号量代表了资源的实体,操作系统利用它的状态对并发进程共享资源进行管理。
信号量的值只能由P-V原语来改变。
5.每执行一次P原语,信号量的数值S减1。
如果S>=0,该进程①;若S<0,则②该进程,并把它插入该③对应的④队列中。
进程同步与互斥问题
![进程同步与互斥问题](https://img.taocdn.com/s3/m/03105c395bcfa1c7aa00b52acfc789eb172d9ef5.png)
p1() {
while(1) {
洗桔子; P(m1) ; 放桔子; V(m3) ; } }
p2() {
while(1) {
洗苹果 ; P(m1); 放苹果; V(m2); } }
p3() {
while(1) {
P(m2) ; 取苹果; V(m1); 吃苹果;
} }
p4() {
while(1) {
P(m3) ; 取桔子; V(m1); 吃桔子;
p3() {
while(1) {
P(m2) ; 取水果; V(m1); 吃水果;
} }
进程的同步
分析:父母亲先放水果,儿子再取水果吃;父亲与儿子,母 亲与儿子是一个同步关系,父亲与母亲要竞争空盘子。
解法二:设信号量m1表示父亲或母亲放完水果,信号量m2 表示儿子取完水果。
int m1=0,m2=1; cobegin
放水果; }
吃桔子; }
吃苹果; }
进程的同步
分析:父亲先放水果,儿子女儿再吃水果;儿子女儿取完水 果,父亲再放水果,这三个进程是一个同步关系。
解法一:设信号量m1表示父亲能否放水果,m2表示儿子能 否取桔子,m3表示女儿能否取苹果。
int m1=1,m2=0,m3=0;
cobegin
p1() // p2() // p3()
} }
例3-4:吃水果。 父亲 母亲
进程的同步
女儿 桔 苹0子 果
儿子
父亲 P1 while(true) {
洗桔子;
母亲 P2 while (true) {
洗苹果;
放桔子; }
放苹果; }
儿子 P3 while(true) {
取苹果;
第五章互斥与同步-PPT课件
![第五章互斥与同步-PPT课件](https://img.taocdn.com/s3/m/bc78f6ecaa00b52acfc7cae6.png)
5.4 信号量
3.整型信号量 整型信号量是通过定义一个整型变量,如s ,和 两个标准的原子操作wait(s)和 signal(s)来 对s进行减1和增1操作,以实现对临界资源的 访问控制。这两个原子操作习惯上分别被称为 P操作和V操作。 两种实现方式:忙等待与阻塞等待。
Pi:
while(true) {… while(flag[j]);/*执行空语句等待*/ flag[i]=true; 执行csi /* 进程Pi的临界区*/ flag[i]=false;/*释放临界资源*/ …}
5.3 互斥
(2)用一个turn来指示哪个进程应该进入临界 区,turn=i表示pi可以进入临界区。
(2)硬件指令的方法
TS(Test-and Set)指令 bool founction TS (bool flag) { TS =flag; flag=true;/*关闭临界区*/ }
2.互斥的硬件解决方法
例:用TS硬件指令方法实现互斥
while(true) {while(TS(lock)); 执行csi lock=false; ……}
Pi: While(true) {… while(turn!=i); /*执行空语句等待*/ 执行csi; /*临界区*/ turn=j; /* (j!=i) 释放临界资源*/ … } 强制在两个进程之间轮换,不能满足空闲让进的原则!
(3)Dekker的软件解决方法(一种正确的方法) 初始化:flag[0]=flag[1]=false;turn可以为0或1; Pi: while(true) {flag[i]=true;/*标识想进入临界区的进程*/ while(flag[j]) {if(turn==j) { flag[i]=false; while(turn==j); flag[i]=true; }} 执行csi /*执行临界区代码*/ turn=j;flag[i]=false; …… }
操作系统原理 第四章 进程通信
![操作系统原理 第四章 进程通信](https://img.taocdn.com/s3/m/e88915315f0e7cd1842536bb.png)
一、进程的同步和互斥
1、进程的间的相互作用 相关进程:逻辑上具有某种联系的进程 无关进程:逻辑上没有任何联系的进程
2、相关进程间的关系 1)直接作用(相互合作) 同步关系:合作进程之间再执行次序上 的协调关系 2)间接作用(资源共享) 互斥关系:一个进程正在访问共享资源, 另一个要访问该资源的进程必须等待。
利用TS指令实现的进程互斥算法是:每个临界资源设 置一个公共布尔变量lock,True表示正被占用,False 表示空闲,初值为False. 进程使用临界资源时,应该按照如下三步: 1)测试lock值,如果为真,表示资源已经被占用,则不 断等待测试;如果为假,则表示资源可用,这时候把 lock 设置为真,用来排斥其他进程使用资源,我们可 以把这个过程叫做关锁。 2)进程进入临界区,访问临界资源 3)使用完毕,推出临界区,再把lock设置为假,以释放 资源,让其他进程使用。这个过程可以叫做开锁。
为了让缓冲区得到循 环利用,将缓冲区做 成环形的,以方便每 个区域都可以循环利 用
• 采用信号量机制: – full是"满"缓冲区数目,初值为0,empty 是"空"缓冲区数目,初值为N。记为同步 信号量。实际上, full 和 empty 是同一个 含义:full + empty == N – mutex用于访问缓冲区时的互斥,初值 是1 另外设置整形变量in,out,分别用于指示 空缓冲区和满缓冲区的位置
wait 和 signal 操作必须成对出现,有一个 wait操作就有一个 signal操作,当为互斥 操作时,他们处于同一个进程,当为同 步操作时,则不在一个进程出现。
3 、AND信号量集机制 信号量集用于同时需要多个资源时的信号量操 作 AND型信号量集用于同时需要多种资源且每种 占用一个时的信号量操作; • 一段处理代码需要同时获取两个或多个临界 资源――可能死锁:各进程分别获得部分临界 资源,然后等待其余的临界资源,"各不相让"
《进程同步与互斥》课件
![《进程同步与互斥》课件](https://img.taocdn.com/s3/m/4d78690a326c1eb91a37f111f18583d049640f02.png)
消息传递的方式
包括发送和接收消息,以 及处理消息队列。
消息传递的作用
通过发送和接收消息,进 程可以交换信息,协调彼 此的行为,实现进程同步 。
共享内存机制
共享内存定义
多个进程共享同一块内存区域,通过 该区域进行通信。
共享内存的访问规则
共享内存的作用
通过共享内存,进程可以直接读写共 享数据,实现快速的数据交换和同步 。
学家都能进餐。这需要使用同步和互斥机制来控制哲学家进程的执行顺序。
05
进程同步与互斥的案例分析
基于信号量的进程同步案例
总结词
通过使用信号量作为同步机制,实现多个进程对 共享资源的正确访问。
总结词
通过使用信号量来控制进程的执行顺序,保证某 些进程必须先于其他进程执行。
详细描述
一个经典案例是生产者-消费者问题,其中生产者 和消费者共享一个有限的缓冲区。使用信号量来 控制生产者和消费者对缓冲区的访问,确保不会 发生溢出或饥饿现象。
哲学家就餐问题
总结词
哲学家就餐问题是进程同步与互斥问题中的一种经典问题,涉及到五个哲学家围坐在圆 桌旁,思考和进餐的哲学行为。
详细描述
哲学家就餐问题描述了一个场景,其中五个哲学家围坐在圆桌旁,他们有时思考,有时 进餐。餐桌中央有一盘意大利面,每位哲学家之间有一只叉子。如果一个哲学家要进餐 ,他需要同时拿起左右两只叉子。为了防止产生死锁,需要设计一种策略来确保所有哲
读者写者问题
总结词
读者写者问题是另一个经典的进程同步与互 斥问题,涉及到多个读者进程和写者进程对 共享资源的访问。
详细描述
读者写者问题描述了一个场景,其中多个读 者进程可以同时访问共享资源,但写者进程 在修改共享资源时需要独占式的访问。为了 维护数据的一致性和完整性,需要使用同步 和互斥机制来控制读者和写者进程的访问顺 序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告1、实验名称进程间的互斥和同步2、小组成员:姓名+学号3、实验目的Linux命名信号量实现进程间的互斥和同步4、实验背景知识进程同步也是进程之间直接的制约关系,是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系。
进程间的直接制约关系来源于他们之间的合作。
比如说进程A需要从缓冲区读取进程B产生的信息,当缓冲区为空时,进程B因为读取不到信息而被阻塞。
而当进程A产生信息放入缓冲区时,进程B才会被唤醒。
进程互斥是进程之间的间接制约关系。
当一个进程进入临界区使用临界资源时,另一个进程必须等待。
只有当使用临界资源的进程退出临界区后,这个进程才会解除阻塞状态。
比如进程B需要访问打印机,但此时进程A占有了打印机,进程B会被阻塞,直到进程A释放了打印机资源,进程B才可以继续执行。
5、实验步骤演示大概步骤:先进行单次同步,把信号量先初始化为0,创建一个命名信号量,设置信号捕捉处理代码,安装捕捉信号;其次使用信号量进行同步和互斥的操作。
详细步骤:1.创建一个命名信号量,sem = sem_open(SEM_NAME, OPEN_FLAG, OPEN_MODE, INIT_V);2.创建子进程,pid = fork();3.V操作,sem_post(sem);4.P操作,sem_wait(sem);5.等待子进程结束,wait(&status);6.删掉在系统创建的信号量,sem_unlink(SEM_NAME);7.彻底销毁打开的信号量,sem_close(sem);8.信号捕捉处理,static void myhandler(void);9.迭代同步,两个信号量,开始时一个为1,一个为0,一个进程执行完换另一个执行;10.安装捕捉信号,signal(SIGINT,(void *)myhandler );11.创建一个命名信号量:sem1 = sem_open(SEM_NAME1, OPEN_FLAG, OPEN_MODE, 1);sem2 = sem_open(SEM_NAME2, OPEN_FLAG, OPEN_MODE, 0);12.创建子进程,pid = fork();13.if(0 == pid)P操作:sem_wait(sem1);V操作:sem_post(sem2);14.if(0 < pid)P操作:sem_wait(sem2);V操作:sem_post(sem1);15.static void mysem(char *str){int i = 0;//P操作sem_wait(sem);while('\0' != str[i]){printf("%c\n", str[i++]);sleep(1);}//V操作sem_post(sem);}进程排斥,在临界区设置PV操作16.创建一个命名信号量,sem = sem_open(SEM_NAME, OPEN_FLAG, OPEN_MODE, INIT_V);17.if(0 == pid){mysem("abcd");}18.if(0 < pid){mysem("1234");//等待子进程结束wait(&status);//删掉在系统创建的信号量sem_unlink(SEM_NAME);//彻底销毁打开的信号量sem_close(sem);}说明:命名信号量不带内存共享,编译时要带库文件-lpthread或-lrtint sem_wait(sem_t *sem); //P操作,若是信号量大于零则减一,否则阻塞在该函数位置等待.int sem_post(sem_t *sem); //V操作,信号量加一sem_t *sem_open(const char *name, int oflag);//打开信号量,flag参数与打开普通文件的标记一样sem_t *sem_open(const char *name, int oflag,mode_t mode, unsigned int value); //创建并打开信号量,value参数指的是信号量的初始值int sem_unlink(const char *name);//删除系统创建的信号量int sem_close(sem_t *sem);//关闭彻底销毁信号量6、实验源码#include <stdio.h>#include <errno.h>#include <semaphore.h>#include <fcntl.h>#define SEM_NAME "mysem"#define OPEN_FLAG O_RDWR|O_CREAT#define OPEN_MODE 00777#define INIT_V 0static sem_t *sem = NULL;static void mysem(char *str){int i = 0;while('\0' != str[i]){printf("%c\n", str[i++]);sleep(1);}}/*单次同步, 把信号量先初始化为0*/int main(void){pid_t pid = -1;int ret = -1;int status = -1;//创建一个命名信号量sem = sem_open(SEM_NAME, OPEN_FLAG, OPEN_MODE, INIT_V);//创建子进程pid = fork();if(-1 == (ret = pid)){perror("fork failed: ");goto _OUT;}if(0 == pid){mysem("abcd");//V操作sem_post(sem);}if(0 < pid){//P操作sem_wait(sem);mysem("1234");//等待子进程结束wait(&status);//删掉在系统创建的信号量sem_unlink(SEM_NAME);//彻底销毁打开的信号量sem_close(sem);}_OUT:return ret;}#include <stdio.h>#include <errno.h>#include <semaphore.h>#include <fcntl.h>#include <signal.h>#define SEM_NAME1 "mysem1"#define SEM_NAME2 "mysem2"#define OPEN_FLAG O_RDWR|O_CREAT#define OPEN_MODE 00777static sem_t *sem1 = NULL;static sem_t *sem2 = NULL;//临界区static void mysem(char *str){int i = 0;while('\0' != str[i]){printf("%c\n", str[i++]);sleep(1);}}//信号捕捉处理static void myhandler(void){//删掉在系统创建的信号量sem_unlink(SEM_NAME1);sem_unlink(SEM_NAME2);//彻底销毁打开的信号量sem_close(sem1);sem_close(sem2);}/*迭代同步,两个信号量,开始时一个为1,一个为0,一个进程执行完换另一个进程运行*/int main(void){pid_t pid = -1;int ret = -1;int status = -1;//安装捕捉信号signal(SIGINT,(void *)myhandler );//创建一个命名信号量sem1 = sem_open(SEM_NAME1, OPEN_FLAG, OPEN_MODE, 1);sem2 = sem_open(SEM_NAME2, OPEN_FLAG, OPEN_MODE, 0);//创建子进程pid = fork();if(-1 == (ret = pid)){perror("fork failed: ");goto _OUT;}if(0 == pid){while(1){//P操作sem_wait(sem1);mysem("abcd");//V操作sem_post(sem2);}}if(0 < pid){while(1){//P操作sem_wait(sem2);mysem("1234");//V操作sem_post(sem1);}//等待子进程结束wait(&status);}_OUT:return ret;}#include <stdio.h>#include <errno.h>#include <semaphore.h>#include <fcntl.h>#define SEM_NAME "mysem"#define OPEN_FLAG O_RDWR|O_CREAT#define OPEN_MODE 00777#define INIT_V 1static sem_t *sem = NULL;static void mysem(char *str){int i = 0;//P操作sem_wait(sem);while('\0' != str[i]){printf("%c\n", str[i++]);sleep(1);}//V操作sem_post(sem);}/*进程排斥,在临界区设置PV操作*/int main(void){pid_t pid = -1;int ret = -1;int status = -1;//创建一个命名信号量sem = sem_open(SEM_NAME, OPEN_FLAG, OPEN_MODE, INIT_V);//创建子进程pid = fork();if(-1 == (ret = pid)){perror("fork failed: ");goto _OUT;}if(0 == pid){mysem("abcd");}if(0 < pid){mysem("1234");//等待子进程结束wait(&status);//删掉在系统创建的信号量sem_unlink(SEM_NAME);//彻底销毁打开的信号量sem_close(sem);}_OUT:return ret;}。