经典的进程同步问题
- 格式:ppt
- 大小:167.50 KB
- 文档页数:39
进程同步——经典的同步问题本⽂为博主原创⽂章,未经博主允许不得转载涉及进程同步的⼀些概念:互斥与同步:临界资源(临界区):指⼀次只能允许⼀个进程使⽤的共享资源称为临界资源;同步:指为完成某种任务⽽建⽴的两个和多个进程,这些进程在合作的过程中需要协调⼯作次序进⾏有序的访问⽽出现等待所产⽣的制约关系。
互斥:指两个或多个进程访问临界资源时只能⼀个进程访问,其他进程等待的⼀种相互制约的关系。
信号量与互斥量:信号量:本⾝是⼀个计数器,使⽤P,V两个操作来实现计数的减与加,当计数不⼤于0时,则进程进⼊睡眠状态,它⽤于为多个进程提供共享数据对象的访问。
互斥量:如果信号量只存在两个状态,那就不需要计数了,可以简化为加锁与解锁两个功能,这就是互斥量。
⼀、⽣产者与消费者问题问题描述:⼀组⽣产者进程和⼀组消费者进程共享⼀块初始为空,⼤⼩确定的缓冲区,只有当缓冲区为满时,⽣产者进程才可以把信息放⼊缓冲区,否则就要等待;只有缓存区不为空时,消费者进程才能从中取出消息,否则就要等待。
缓冲区⼀次只能⼀个进程访问(临界资源)。
问题分析:⽣产者与消费者进程对缓冲区的访问是互斥关系,⽽⽣产者与消费者本⾝⼜存在同步关系,即必须⽣成之后才能消费。
因⽽对于缓冲区的访问设置⼀个互斥量,再设置两个信号量⼀个记录空闲缓冲区单元,⼀个记录满缓冲区单元来实现⽣产者与消费者的同步。
问题解决:伪代码实现semaphore mutex=1;semaphore full=0; //满缓冲区单元semaphore empty=N; //空闲缓冲区单元prodecer(){while(1){P(empty);P(mutex);add_source++;V(mutex);V(full);}}consumer(){while(1){P(full);P(mutex);add_source--;V(mutex);V(empty);}}⼆、读者与写者问题问题描述:有读者与写者两个并发进程共享⼀个数据,两个或以上的读进程可以访问数据,但是⼀个写者进程访问数据与其他进程都互斥。
第五讲进程管理之经典的同步问题上一讲我们学习了进程同步和信号量,知道了进程同步的愿意和意义。
做了一些例子和习题。
现在了解几个经典的问题【例1】生产者-消费者问题我们把进程同步问题一般化,可以得到一个抽象的一般模型,也就是生产者-消费者问题。
生产者-消费者问题是一种同步问题的抽象描述。
此问题是一个标准的同步编程问题。
b5E2RGbCAP1、问题描述描述一组生产者向一组消费者提供消息,它们共享一个有界缓冲池包括N个缓冲区,生产者向其中<有界缓冲池)投放消息,消费者从中取得消息。
不允许消费者进程到一个空缓冲区去取产品;也不允许生产者进程向一个已装满产品且尚未取走的缓冲区中放产品。
这句话很重要,说明是是进程同步问题。
p1EanqFDPw2、问题说明:计算机系统中,每个进程都申请使用和释放各种不同类型的资源。
这些资源可能是外设、内存及缓冲区这样的硬件资源,也可能是临界区、数据等软件资源。
我们把系统中使用某一类资源的进程成为该资源的消费者。
把释放同类资源的进程成为该资源的生产者。
DXDiTa9E3d举个例子:如计算进程Pc和打印进程Pp就是公用一个缓冲区。
Pc把数据送入缓冲区,Pp从缓冲区取数据打印输出,所以,Pc 是数据资源的生产者,Pp是数据资源的消费者。
RTCrpUDGiT3、各种情况下的生产者-消费者问题。
深入地分析和透彻地理解这个例子,对于全面解决操作系统内的同步、互斥问题将有很大帮助。
(1)一个生产者,一个消费者,公用一个缓冲区。
分析:第一步:明确有哪几个进程,及其之间关系。
现在我们看到题目中只有一个生产者和一个消费者,明确知道有两个进程,生产者为一个进程,消费者为一个进程。
现在来看这两个进程之间关系,首先它们公用一个缓冲区,这个时候看好像是进程互斥,不着急接着看,这两个进程又需要协调,因为只有一个放产品的缓冲区,因此生产一个产品后必须再接着用消费者进程把这个产品拿走消费掉,否则产品没地方放啦。
进程同步互斥经典问题
进程同步互斥经典问题是指在多进程系统中,由于多个进程要共享同一资源,而造成的互斥和同步问题。
其中最为著名的问题就是生产者与消费者问题。
在生产者与消费者问题中,生产者进程负责生产产品并将其放入缓冲区,而消费者进程则负责从缓冲区中取出产品进行消费。
由于缓冲区的容量有限,因此需要保证在缓冲区已满时生产者进程停止生产,而在缓冲区为空时消费者进程停止消费。
为了解决这个问题,可以使用经典的同步互斥算法,如信号量和管程。
信号量是一种可以在多个进程之间共享的计数器,通过对信号量的操作可以实现进程之间的同步和互斥。
而管程则是一种可以对共享变量进行访问控制的数据结构,通过对管程的操作可以确保多个进程之间的同步和互斥。
除了生产者与消费者问题,进程同步互斥经典问题还包括哲学家就餐问题、读者写者问题等。
在实际应用中,需要根据具体的场景选择适合的同步互斥算法,以保证程序的正确性和效率。
- 1 -。
进程同步问题总结进程同步是计算机科学中一个重要的概念,用于解决多个进程共享资源时可能出现的数据竞争和不一致性的问题。
在并发编程中,正确的进程同步机制对于保证系统的正确性和可靠性至关重要。
本文将总结常见的进程同步问题及其解决方案。
1. 互斥问题:当多个进程共享一个临界资源时,可能会发生互斥问题。
如果一个进程占用了临界资源,其他进程就无法使用该资源,导致资源的浪费和性能下降。
解决方案:(1)锁机制:通过使用锁(如互斥锁、自旋锁、读写锁)来保护临界资源。
一旦某个进程获得了锁,其他进程就需要等待,直到锁被释放。
(2)信号量:通过使用信号量来管理对临界资源的访问。
信号量可以用来限制同时访问资源的进程数量。
2. 死锁问题:当多个进程相互等待其他进程释放资源时,可能会发生死锁问题。
即使每个进程都只需要一个资源,但由于资源的分配不当,导致进程无法继续执行。
解决方案:(1)避免循环等待:对于进程需要的资源排序,使得每个进程按照同一种顺序请求资源,从而避免进程之间出现循环等待的情况。
(2)资源预分配:进程在开始执行之前,请求所有需要的资源。
这样可以避免在执行过程中发生资源竞争导致死锁。
(3)超时机制:设定一个等待时间,如果在该时间内没有获得所需资源,就主动释放已获得的资源,并重新开始执行。
3. 竞争条件问题:当多个进程同时竞争访问共享资源时,可能会出现竞争条件问题。
竞争条件指的是多个进程之间的执行顺序会影响最终的结果。
解决方案:(1)原子操作:通过原子操作来确保对共享资源的访问是原子性的,不可中断的。
例如使用原子锁或原子变量等。
(2)同步工具:使用同步工具,如条件变量、屏障等来协调多个进程的执行顺序,以避免竞争条件的出现。
(3)尽量避免共享数据:如果可能的话,尽量避免多个进程之间共享数据,减少竞争条件的发生。
4. 内存一致性问题:在分布式系统中,不同节点的内存可能存在一致性问题。
当一个进程修改了自己所在节点的内存,并且其他节点也有相应的副本时,就可能会出现读取到不一致数据的问题。
操作系统:进程同步三⼤经典问题⽇期:2019/4/15内容:进程同步;⽣产者与消费者;读写者;哲学家进餐;信号量机制。
⼀、⽣产者与消费者问题1.1 版本1代码void producer(){while (count == n);buff[in] = produce_item(); in = (in + 1) % n;count++;}void consumer(){while (count == 0) ;item = buff[out];print(item);out = (out + 1) % n; count--;}存在问题>>两个while循环⼀直在"忙等",不符合进程同步的"让权等待"原则。
>>对于count变量的访问没有保护。
(需要加锁保护)1.2 版本2:使⽤信号量代码semaphore empty = n, full = 0; void producer(){while (true){wait(empty);buffer[in] = produce_item(); in = (in + 1) % n;signal(full);}}void consumer(){while (true){wait(full);item = buffer[out]; print(item);out = (out + 1) % n; signal(empty);}}存在问题>>如果有2个producer进程,empty>=2时,同时进⼊wait(empty)之后的临界区,对于buff的写和in的写产⽣竞争。
>>如果有2个consumer进程,full>=2时,同时进⼊wait(full)之后的临界区,对于out的写产⽣竞争。
1.3 版本3:临界区加锁(正确版本)代码semaphore pmutex = 1, cmutex = 1; semaphore empty = n, full = 0; void producer(){while (true){wait(empty);wait(pmutex);buff[in] = produce_item();in = (in + 1) % n;signal(pmutex);signal(full);}}void consumer(){while (true){wait(full);wait(cmutex);item = buff[out];print(item);out = (out + 1) % n; signal(cmutex);signal(empty);}}注:教材对于producer和consumer的临界区都使⽤了同⼀个mutex,表⽰producer和consumer互斥进⼊临界区。
进程的经典同步问题P、V操作描述简单同步设同步信号量empty,含义为缓冲单元为空,初值为1设同步信号量full,含义为缓冲单元为满,初值为0输⼊进程:申请空缓冲单元; P(empty);输⼊数据到缓冲单元;输⼊数据到缓冲单元;释放满缓冲单元; V(full)计算进程申请满缓冲单元; P(full)从缓冲单元取数据;从缓冲单元取数据释放空缓冲单元; V(empty);同步:每⼀个同步信号量P、V操作成对出现在不同的进程代码中经典同步问题⽣产者消费者问题P、V操作描述进程同步互斥问题步骤:分析进程同步互斥关系;设响应同步互斥信号量;⽤P、V操作描述进程活动。
描述了⼀组⽣产者向⼀组消费者提供产品(数据),它们共享⼀个有界缓冲区,⽣产者向其中投放产品,消费者从中取出产品消费,⽣产者和消费者互斥使⽤整个缓冲池。
分析:只要缓冲区未满,⽣产者就可把产品送⼊缓冲区,只要缓冲区未空,消费者便可从缓冲区取⾛产品并消耗它。
仅当缓冲区满时,⽣产者被阻塞,类似地,缓冲区空时,消费者被阻塞。
设置两个同步信号量:empty:表⽰空缓冲单元的数⽬,初值为缓冲区的⼤⼩n;full:表⽰满缓冲单元(即产品)的数⽬,初值为0;设置互斥信号量mutex:表⽰整个缓冲池,初值为1。
⽣产者进程Pi(i=1,2,……,m)总结两个P操作不可⽤颠倒,如⽣产者进程中如颠倒,当缓冲区都满时会引起死锁,消费者进程如颠倒,当缓冲区都空时会引起死锁;两个V 操作可以颠倒,只是影响到释放缓冲区的顺序。
互斥操作,P、V操作成对出现在同⼀进程代码中。
同步操作,P、V操作成对出现在不同进程代码中。