!!!!…………高手看过来,关于进程同步问题…………!!! !

slough 2001-07-21 10:04:05
--------------------------------------------------------------------------------
R1,R2,W1,W2四个进程共享缓冲池BUF,大小为N。R1从键盘取数放入BUF,W1从BUF提R1放的数打印;R2从磁盘取数放入BUF,W2从BUF提R2放的数打印。请用信号量机制解决四个进程同步问题。
昨天考试题,实在没办法,到最后十分钟的时候还是白卷。后来老师说条件多了,不过我想看看就这样能不能解决,所以来请教各位了。

----------------------------------------------------------------------------------------



...全文
124 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
slough 2001-07-22
  • 打赏
  • 举报
回复
如果R1和R2并发执行,R1得到信号量1而执行,R2得到信号量2而执行,两个进程对临界区缓冲池一起操作,会产生不可预料的错误.
………………用程序作还是画流程图?

……………… 用一个信号量就可以解决的。应该不难,把书翻出来看看吧,作系统一章就讲了的。

………………小辉和界斑竹能看到这里来,实在是荣幸。

但是这道题是一道考研题,而且原题的想法是缓冲池里就用了一个缓冲区,而我想看看N个缓冲区的情况下能不能作到R1和R2进程写入的数堆叠在一起而W1和W2能自动提取属于自己的数。一个缓冲区的情况就比较简单了。

用程序或者流程图都可以,说说也可以,只要能看懂,程序可以自己实现的 。

谢谢!

…………………… 呵呵,我要用两个信号灯sem1和sem2,它们的值是>=0的整数。
用两个队列来实现两组数据存取不会混淆,一组从头至尾,另一组从尾至头。sem1和sem2的值不但用来作信号灯,还用来作数据指针。当然,对于sem1和sem2两个信号灯的访问和设置是进程间互斥的,这个用临界区来实现(通常由作系统来实现,我这里就不考虑了)。四个进程的定义如下:

r1-把字符ch放入缓冲区 {
如果sem1 + sem2 >= n的话,等待其他进程(w1,w2)释放资源;
buf[sem] = ch;
sem1++;
}

w1-从buf中取字符 {
如果sem1=0的话,等待r1提供字符
sem1--;
ch = buf[sem1]
}

r2-把字符ch放入缓冲区 {
如果sem1 + sem2 >= n的话,等待其他进程(w1,w2)释放资源;
buf[n - sem2 -1] = ch;
sem2++;
}

w2-从buf中取字符 {
如果sem2=0的话,等待r2提供字符
sem2--;
ch = buf[sem2]
}

…………………… 对于n个缓冲区我的想法是把它们拼接在一起,用一个类来实现,对外的访问接口就好像是一个连续的缓冲区
替换buf[n] = ch之类的语句

----------------------------------------------------------------------------------------
发现还有点不严密,我明天再考虑考虑:)

……………………界斑竹,这个问题的本质是要求解决同步和互斥问题,就是说要实现通常系统实现的那部分,也就是要看看系统是怎么实现的。

再一个,关于SEM1的互斥:如果W1和R1同时在运行,互斥访问SEM1,某时刻W1拿到互斥量,R1阻塞,当W1作完SEM1--后,响应中断;若这时R1由于拿到W1释放的互斥量,经调度上CPU,作完SEM1++后下CPU,;然后W1再上CPU作CH=BUF[SEM1],结果将是不正确的。SEM2的道理是一样的。还有SEM1和SEM2的读写同步,这些靠系统好象没办法解决啊?

不过界斑竹的想法很有创意,我埋头只知道想同步互斥,却忘了在别的方向上突破。希望利用界斑竹“两头利用缓冲区”的想法能解决这个问题。

…………………… 我一直记着这个问题,将很快写出我的完整想法

…………………… 本来我想用从两头开始的两个队列来处理这个问题。每存入一个数据后添加一个数据到队列尾部;从头部每取出一个数据后,通过位拷贝来移动整个队列到0起点。
后来仔细考虑过后,我放弃了这种想法,原因是四个进程互相影响,造成了问题处理很复杂,而且,r2和w2的运行情况会对r1和w1产生干涉。比如r2将缓冲区写满,而w2又不去取,那么r1和w1就被迫挂起都不能执行。从系统的角度我认为这是一个比较严重的问题。
我现在觉得应该把这个缓冲区划分为两个独立的部分给两对进程分别使用,虽然这样给两对进程的缓冲区都小了,但是我觉得这带来的问题是次要的(我还不清楚这里要求缓冲区满是怎么处理,通常是丢弃,重来)。而两个缓冲区的大小分配可以由考察两对进程的传输率来设置为固定大小。我想我遇到的大多数缓冲区都是这样专门处理一种数据传输的。
这样命题就简化为一个长度为m的buf,两个进程,一个写,一个读,完成他们之间的进程同步。
好了,这次就写到这里,吃饭去了。
我希望和大家讨论一下,再决定是否沿着这个思路作下去。

…………………… 其实在我看见这个考题的时候我已经觉得这个问题很无聊:如果实际中有这么四个进程,有谁会无聊到“用两个独立的缓冲池”这个简单方法不用而采用共享一个缓冲池的复杂办法?

发这个帖子是想看看能不能有比较好的方法用信号量机制实现共享一个缓冲池。但是后来我发现,信号量机制本身只能记录信号的数量(几个进程访问缓冲?),不能记录进程的信息(进程R1还是R2?)。而如果用堆叠的方式共享一个缓冲池的话,记录每个缓冲区的进程信息是必不可少的,这是信号量所作不到的。所以问题最终的解决办法
1,还是要用两个缓冲池,以免两对进程相互影响。
2,或者用其他能提供进程信息的机制,以克服信号量的先天不足。

界斑竹的思路的意义在于:在一个空间里用一种创新的思维提供了两个空间的解决方式。这个想法让我触动很大。
zzh 2001-07-21
  • 打赏
  • 举报
回复
设置信号量1,信号量2
在线程R1中,如果要放入数据,先判断信号量1,是否能够使用,如果可以,则锁住信号量1,放入数据,解开信号量1,数据放入成功 如果失败,则等待或直接返回失败,也可以重试几次
同理在线程R2,也是一样的操作,只不过对信号量2操作
在线程W1中,如果要打印,先判断信号量1,是否能够使用,如果可以,刚锁住信号量1,读数据,打印,再解开,如果失败,则等待或直接返回失败,也可以重试几次

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