进程同步与互斥处理
第三章进程管理4(同步和互斥1)

1
进 程 管 理
执行
挂起
激活 活动就绪 挂起 释放 激活 活动阻塞 静止阻塞 释放 静止就绪
挂起
2
进 程 管 理
创建和撤销 阻塞和唤醒 挂起和激活
3
进 程 管 理
3.5 进程的同步与互斥
进程的同步和互斥机制的主要任务:控 制并发执行的诸进程之间能有效地共享 和相互协作,同时使并发执行的程序仍 具有可再现性。 进程互斥 进程同步 利用信号量机制解决具体问题
9
进 程 管 理
一种简便的实现方法是: 一种简便的实现方法是:
lock(x)= begin local v repeat v x until v=1 (临界资源成为可用) 临界资源成为可用) 临界资源成为可用 x 0 end
10
进 程 管 理
不过,这种方法是不能保证并发进程互斥执 不过,这种方法是不能保证并发进程互斥执 行所要求的准则( 行所要求的准则(3)的(只允许一个进程进入 临界区)。为了解决这个问题, )。为了解决这个问题 临界区)。为了解决这个问题,有些机器在硬件 中设置了“测试与设置(test set)指令 指令” 中设置了“测试与设置(test and set)指令”。 此外,有一点需要注意的是: 此外,有一点需要注意的是:在系统试验时锁定 key[S]总是设置在公有资源所对应的数据结构 为key[S]总是设置在公有资源所对应的数据结构 中的。 中的。
23
进 程 管 理
s.value的物理含义
当s.value>0数值时,表示某类可用资源的数量。 而当s.value<0数值时,表示该类资源已分配完。 若有进程请求该类资源,则被阻塞,其绝对值 等于等待该类资源的进程数。 每次的P(s)操作,意味着进程请求分配该类资 源的一个单位资源。相反,执行一次V(s) 操作 意味着进程释放相应资源的一个单位资源。当 值小于等于0时,表明有进程被阻塞,需要唤 醒。
实验、进程的同步与互斥——生产者消费者

实验、进程的同步与互斥——⽣产者消费者1. 1. 实验⽬的两个或两个以上的进程,不能同时进⼊关于同⼀组共享变量的临界区域,否则可能发⽣与时间有关的错误,这种现象被称作进程互斥。
对CPU的速度和数⽬不做出任何假设的前提下,并发进程互斥访问临界资源,是⼀个较好的解决⽅案。
另外,还需要解决异步环境下的进程同步问题。
所谓异步环境是指:相互合作的⼀组并发进程,其中每⼀个进程都以各⾃独⽴的、不可预知的速度向前推进;但它们⼜需要密切合作,以实现⼀个共同的任务,即彼此“知道”相互的存在和作⽤。
实验⽬的:分析进程争⽤资源的现象,学习解决进程同步与互斥的⽅法。
本实验属于设计型实验,实验者可根据⾃⾝情况选⽤合适的开发环境和程序架构。
1. 2. 实验原理信号量的PV操作与处理相关,P表⽰通过的意思,V表⽰释放的意思。
1962年,狄克斯特拉离开数学中⼼进⼊位于荷兰南部的艾恩德霍芬技术⼤学(Eindhoven Technical University)任数学教授。
在这⾥,他参加了X8计算机的开发,设计与实现了具有多道程序运⾏能⼒的操作系统——THE Multiprogramming System。
THE是艾恩德霍芬技术⼤学的荷兰⽂Tchnische Hoogeschool Eindhov –en的词头缩写。
狄克斯特拉在THE这个系统中所提出的⼀系统⽅法和技术奠定了计算机现代操作系统的基础,尤其是关于多层体系结构,顺序进程之间的同步和互斥机制这样⼀些重要的思想和概念都是狄克斯特拉在THE中⾸先提出并为以后的操作系统如UNIX等所采⽤的。
为了在单处理机的情况下确定进程(process)能否占有处理机,狄克斯特拉将每个进程分为“就绪”(ready)、“运⾏”(running)和“阻塞”(blocking)三个⼯作状态。
由于在任⼀时刻最多只有⼀个进程可以使⽤处理机,正占⽤着处理机的进程称为“运⾏”进程。
当某进程已具备了使⽤处理机的条件,⽽当前⼜没有处理机供其使⽤,则使该进程处于“就绪”状态。
操作系统第6章 进程互斥与同步

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; }
第4章 进程的同步与互斥

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的同步。(练 习)
进程之间同步和互斥的区别和联系

