为什么需要什么是进程同步步?

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
进程管理五经典进程同步问题.ppt 44页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
你可能关注的文档:
··········
··········
* producer:
begin repeat produce an item in nextp; Swait(empty,mutex); buffer(in):=nextp; in:=(in+1)mod n; Ssignal(mutex,full); until false; end
consumer: begin repeat Swait(full,mutex); Nextc:=buffer(out); Out:=(out+1) mod n; Ssignal(mutex,empty); consumer the item in nextc; until false; end
* 2. 一般“信号量集” 一次需要N个某类临界资源时,就要进行N次wait操作--低效又可能死锁 基本思想:在AND型信号量集的基础上进行扩充:进程对信号量Si的测试值为ti(用于信号量的判断,即当Si>= ti时,表示可用资源数量大于ti,才分配资源,否则便不予分配),占用值为di(用于信号量的增减,即 分配资源时Si = Si – di
释放资源时Si = Si + di) Swait(S1, t1, d1; ...; Sn, tn, dn); Ssignal(S1, d1; ...; Sn, dn); 一般信号量集用于同时需要多种资源、每种占用的数目不同、且可分配的资源还存在一个临界值时的处理; *
Swait(S1,t1,d1, S2,t2,d2 …, Sn,tn,dn)
if (S1 >=t1 and S2 >=t2 and … and Sn >= tn) then //所有资源都满足要求时的处理;
for i: = 1 to n do
//某些资源不够时的处理;
调用进程进入第一个小于ti的信号量的等待队列Si.L; 阻塞调用进程;将调用进程的PC置为swait操作开头
Ssignal(S1, d1,S2,d2, …, Sn,dn)
for i: = 1 to n do
Si=Si+/*释放占用的资源*/
/*检查每种资源的等待队列的所有进程,从等待队列Si.queue中取出进程P进入就绪队列;*/ endfor
* 一般"信号量集"的几种特定情况: Swait(S, d, d)表示每次申请d个资源,当少于d个时,便不分配; Swait(S, 1, 1)表示互斥信号量; Swait(S, 1, 0)作为一个可控开关 当S>=1时,允许多个进程进入临界区; 当S=0时,禁止任何进程进入临界区; 一般"信号量集"未必成对使用Swait和Ssignal:如:一起申请,但不一起释放; * 2. 读者-写者问题(the readers-writers problem) 问题描述 写者向数据区放数据,读者从数据区获取数据 多个读者可同时读取数据 多个写者不能同时写数据 读者和写者的控制策略变化多端 * 读者-写者问题的信号量解法 互斥关系分析 读者和写者不能同时进入共享数据区 多个写者不能同时进入共享数据区 多个读者可以同时进入共享数据区 同步关系分析 读者进入缓冲区,写者必须等待 写者进入缓冲区,读者必须等待 三种类型: 读者优先:一旦有读者进入,则后续读者均可进入 合理顺序:读者在先来的写者之后 写者优先:只要有写者等待,则后续读者必须等待
写--写互斥 * 如果读者来: 1)无读者、写者:新读者可以读 2)有写者等待,但有其它读者正在读:新读者也可以读 3)有写者写:新读者等
如果写者来: 1)无读者:新写者可以写 2)有读者:新写者等待 3)有其它写者:新写者等待 读--写互斥 读--写互斥 写--写互斥 读--写互斥 读--写互斥 写—写互斥: 互斥信号量Wmutex 怎样判断有没有读者在读? * 增加一个公共变量Readcount,表示当前有几个读者进程在读。 新来一个读者进程,Readcount加1; 撤销一个读者进程,Readcount减1; 第一个读者:阻塞所有写者进程;允许其他读者进程执行。 最后一个读者:唤醒可能的写者进程。 Readcount成为临界资源,必须互斥访问: 增加互斥信号量Rmutex * 采用信号量机制: 两个进程: Reader、Writer 两个信号量 Wmutex表示读者和写者之间互斥,初值是1。 公共变量Readcount表示“正在读”的进程数,初值是0; Rmutex表示读者对Readcount的互斥操作,初值是1。 Readcount=0时允
正在加载中,请稍后...
146页12页59页36页44页134页174页55页71页145页linux 下进程间的同步机制有哪些? - 知乎392被浏览<strong class="NumberBoard-itemValue" title="2分享邀请回答3413 条评论分享收藏感谢收起1710 条评论分享收藏感谢收起进程同步——经典的同步问题 - kiplove - 博客园
随笔 - 39, 文章 - 0, 评论 - 0, 引用 - 0
本文为博主原创文章,未经博主允许不得转载&
涉及进程同步的一些概念:
互斥与同步:
临界资源(临界区):指一次只能允许一个进程使用的共享资源称为临界资源;
同步:指为完成某种任务而建立的两个和多个进程,这些进程在合作的过程中需要协调工作次序进行有序的访问而出现等待所产生的制约关系。
互斥:指两个或多个进程访问临界资源时只能一个进程访问,其他进程等待的一种相互制约的关系。
信号量与互斥量:
信号量:本身是一个计数器,使用P,V两个操作来实现计数的减与加,当计数不大于0时,则进程进入睡眠状态,它用于为多个进程提供共享数据对象的访问。
互斥量:如果信号量只存在两个状态,那就不需要计数了,可以简化为加锁与解锁两个功能,这就是互斥量。
一、生产者与消费者问题
问题描述:一组生产者进程和一组消费者进程共享一块初始为空,大小确定的缓冲区,只有当缓冲区为满时,生产者进程才可以把信息放入缓冲区,否则就要等待;只有缓存区不为空时,消费者进程才能从中取出消息,否则就要等待。缓冲区一次只能一个进程访问(临界资源)。
问题分析:生产者与消费者进程对缓冲区的访问是互斥关系,而生产者与消费者本身又存在同步关系,即必须生成之后才能消费。因而对于缓冲区的访问设置一个互斥量,再设置两个信号量一个记录空闲缓冲区单元,一个记录满缓冲区单元来实现生产者与消费者的同步。
问题解决:伪代码实现
semaphore mutex=<span style="color: #;
semaphore full=<span style="color: #;
//满缓冲区单元
semaphore empty=N;
//空闲缓冲区单元
prodecer()
while(<span style="color: #)
add_source++;
consumer()
while(<span style="color: #)
add_source--;
二、读者与写者问题
问题描述:有读者与写者两个并发进程共享一个数据,两个或以上的读进程可以访问数据,但是一个写者进程访问数据与其他进程都互斥。
问题分析:读者与写者是互斥关系,写者与写者是互斥关系,读者与读者是同步关系。因而需要一个互斥量实现读与写和写与写互斥,一个读者的访问计数和实现对计数的互斥。
问题解决:三种伪代码实现
1、读者优先
  读者优先,只要有读者源源不断,写者就得不到资源。容易造成写者饥饿。
1 //读者优先
3 int count=<span style="color: #;
4 semaphore mutex=<span style="color: #;
//读者计数锁
5 semaphore rw=<span style="color: #;
//资源访问锁
7 writer()
while(<span style="color: #)
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: # }
<span style="color: #
<span style="color: # reader()
<span style="color: # {
<span style="color: #
while(<span style="color: #)
<span style="color: #
<span style="color: #
<span style="color: #
if(count==<span style="color: #)
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
if(count==<span style="color: #)
<span style="color: #
<span style="color: #
V(mutex);
<span style="color: #
<span style="color: # }
2、读写公平
  读者与写者公平抢占资源,但是只要之前已经排队的读者,就算写者获取的资源,也要等待所有等待的读者进程结束。
1 //读写公平
2 int count=<span style="color: #;
3 semaphore mutex=<span style="color: #;
//读者计数锁
4 semaphore rw=<span style="color: #;
//资源访问锁
5 semaphore w=<span style="color: #;
//读写公平抢占锁
6 writer()
while(<span style="color: #)
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: # }
<span style="color: #
<span style="color: # reader()
<span style="color: # {
<span style="color: #
while(<span style="color: #)
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
if(count==<span style="color: #)
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
if(count==<span style="color: #)
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: # }
3、写者优先
  写者优先,只要写者源源不断,读者就得不到资源,但是在这之前已经排队的的读者进程依然可以优先获得资源,在这之后则等待所有写者进程的结束。这种也易造成读者饥饿。
1 //写者优先
2 int write_count=<span style="color: #;
3 int count=<span style="color: #;
4 semaphore w_mutex=<span style="color: #;
//读计数时锁
5 semaphore r_mutex=<span style="color: #;
//写计数时锁
6 semaphore rw=<span style="color: #;
//写优先锁
7 semaphore source=<span style="color: #;
//资源访问锁
9 writer()
<span style="color: # {
<span style="color: #
while(<span style="color: #)
<span style="color: #
<span style="color: #
P(w_mutux);
<span style="color: #
if(write_count==<span style="color: #)
<span style="color: #
//获得则只要有写进程进来就不释放
<span style="color: #
write_count++;
<span style="color: #
V(w_mutux)
<span style="color: #
<span style="color: #
P(resouce);
//写时互斥必须加资源独占的锁
<span style="color: #
<span style="color: #
V(resouce);
<span style="color: #
<span style="color: #
P(w_mutux);
<span style="color: #
write_count--;
<span style="color: #
if(write_count==<span style="color: #)
<span style="color: #
<span style="color: #
V(w_mutux);
<span style="color: #
<span style="color: # }
<span style="color: #
<span style="color: # reader()
<span style="color: # {
<span style="color: #
while(<span style="color: #)
<span style="color: #
<span style="color: #
//使用了立即释放
<span style="color: #
P(r_mutex);
<span style="color: #
if(count==<span style="color: #)
<span style="color: #
P(resouce);
<span style="color: #
<span style="color: #
V(r_mutex);
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
P(r_mutex);
<span style="color: #
<span style="color: #
if(count==<span style="color: #)
<span style="color: #
V(resouce);
<span style="color: #
V(r_mutex);
<span style="color: #
<span style="color: # }
三、哲学家就餐问题
问题描述:一张圆桌上坐着五名哲学家,每两名哲学家之间的桌子摆一根筷子,哲学家只有同时拿起左右两根筷子时才可以用餐,用餐完了筷子放回原处。
问题分析:这里五名哲学家就是五个进程,五根筷子是需要获取的资源。可以定义互斥数组用于表示五根筷子的互斥访问,为了防止哲学家个取一根筷子出现死锁,需要添加一定的限制条件。一种方法是限制仅当哲学家左右筷子均可以用时,才拿起筷子,这里需要一个互斥量来限制获取筷子不会出现竞争。
问题解决:一次仅能一个哲学家拿起筷子,效率比较低。
1 semaphore chopstick[<span style="color: #]={<span style="color: #,<span style="color: #,<span style="color: #,<span style="color: #,<span style="color: #};
2 semaphore mutex=<span style="color: #;
while(<span style="color: #)
P(chopstick[i]);
P(chopstick[(i+<span style="color: #)%<span style="color: #]);
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
V(chopstick[i]);
<span style="color: #
V(chopstick[(i+<span style="color: #)%<span style="color: #]);
<span style="color: #
<span style="color: # }
死锁:如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么该进程集合就是死锁的。
死锁的条件(四个同时满足):
(1)互斥:每个资源要么已经分配给一个进程,要么就是可用的;
(2)占有和等待:已经得到的某个资源的进程请求新的资源;
(3)不可抢占:已经分配的资源不能强制被抢占,只能进程自己显示的释放;
(4)环路等待:存在一种进程资源的循环等待链。
死锁的处理策略:
(1)死锁预防:破坏死锁的四个条件之一
  破环互斥条件:允许资源共享
  破环占有和等待条件:采用预先静态分配
  不可抢占:请求新资源得不到时,释放已经保持占有的资源,待以后重新申请
  环路等待:采用顺序资源分配法
(2)死锁避免:死锁避免事先预防策略,但是是采用资源动态分配的过程中,防止系统进入不安全状态,以避免死锁。
  银行家算法:可利用资源矢量Available,请求矢量Request
        最大需求矩阵Max,分配矩阵Allocation,需求矩阵Need
        通过Need=Max-Allocation获得每个进程需要的各类资源数Need矩阵
        一般每个进程请求矢量应该小于等于Need的值
        试探分配:Available=Avaliable-Request
             Allocate相对应的项=Allocate相对应的项+Request
             Need相对应的项=Need相对应的项-Request
        安全性算法:检查资源分配后,系统是否属于安全状态,如果安全才正式分配资源,否则作废。一般通过安全性算法推算一个安全序列(核心)。  
(3)死锁检测与解除:
  检测死锁:利用死锁原理化简资源分配图检测死锁的存在
  死锁解除:资源剥夺、撤销进程、进程回退Java中如何做跨进程的同步? - ITeye问答
两个进程A和B,运行在不同的JVM上。现在我需要的是A先在某个事件上阻塞,直到B发一个消息,A才可以继续。
1.项目运行在windows平台上,不用考虑跨平台的问题。
2.能够用同步的方式,不要轮寻最好。
如果是C/C++,可以用Win32的系统对象; 如果是.Net也有封装好的对象可以做到。 我对java的类库不是很熟悉。java里有现成的类可以支持进程间的同步吗?或者,如果有开源的项目可以做到也可以。
我能想到的一个方法是写JNI去调Win32的API。不知有没有更好的办法。 多谢
采纳的答案
这个问题也曾经想过,最后想到的也是JNI。
不过想Socket是不是也可以实现。
这个就是用socket嘛,参考服务器和客户端的原理,服务器和客户端说白了就2个JVM上运行的JAVA程序
那就基于socket来通信,
已解决问题
未解决问题

我要回帖

更多关于 什么是进程同步 的文章

 

随机推荐