J I A N G S U U N I V E R S I T Y
操作系统大作业
学号:
姓名:
班级:
2018 年 10 月 3 日
9.有三个进程 R,M,P,其中 R 负责从输入设备读入信息并传送给 M,M 将信
息加工并传送给 P,P 将打印输出,写出下列条件下的并发进程程序描述。
(1)一个缓冲区,其容量为 K。
(2)两个缓冲区,每个缓冲区容量均为 K。
答:
(1) 问题思路:
根据题目可以得出本程序的几个操作:(1)R 读入数据;(2)M 读出数据;(3)M
传输数据;(4)P 读出数据。也就是需要定义 4 个操作,因为只有一个缓冲区,且
其容量为 k,所以需要定义一个容量为 k 的缓冲区 buffer[k],并四个操作各自对应一
个信号量 sR,sM1,sP,sM2,并定义一个信号量 mutex 确保程序的互斥。其中操作(1)
读入数据,sR 减一,sM1 加一;操作(2)读入数据,sM1 减一,sM2 加一;操作
(3)读入数据,sM2 减一,sP 加一;操作(4)读入数据,sP 减一,sR 加一。
R 进程
M 进程
P 进程
(2)
(3)
(1)
(4)
缓冲区
int buffer[k];
semaphore mutex,sR,sM1,sP,sM2;
int in,out;
mutex.value=1;
sR,value=k;
sM1.value=0;
sP.value=0;
sM2.value=0;
in=0;
out=0;
…
Process R1
{
Int dataR;
将从输入设备读入的信息暂存在 dataR 中;
P(mutex);
P(sR);
Buffer[in]=dataR;
In=(in+1) % k;
V(sM1);
V(mutex);
}.
Process M1
{
Int dataR;
P(mutex);
P(sM1);
dataR=Buffer[out];
out=(out+1) % k;
V(sM2);
V(mutex);
}.
Process M2
{
Int dataM;
将加工后要传送的信息暂存在 dataM 中;
P(mutex);
P(sM2);
Buffer[in]=dataM;
In=(in+1) % k;
V(sP);
V(mutex);
}.
Process P1
{
Int dataM;
P(mutex);
P(sP);
dataM=Buffer[out];
out=(out+1) % k;
V(sR);
V(mutex);
}.
(2) 问题思路:同(1)中,只不过缓冲区变成了等容量的两个缓冲区,所以将(1)(2)
两个操作在①号缓冲区内进行,(3)(4)两个操作在②号缓冲区内进行。并定义两
个容量为 k 的缓冲区 buffer1[k],buffer2[k]。
R 进程
M 进程
P 进程
(2)
(3)
(1)
(4)
缓冲区①
缓冲区②
int buffer1[k],buffer2[k];
semaphore mutex,sR,sM1,sP,sM2;
int in,out;
mutex.value=1;
sR,value=k;
sM1.value=0;
sP.value=0;
sM2.value=0;
in=0;
out=0;
…
Process R1
{
Int dataR;
将从输入设备读入的信息暂存在 dataR 中;
P(mutex);
P(sR);
Buffer1[in]=dataR;
In=(in+1) % k;
V(sM1);
V(mutex);
}.
Process M1
{
Int dataR;
P(mutex);
P(sM1);
dataR=Buffer1[out];
out=(out+1) % k;
V(sM2);
V(mutex);
}.
Process M2
{
Int dataM;
将加工后要传送的信息暂存在 dataM 中;
P(mutex);
P(sM2);
Buffer2[in]=dataM;
In=(in+1) % k;
V(sP);
V(mutex);
}.
Process P1
{
Int dataM;
P(mutex);
P(sP);
dataM=Buffer2[out];
out=(out+1) % k;
V(sR);
V(mutex);
}.
10.假定一个阅览室最多可以容纳 100 人阅读,读者进入和离开阅览室时都必须
在阅览室门口的一个登记表上注册或注销。假定每次只允许一个人注册或注销,
设阅览室内有 100 个座位。
(1)试问:应编制几个程序和设置几个进程?程序和进程的对应关系如何?
(2)试用 P、V 操作编写读者进程的同步算法。
答:
(1) 应编制一个程序和两个进程。
对应的关系为:一个程序对应多个进程,一个进程对应一个程序。
(2) 问题思路:
可以把阅览室当作一个缓冲区,因为阅览室最多可以容纳 100 人阅读,也就是说缓
冲区的最大容量为 100。而对缓冲区进行的操作只有两种,一种是进阅览室进行阅
读,另一种就是离开阅览室,所以就只需要定义两个进程,一个是 register,另一个
是 cancel。因为同时只允许一个人注册或注销,所以定义一个 mutex 来确保进程的
互斥,保证同时只有一个进程执行。
人数
加 1
剩余椅子数
减 1
阅览室
semaphore mutex=1;
semaphore people=0;
semaphore chairs=100;
void register()
{
P(chairs);
P(mutex);
进入阅览室阅读;
V(people);
V(mutex);
}
void cancel()
{
P(people);
P(mutex);
离开阅览室;
V(chairs);
V(mutex);
}