进程之间同步和互斥的区别和联系
1.同步是指多个进程之间按照一定的顺序执行,互斥是指多个进程之间不能同时访问共享资源。
2. 同步是为了保证进程之间执行顺序的正确性,互斥是为了避免多个进程同时访问共享资源导致数据不一致。
3. 同步机制可以通过信号量、事件、条件变量等方式实现,互斥机制通常使用互斥锁来实现。
联系:
1. 在多进程环境中,同步和互斥是相辅相成的,两者都是为了保证程序的正确性和安全性。
2. 互斥是同步的一种特殊形式,它是为了保证同步进行而采取的措施。
3. 同步和互斥都需要协调多个进程之间的关系,从而达到正确、高效地完成任务的目的。
总之,同步和互斥是操作系统中两个重要的概念,它们的区别在于同步是为了保证执行顺序的正确性,互斥是为了避免多个进程同时访问共享资源导致数据不一致,但是它们在多进程环境中都是相辅相成的。
- 1 -。
利用信号量和PV操作实现进程互斥和同步问题

临界区; 临界区; 临界区;
V(S); V(S); V(S);
…… …… …… ……
V(S):①将信号量S的值加1,即S=S+1;
②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。
PV操作的意义:我们用信号量及PV操作来实现进程的同步和互斥。PV操作属于进程的低级通信。
什么是信号量?信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。
在计算机操作系统中,PV操作是进程管理中的难点。
首先应弄清PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:
P(S):①将信号量S的值减1,即S=S-1;
ห้องสมุดไป่ตู้
②如果S>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
一般来说,信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S=<0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。
其中信号量S用于互斥,初值为1。
使用PV操作实现进程互斥时应该注意的是:
(1)每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。
详解进程同步与互斥机制

详解进程同步与互斥机制⽬录⼀、什么是进程同步⼆、什么是进程互斥三、常见的进程同步与互斥机制⼀、什么是进程同步在多道批处理系统中,多个进程是可以并发执⾏的,但由于系统的资源有限,进程的执⾏不是⼀贯到底的,⽽是⾛⾛停停,以不可预知的速度向前推进,这就是进程的异步性。
那么,进程的异步性会带来什么问题呢?举个例⼦,如果有 A、B 两个进程分别负责读和写数据的操作,这两个线程是相互合作、相互依赖的。
那么写数据应该发⽣在读数据之前。
⽽实际上,由于异步性的存在,可能会发⽣先读后写的情况,⽽此时由于缓冲区还没有被写⼊数据,读进程 A 没有数据可读,因此读进程 A 被阻塞。
进程同步(synchronization)就是⽤来解决这个问题的。
从上⾯的例⼦我们能看出,⼀个进程的执⾏可能影响到另⼀个进程的执⾏,所谓进程同步就是指协调这些完成某个共同任务的并发线程,在某些位置上指定线程的先后执⾏次序、传递信号或消息。
再举个⽣活中的进程同步的例⼦,你想要喝热⽔,于是你打了⼀壶⽔开始烧,在这壶⽔烧开之前,你只能⼀直等着,⽔烧开之后⽔壶⾃然会发⽣响声提醒你来喝⽔,于是你就可以喝⽔了。
就是说⽔烧开这个事情必须发⽣在你喝⽔之前。
注意不要把进程同步和进程调度搞混了:进程调度是为了最⼤程度的利⽤ CPU 资源,选⽤合适的算法调度就绪队列中的进程。
进程同步是为了协调⼀些进程以完成某个任务,⽐如读和写,你肯定先写后读,不能先读后写吧,这就是进程同步做的事情了,指定这些进程的先后执⾏次序使得某个任务能够顺利完成。
⼆、什么是进程互斥同样的,也是因为进程的并发性,并发执⾏的线程不可避免地需要共享⼀些系统资源,⽐如内存、打印机、摄像头等。
举个例⼦:我们去学校打印店打印论⽂,你按下了 WPS 的 “打印” 选项,于是打印机开始⼯作。
你的论⽂打印到⼀半时,另⼀位同学按下了 Word 的 “打印” 按钮,开始打印他⾃⼰的论⽂。
想象⼀下如果两个进程可以随意的、并发的共享打印机资源,会发⽣什么情况?显然,两个进程并发运⾏,导致打印机设备交替的收到 WPS 和 Word 两个进程发来的打印请求,结果两篇论⽂的内容混杂在⼀起了。
05进程管理三互斥和同步一

