操作系统作业1(第2章 进程和线程)
每题要求三部分内容:(1)进程分析(需要哪几个进程,进程的功能和执行过程简述);(2)所使用的信号量和计数变量功能和初值;(3)用类C语言描述进程算法。
1、有一阅览室,共有100个座位。读者进入时必须先在一种登记表上登记,该表为每一座位列一个表目,包括座号和读者姓名。读者离开时要注销掉登记内容。试用PV操作描述读者进程的同步问题。
(1)分析:
登记本的操作要互斥,空座位是资源,要申请。每个读者对应一个进程。当一个读者进入阅览室时,就为他建立一个进程;当读者离开阅览室时,就终止该进程。各进程的程序代码相同。
(2)信号量:
chair:空座位,初值为100。
mutex: 互斥使用登记表,初值为1。
(3)算法:
semaphore chair=100,mutex=1;
void library( )
{
P(chair);
P(mutex);
登记;
V(mutex);
阅读;
P(mutex);
注销登记;
V(mutex);
V(chair);
}
2、有一只铁笼子,每次只能放入一只动物,猎手向笼子里放入老虎,农民向笼子里放入猪;动物园等待取笼子里的老虎,饭店等待取笼子里的猪。试用PV操作写出能同步执行的程序。
(1)分析:
笼子只能放一种动物,设置空间资源empty,它同时也是笼子的互斥使用,初值为1;
猎手放老虎前先看看有无空间,若有则抢笼子,放老虎。后向动物园发信号(V (tiger));
农民放猪前先看看有无空间,若有则抢笼子,放猪后向饭店发信号(V (pig));
动物园先看有无老虎,若有则抢笼子,取走老虎后将笼子释放(V (empty));
饭店先看有无猪,若有则抢笼子,取走猪后将笼子释放(V (empty))。
(2)信号量:
空间资源empty,初值为1;
tiger表示笼子中老虎个数,pig表示笼子中猪个数,初值均为0.
(3)算法:
semaphore empty=1,
tiger=0,pig=0;
void hunter( ) {
while(1) {
P(empty);
放入老虎;
V(tiger);
}
}
void farmer( ) {
while(1) {
P(empty);
放入猪;
V(pig);
}
}
void zoo ( ) {
while(1){
P(tiger);
取出老虎;
V(empty);
}
}
void restaurant ( ) {
while(1) {
P(pig);
取出猪;
V(empty);
}
}
3、假设有3个并发进程P,Q,R,其中P负责从输入设备上读入信息,并传送给Q,Q将信息加工后传送给R,R负责打印输出。进程P,Q共享一个有m个缓冲区组成的缓冲池;进程Q,R共享一个有n个缓冲区组成的缓冲池(假设缓冲池足够大,进程间每次传输信息的单位均小于等于缓冲区长度),请写出满足上述条件的并发程序。
(1)分析:
这是两次生产者-消费者问题。P,Q,R共三个进程。其中,Q既是PQ中的消费者,又是QR中的生产者。
(2)信号量:
full_pq:PQ缓冲区的可用信息数,初值为0;
full_qr:QR缓冲区的可用信息数,初值为0;
empty_pq: PQ缓冲区的可用空位数,初值为m;
empty_qr: QR缓冲区的可用空位数,初值为n;
mutex_pq:PQ缓冲区的互斥信号量,初值为1;
mutex_qr:QR缓冲区的互斥信号量,初值为1;
(3)算法:
semaphore full_pq=0,empty_pq=m,full_qr=0,empty_qr=n,mutex_pq=1,mutex_qr=1;
void p( )
{
while(1)
{
P从输入设备上读入信息;
p(empty_pq);
p(mutex_pq);
P把信息放入缓冲区PQ;
v(mutex_pq);
v(full_pq);
}
}
void q( )
{
while(1)
{
p(full_pq);
p(mutex_pq);
Q将信息从缓冲区PQ取出;
v(mutex_pq);
v(empty_pq);
Q将信息加工;
p(empty_qr);
p(mutex_qr);
Q将信息放入缓冲区QR;
v(mutex_qr);
v(full_qr);
}
}
void r( )
{
while(1)
{
p(full_qr);
p(mutex_qr);
R将信息从缓冲区QR取出;
v(mutex_qr);
v(empty_qr);
R打印;
}
}
4、用信号量解决以下的“过独木桥”问题:同一方向的行人可连续过桥,当某一方向有人过桥时,另一方向的行人必须等待;当某一方向无人过桥时,另一方向的行人可以过桥。
(1)分析:每个行人设置一个进程,两个方向是类似的。从A向B方向过桥的进程为A; 从B向A方向过桥的进程为B。该算法相当于读者-写者问题中的读者算法。
每个方向需要用一个计数器,当计数值大于1时,不必申请桥资源,直接过桥。当最后一个人过桥后,释放桥资源。
(2)信号量和计数变量:
信号量bridge:桥资源,初值为1;
信号量mutexa、mutexb:对计数变量num_a、num_b的互斥访问,初值为1
计数变量num_a、num_b:每个方向的过桥人数,初值为0
(3)算法:
semaphore bridge=1, mutexa=1, mutexb=1;
int num_a=0,num_b=0;
void A( )
{
P(mutexa);
num_a++;
if (num_a==1)
P(bridge);
V(mutexa);
从A向B方向过桥;
P(mutexa);
num_a--;
if (num_a==0)
V(bridge);
V(mutexa);
}
void B( )
{
P(mutexb);
num_b++;
if (num_b==1)
P(bridge);
V(mutexb);
从B向A方向过桥;
P(mutexb);
num_b--;
if (num_b==0)
V(bridge);
V(mutexb);
}