当前位置: 技术问答>linux和unix
OS,问一个p,v操作的问题
来源: 互联网 发布时间:2015-08-27
本文导语: 有这样的一道题: 阅览室共有200个座位,读者进入时必须先在一张登记表上登记,该登记表为每一座位列一表目,包括座号和读者姓名等,读者离开时要销掉登记的信息。试用PV操作描述读者进程之间的同步关系。 ...
有这样的一道题:
阅览室共有200个座位,读者进入时必须先在一张登记表上登记,该登记表为每一座位列一表目,包括座号和读者姓名等,读者离开时要销掉登记的信息。试用PV操作描述读者进程之间的同步关系。
答案是这样的:
算法的信号量有三个:seats,表示阅览室是否有座位,初值为200;readers,表示阅览室里的读者数,初值为0;用于登记或注销互斥的信号量s,初值为1。
读者进入阅览室:
while(1)
{
P(seats); //是否有座位
P(s); //是否有人在登记
填写登记表;
V(s); //登记完毕
进入阅览室;
V(readers); //读者个数加1
}
读者离开阅览室:
while(1)
{
P(readers); //阅览室是否有人在读书
P(s); //是否有人在注销
销掉登记;
V(s); //注销完毕
离开阅览室;
V(seats); //释放一个座位资源
}
我做的解是这样的:
算法的信号量有两个:seats,表示阅览室是否有座位,初值为200;用于登记或注销互斥的信号量s,初值为1。
读者进入阅览室:
while(1)
{
P(seats); //是否有座位
P(s); //是否有人在登记
填写登记表;
V(s); //登记完毕
进入阅览室;
}
读者离开阅览室:
while(1)
{
P(s); //是否有人在注销
销掉登记;
V(s); //注销完毕
离开阅览室;
V(seats); //释放一个座位资源
}
不知道我做的对不对,难到如果两合作进程一定要使用2个信号量表示吗?书上也有个题:对N个缓冲区的读写,怎么用PV实现同步。上面也用3个变量。搞不明白,为什么不能象我上面做的方法那样去实现呢?
还请高手指教,谢谢先。
阅览室共有200个座位,读者进入时必须先在一张登记表上登记,该登记表为每一座位列一表目,包括座号和读者姓名等,读者离开时要销掉登记的信息。试用PV操作描述读者进程之间的同步关系。
答案是这样的:
算法的信号量有三个:seats,表示阅览室是否有座位,初值为200;readers,表示阅览室里的读者数,初值为0;用于登记或注销互斥的信号量s,初值为1。
读者进入阅览室:
while(1)
{
P(seats); //是否有座位
P(s); //是否有人在登记
填写登记表;
V(s); //登记完毕
进入阅览室;
V(readers); //读者个数加1
}
读者离开阅览室:
while(1)
{
P(readers); //阅览室是否有人在读书
P(s); //是否有人在注销
销掉登记;
V(s); //注销完毕
离开阅览室;
V(seats); //释放一个座位资源
}
我做的解是这样的:
算法的信号量有两个:seats,表示阅览室是否有座位,初值为200;用于登记或注销互斥的信号量s,初值为1。
读者进入阅览室:
while(1)
{
P(seats); //是否有座位
P(s); //是否有人在登记
填写登记表;
V(s); //登记完毕
进入阅览室;
}
读者离开阅览室:
while(1)
{
P(s); //是否有人在注销
销掉登记;
V(s); //注销完毕
离开阅览室;
V(seats); //释放一个座位资源
}
不知道我做的对不对,难到如果两合作进程一定要使用2个信号量表示吗?书上也有个题:对N个缓冲区的读写,怎么用PV实现同步。上面也用3个变量。搞不明白,为什么不能象我上面做的方法那样去实现呢?
还请高手指教,谢谢先。
|
你的做法,当无人在阅览室时,如果后一个进程被调度到,将出现错误,在注销登记/离开时。