23
记录型信号量和wait、signal原语
• 信号量是一个确定的二元组(value, L), value 是一个具有非负初值的整型变量,L 是 一个初始状态为空的队列。 • value代表资源的实体。在实际应用中应准确地说
明s的意义和初值,每个信号量都有一个队列,其初 始状态为空。 – 初始化指定一个非负整数值,表示空闲资源总数 (又称为"资源信号量")--若为非负值表示当前 的空闲资源数,若为负值其绝对值表示当前等待 临界区的进程数
17
2.3.2 信号量(semaphore)
二、利用整型信号量实现互斥
Begin Repeat … wait(mutex); Critical section Signal(mutex) Remainder section Until false; end
while mutex≤0 do no-op mutex:=mutex-1. mutex:=mutex+1
20
a S2
d S4 S5
S1 b S3
c
g f e S6
21
利用信号量来描述前趋关系---例2 var a,b,c,d,e,f,g:semaphore:=0,0,0,0,0,0; begin prabegin begim s1;signal(a);signal(b);end; begin wait(a);s2;signal(c);signal(d);end; begin wait(b);s3;signal(g);end; begin wait(c);s4;signal(e);end; begin wait(d);s5;signal(f);end; begin wait(e); wait(f); wait(g);s6;end. parend end.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.主要功能模块的功能
写入数据_Get 进程 读取数据和处理数据_Process 进程
3.主程序的流程及各程序模块之间的层次关系
创建 Get 进程、Process 进程 控制程序运行时间 消除进程
三.详细设计
1.相关进程功能
写入数据_Get 进程 读取数据和处理数据_Process 进程
void collectBuffer() { frame_size = rand() % 600; buNum++; in=(in+1)%Queue_size; buffer[in]=frame_size; }
//数据采集 //产生数据帧大小的随机数
//****************Get 进程******************* DWORD WINAPI Get(LPVOID pParm){ while(1){ WaitForSingleObject(empty,INFINITE); //P(empty)生产者信号量-1 WaitForSingleObject(mutex,INFINITE); //P(mutex)获取线程间互斥信号 collectBuffer(); cout<<" 新 数 据 帧 大 小 "<<frame_size<<" Byte,"<<" 待 处 理 数 据 帧 数 目 为 "<<buNum<<endl; ReleaseMutex(mutex); //V(mutex)释放线程间互斥信号 ReleaseSemaphore(full,1,NULL); //V(full)消费者信号量+1 Sleep(collectstep_time); //采集数据间隔 } return 0; } //************Process 进程************ DWORD WINAPI Process(LPVOID pParm){ while(1){ out=(out+1)%Queue_size; WaitForSingleObject(full,INFINITE); //P(full)消费者信号量-1 WaitForSingleObject(mutex,INFINITE); //P(mutex) 获得线程间互斥 信号 cout<<" 正 在 处 理 大 小 "<<buffer[out]<<" Byte,"<<" 处 理 时 间 为 "<<buffer[out]*3<<"ms, 请稍后。 。 。"<<endl; buNum--; ReleaseMutex(mutex); //V(mutex)释放线程间互斥信号 ReleaseSemaphore(empty,1,NULL); //V(empty)生产者信号量+1 Sleep(buffer[out]*3); //处理数据
} return 0; } //************主进程************ int main(){ //创建进程 HANDLE hThread1=CreateThread(NULL, 0, Get,NULL,0,NULL); HANDLE hThread2=CreateThread(NULL,0, Process,NULL,0,NULL); //控制程序运行时间 Sleep(TimeLimit); //消除进程 CloseHandle(hThread1); CloseHandle(hThread2); cout<<endl<<"……Time is up. Exit……"<<endl; return 0; }
五、 使用说明及测试结果
1.使用说明:
点击打开应用程序 proj3.exe。程序将会运行,15s 后停止运行,运 行界面如下两幅图:
六、 源程序
#include<iostream> #include<windows.h> using namespace std; typedef int semaphore; int frame_size; const int process_time=3; const int collectstep_time=500; const int TimeLimit=15000; const int Queue_size=10; //定义互斥信号量访问临界资源 HANDLE mutex=CreateMutex(NULL, false, "mutex"); //信号量 full: 缓冲池中等待处理的数据帧数,初值为 0 HANDLE full=CreateSemaphore(NULL, 0, Queue_size, "full"); //信号量 empty: 空余的缓冲区数,初值为 Queue_size 大小 HANDLE empty=CreateSemaphore(NULL, Queue_size, Queue_size, "empty");
//P(full)消费者信号量-1 //P(mutex)获得线程间互斥信号 Byte,"<<" 处 理 时 间 为
//V(mutex)释放线程间互斥信号 //V(empty)生产者信号量+1 //处理数据
四.分析
1.根据执行过程(程序输出结果) ,分析存在的问题。 有输出结果可以看出, 由于缓冲区大小有限, 当数据过大, 处理时间过长是, 缓冲区会出现拥挤的状态,即无法读入数据,是写入数据的进程被挂起。 为了解决这一问题,可以考虑增大缓冲区的容量,但是实践可知,只要时间 不断走下去,不管缓冲区多大,到一定时间后总会变满。分析可知,只要减小数 据的大小,或者减小处理数据的时间,就可以解决这一问题。
实验题目:进程同步与互斥处理
数据采集进程 获取前置机传来的数据帧并存放在等待缓冲池
中,如图1 所示。等待缓冲池由10 个缓冲区组成环形队列,每 个缓冲区只允许存放1 个待处理的数据帧, 当缓冲池满时不允许 继续存放数据帧。
数据处理进程只有在缓冲池有待处理的数据帧时才不断读取缓
冲区中的数据帧,并进行处理。
4.PV 操作的使用
//****************Get 进程******************* DWORD WINAPI Get(LPVOID pParm){ while(1){ WaitForSingleObject(empty,INFINITE); /P(empty)生产者信号量-1 WaitForSingleObject(mutex,INFINITE); //P(mutex)获取线程间互斥信号 collectBuffer(); cout<<" 新 数 据 帧 大 小 "<<frame_size<<" Byte,"<<" 待 处 理 数 据 帧 数 目 为 "<<buNum<<endl; ReleaseMutex(mutex); //V(mutex)释放线程间互斥信号 ReleaseSemaphore(full,1,NULL); //V(full)消费者信号量+1 Sleep(collectstep_time); //采集数据间隔 } return 0; } //************Process 进程************ DWORD WINAPI Process(LPVOID pParm){ while(1){ out=(out+1)%Queue_size; WaitForSingleObject(full,INFINITE); WaitForSingleObject(mutex,INFINITE); cout<<" 正 在 处 理 大 小 "<<buffer[out]<<" "<<buffer[out]*3<<"ms, 请稍后。 。 。"<<endl; buNum--; ReleaseMutex(mutex); ReleaseSemaphore(empty,1,NULL); Sleep(buffer[out]*3); } return 0; }
2.进程间同步/互斥关系
1
题目中要求缓冲区是临界资源, 写入数据帧时不能进行数据帧的读取, 同时,
读取数据帧时也不能进行数据帧的写入, 所以, 数据读取和数据写入是一队互斥的进程。 因此可以定义一个互斥信号量,对其进行 PV 操作以实现两个进程之间互斥。
2
由于题目中定义的缓冲区只能存放十个数据,一次读入只能读取一个数据,
一.实验要求:
1) 缓冲区是临界资源,写入数据帧时不能进行数据帧的读取, 同时,读取数据帧时也不能进行数据帧的写入,读取/写入数据 帧的时间延时可忽略不计; 2) 数据采集进程每次从前置机获取的数据帧大小随机产生, 但不大于600Byte,两次数据采集的时间间隔为500ms(注意:在 此时间间隔内不占用缓冲区) ; 3) 数据处理进程只在读取数据帧的时候占用临界资源,数据 处理过程中并不占用缓冲区,数据帧的处理时间跟其大小成正 比,每Byte 的处理时间为3ms。
二、 概要设计
1.方案分析
题目中要求缓冲区是临界资源,写入数据帧时不能进行数据帧的读取,同时, 读取数据帧时也不能进行数据帧的写入, 所以, 数据读取和数据写入是一队互斥的进程。 因此可以定义一个互斥信号量,对其进行 PV 操作以实现两个进程之间互斥。 2 由于题目中定义的缓冲区只能存放十个数据,一次读入只能读取一个数据,一 次写入也只能一个数据,当缓冲区满了就不在写入,缓冲区空就不在读取。为了实现其 中的同步关系,我们定义两个信号量,表示缓冲区的状态,对其分别作 PV 操作。