操作系统 第二章部分答案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
P (empty);//没有座位则离开
P(mutex);//进入临界区
填写登记表;
进入阅览室读书;
V(mutex);//离开临界区
V(full);//释放一个读者资源
}
}
process getout () //读者“注销”登记、离开阅览室的进程
{
while(1)
{
P(full); //阅览室是否有人在读书(是否存在有人的座位)
V(empty); //向R发出信号,使进程R又可以向缓冲区B读入一个整数
}
}
coend
因此,设置算法所涉及的三个信号量:empty资源信号量——表示阅览室里的空座位的数目,初值为100;full资源信号量——表示阅览室里有人的座位的数目(或表示阅览室里的读者的数目),初值为0;mutex互斥信号量——表示对登记表这个临界资源的互斥访问,初值设为1。
使用信号量机制对读者“进入”阅览室和“注销”登记之间的同步算法描述如下:
countA=countA+1; //当B方向上没有行人过桥时,则A方向上的行人可以过独木桥。因此A方向上已在独木桥上的行人数增加1个
V(MA); //退出临界区
过桥;//A方向上的行人通过独木桥
P(MA); //实现对临界资源countA的互斥访问
countA=countA-1; //当A方向上的行人已经通过了独木桥时,则A方向上在独木桥上的行人数需要减少1个
那么这个进程就完成了。
30.一个阅览室共有100个座位,用一张表来管理,每个表目记录座位号和读者姓名。读者进入时要先在表上登记,离开时要注销登记。试写出读者“进入”和“注销”之间的同步算法。
答:读者的动作有两个,一是填表进入阅览室读书,这时要考虑阅览室里是否有座位;二是读者阅读完毕,需要注销登记再离开阅览室,这时的操作要考虑阅览室里是否有读者存在。读者在阅览室读书时,由于没有引起资源的变动,不算动作变化。
答:需要设置3个信号量:
(1)信号量empty用于表示进程R可向缓冲区B中读入的整数个数,初值为1,表示进程R能读入一个整数到缓冲区B中。
(2)信号量SW1的初值为0,表示开始时缓冲区B中没有奇数可供进程W1读取。SW1控制R与W1之间的同步。
(3)信号量SW2的初值为0,表示开始时缓冲区B中没有偶数可供进程W2读取。SW2控制R与W2之间的同步。
1.P(S1):S1.value = S1.value - 1 = -1 < 0,那么司机进程就自己阻塞起来,等待售票员进程,售票员关车门。
2.V(S1):S1.value = S1.value + 1 = 0 <= 0,唤醒司机进程,那么司机就开始启动汽车、正常行车;在此期间,售票员也可以同时进行售票。
P(mutex);//进入临界区
注销登记;
离开阅览室;
V(mutex); //离开临界区
V(empty); //释放一个座位资源
}
}
coend
32.假定有3个进程R、W1、W2共享一个缓冲区B,B中每次只能存放一个整数。进程R从输入设备读入一个数进缓冲区B。若读入的是奇数,则由进程W1取出打印;若读入的是偶数,则由进程W2取出打印。规定不能重复从B中取数打印。试写出同步算法。
B=x;//把读入到变量x中的整数赋值给缓冲区B
if(x%2==1)
V(SW1); //如果读入的是奇数,则向进程W1发出信号
else
V(SW2); //如果读入的是偶数,则向进程W2发出信号
}
}
process W1()
{
int y;
while(1)
{
P(SW1); //收到R发过来的信号,已产生一个奇数
答:在汽车行驶过程中,司机活动与售票员活动之间的同步关系为:售票员关车门后,向司机发开车信号,司机接到开车信号后启动汽车,在汽车正常行驶过程中售票员售票,到站时司机停车,售票员在车停后开车门让乘客上下车。因此司机启动汽车的动作必须与售票员关车门的动作取得同步,而售票员开车门的动作也必须与司机到站停车的动作取得同步。
使用信号量机制对这三个进程的同步算法描述如下:
Semaphore empty,SW1,SW2;//首先定义3个信号量
empty.value=1;SW1.value=0;SW2.value=0;
cobegin
process R()
{
int x;
while(1)
{
从输入设备上读一个整数到x;
P(empty); //判断进程R能否向缓冲区B中读入一个整数。如果不可以,则R进程阻塞起来等待。否则,继续向下执行。
cobegin
process A_direction_cross_bridge_person//A方向上过独木桥的行人进程
{
P(MA); //实现对临界资源countA的互斥访问
//当A方向上没有行人过独木桥时,这时有可能存在B方向上的行人在过独木桥。
if (countA == 0)
P(mutex); //如果当前独木桥正在被使用,说明B方向上的行人正在过桥,则A方向上的行人必须等待。
y=B; //取出缓冲区B中的奇数到变量y中
打印y中的数;
V(empty); //向R发出信号,使进程R又可以向缓冲区B读入一个整数
}
}
process W2()
{
int z;
while(1)
{
P(SW2); //收到进程R发过来的信号,已产生一个偶数
z=B; //取出缓冲区B中的偶数到变量z中
打印z中的数;
V(MB); //退出临界区
过桥;//B方向上的行人通过独木桥
P(MB); //实现对临界资源countB的互斥访问
countB=countB-1; //当B方向上的行人已经通过了独木桥时,则B方向上在独木桥上的行人数需要减少1个
if(countB==0) //如果B方向上在独木桥上的行人数减少到0,则
3.P(S2):S2.value = S2.value - 1 = -1 < 0,那么售票员在售完票后,售票员进程就会自己阻塞起来,等待司机进程。这样就能避免当司机还没到站停车时,售票员就已经将车门打开了。而这是不允许的。
4.V(S2):S2.value = S2.value + 1 = 0 <= 0,司机到站停车之后,就唤醒售票员进程,那么售票员就开启车门让乘客上下车。
在本题中,应设置两个信号量S1和S2。S1表示是否允许司机启动汽车(或表示售票员是否已经关好车门),其初值为0;S2表示是否允许售票员开门(或表示司机是否已经到站停车了),其初值为0.
采用信号量机制描述司机与售票员之间的同步算法如下:
Semaphore S1,S2;//首先定义两个信号量S1和S2
S1.value=0; S2.value=0;
Semaphoreempty,full,mutex;//首先定义两个资源信号量empty、full和一个互斥信号量mutex
empty.value=100;full.value=0;mutex.value=1;
cobegin
processgetin() //读者“进入”阅览室的进程
{
while(1)
(2)以下使用信号量机制对A方向上的行人过桥和B方向上的行人过桥的算法进行描述:
int countA, countB;
countA = 0; countB = 0;
Semaphore MA,MB,mutex; //定义了三个互斥信号量
MA.value=1; MB.value=1; mutex.value=1;
if(countA==0) //如果A方向上在独木桥上的行人数减少到0,则
V(mutex); //需要释放独木桥临界资源,唤醒第一个由于在等待独木桥而处于等待状态的B方向上过独木桥的行人进程(如果此进程存在)
V(MA); //退出临界区
}
process B_direction_cross_bridge_person//B方向上过独木桥的行人进程
{P(S[2]); P4; V(S[5]);}
{P(S[4]); P5; V(S[6]);}
{P(S[5]); P(S[3]);P6; V(S[7]);}
{P(S[7]);P(S[6]);P7;}
coend
}
29.在公共汽车上,司机的活动描述为:启动汽车、正常行车、到站停车;售票员的活动描述为:关车门、售票、开车门;试写出司机与售票员之间的同步算法。
cobegin
process driver() process conductor()
{ {
while(1) while(1)
{ {
P(S1);关车门;
启动汽车; V(S1);
正常行车;售票;
到站停车; P(S2);
V(S2);开车门;
}上下乘客;
}
} }
coend
我们来分析这个过程,首先将信号量S1和S2的初值都设为0.然后进行以下分析:
for(int i=0;i<8;i++) S[i].Value=0;
process PP()
{
cobegin//伪代码cobegin和coend表示夹在它们之间的语句可以并发执行
{P1;V(S[1]);}
{P2;V(S[0]);}
{P(S[0]); P(S[1]); P3; V(S[2]); V(S[3]); V(S[4]);}
{
P(MB); //实现对临界资源countB的互斥访问
//当B方向上没有行人过独木桥时,这时有可能存在A方向上的行人在过独木桥。
if (countB==0)
P(mutex); //如果当前独木桥正在被使用,说明A方向上的行人正在过桥,则B方向上的行人必须等待。
countB=countB+1; //当A方向上没有行人过桥时,则B方向上的行人可以过独木桥。因此B方向上已在独木桥上的行人数增加1个
V(mutex); //需要释放独木桥临界资源,唤醒第一个由于在等待独木桥而处于等待状态的A方向上过独木桥的行人进程(如果此进程存在)
V(MB); //退出临界区
}
coend
27.有7个并发执行的进程Pi(i=1,2, …,7),若希望它们按照如下图所示的次序执行,试写出进程并发执行的算法。
Semaphore S[8]; //定义一个大小等于8的结构型信号量数组
26.假定有如下独木桥问题:过桥时,同一方向的行人可连续过桥,当某一方向有人过桥时,另一方向的行人必须等待;当某一方向无人过桥时,另一方向的行人可以过桥。试用信号量机制解决。
答:
(1)将独木桥的两个方向分别标记为A和B。用整型变量countA和wenku.baidu.comountB分别表示A、B方向上已在独木桥上的行人数,初值都设置为0。需要设置三个初值都为1的互斥信号量:MA用来实现对countA的互斥访问,MB用来实现对countB的互斥访问,mutex用来实现两个方向的行人对独木桥的互斥使用。
P (empty);//没有座位则离开
P(mutex);//进入临界区
填写登记表;
进入阅览室读书;
V(mutex);//离开临界区
V(full);//释放一个读者资源
}
}
process getout () //读者“注销”登记、离开阅览室的进程
{
while(1)
{
P(full); //阅览室是否有人在读书(是否存在有人的座位)
V(empty); //向R发出信号,使进程R又可以向缓冲区B读入一个整数
}
}
coend
因此,设置算法所涉及的三个信号量:empty资源信号量——表示阅览室里的空座位的数目,初值为100;full资源信号量——表示阅览室里有人的座位的数目(或表示阅览室里的读者的数目),初值为0;mutex互斥信号量——表示对登记表这个临界资源的互斥访问,初值设为1。
使用信号量机制对读者“进入”阅览室和“注销”登记之间的同步算法描述如下:
countA=countA+1; //当B方向上没有行人过桥时,则A方向上的行人可以过独木桥。因此A方向上已在独木桥上的行人数增加1个
V(MA); //退出临界区
过桥;//A方向上的行人通过独木桥
P(MA); //实现对临界资源countA的互斥访问
countA=countA-1; //当A方向上的行人已经通过了独木桥时,则A方向上在独木桥上的行人数需要减少1个
那么这个进程就完成了。
30.一个阅览室共有100个座位,用一张表来管理,每个表目记录座位号和读者姓名。读者进入时要先在表上登记,离开时要注销登记。试写出读者“进入”和“注销”之间的同步算法。
答:读者的动作有两个,一是填表进入阅览室读书,这时要考虑阅览室里是否有座位;二是读者阅读完毕,需要注销登记再离开阅览室,这时的操作要考虑阅览室里是否有读者存在。读者在阅览室读书时,由于没有引起资源的变动,不算动作变化。
答:需要设置3个信号量:
(1)信号量empty用于表示进程R可向缓冲区B中读入的整数个数,初值为1,表示进程R能读入一个整数到缓冲区B中。
(2)信号量SW1的初值为0,表示开始时缓冲区B中没有奇数可供进程W1读取。SW1控制R与W1之间的同步。
(3)信号量SW2的初值为0,表示开始时缓冲区B中没有偶数可供进程W2读取。SW2控制R与W2之间的同步。
1.P(S1):S1.value = S1.value - 1 = -1 < 0,那么司机进程就自己阻塞起来,等待售票员进程,售票员关车门。
2.V(S1):S1.value = S1.value + 1 = 0 <= 0,唤醒司机进程,那么司机就开始启动汽车、正常行车;在此期间,售票员也可以同时进行售票。
P(mutex);//进入临界区
注销登记;
离开阅览室;
V(mutex); //离开临界区
V(empty); //释放一个座位资源
}
}
coend
32.假定有3个进程R、W1、W2共享一个缓冲区B,B中每次只能存放一个整数。进程R从输入设备读入一个数进缓冲区B。若读入的是奇数,则由进程W1取出打印;若读入的是偶数,则由进程W2取出打印。规定不能重复从B中取数打印。试写出同步算法。
B=x;//把读入到变量x中的整数赋值给缓冲区B
if(x%2==1)
V(SW1); //如果读入的是奇数,则向进程W1发出信号
else
V(SW2); //如果读入的是偶数,则向进程W2发出信号
}
}
process W1()
{
int y;
while(1)
{
P(SW1); //收到R发过来的信号,已产生一个奇数
答:在汽车行驶过程中,司机活动与售票员活动之间的同步关系为:售票员关车门后,向司机发开车信号,司机接到开车信号后启动汽车,在汽车正常行驶过程中售票员售票,到站时司机停车,售票员在车停后开车门让乘客上下车。因此司机启动汽车的动作必须与售票员关车门的动作取得同步,而售票员开车门的动作也必须与司机到站停车的动作取得同步。
使用信号量机制对这三个进程的同步算法描述如下:
Semaphore empty,SW1,SW2;//首先定义3个信号量
empty.value=1;SW1.value=0;SW2.value=0;
cobegin
process R()
{
int x;
while(1)
{
从输入设备上读一个整数到x;
P(empty); //判断进程R能否向缓冲区B中读入一个整数。如果不可以,则R进程阻塞起来等待。否则,继续向下执行。
cobegin
process A_direction_cross_bridge_person//A方向上过独木桥的行人进程
{
P(MA); //实现对临界资源countA的互斥访问
//当A方向上没有行人过独木桥时,这时有可能存在B方向上的行人在过独木桥。
if (countA == 0)
P(mutex); //如果当前独木桥正在被使用,说明B方向上的行人正在过桥,则A方向上的行人必须等待。
y=B; //取出缓冲区B中的奇数到变量y中
打印y中的数;
V(empty); //向R发出信号,使进程R又可以向缓冲区B读入一个整数
}
}
process W2()
{
int z;
while(1)
{
P(SW2); //收到进程R发过来的信号,已产生一个偶数
z=B; //取出缓冲区B中的偶数到变量z中
打印z中的数;
V(MB); //退出临界区
过桥;//B方向上的行人通过独木桥
P(MB); //实现对临界资源countB的互斥访问
countB=countB-1; //当B方向上的行人已经通过了独木桥时,则B方向上在独木桥上的行人数需要减少1个
if(countB==0) //如果B方向上在独木桥上的行人数减少到0,则
3.P(S2):S2.value = S2.value - 1 = -1 < 0,那么售票员在售完票后,售票员进程就会自己阻塞起来,等待司机进程。这样就能避免当司机还没到站停车时,售票员就已经将车门打开了。而这是不允许的。
4.V(S2):S2.value = S2.value + 1 = 0 <= 0,司机到站停车之后,就唤醒售票员进程,那么售票员就开启车门让乘客上下车。
在本题中,应设置两个信号量S1和S2。S1表示是否允许司机启动汽车(或表示售票员是否已经关好车门),其初值为0;S2表示是否允许售票员开门(或表示司机是否已经到站停车了),其初值为0.
采用信号量机制描述司机与售票员之间的同步算法如下:
Semaphore S1,S2;//首先定义两个信号量S1和S2
S1.value=0; S2.value=0;
Semaphoreempty,full,mutex;//首先定义两个资源信号量empty、full和一个互斥信号量mutex
empty.value=100;full.value=0;mutex.value=1;
cobegin
processgetin() //读者“进入”阅览室的进程
{
while(1)
(2)以下使用信号量机制对A方向上的行人过桥和B方向上的行人过桥的算法进行描述:
int countA, countB;
countA = 0; countB = 0;
Semaphore MA,MB,mutex; //定义了三个互斥信号量
MA.value=1; MB.value=1; mutex.value=1;
if(countA==0) //如果A方向上在独木桥上的行人数减少到0,则
V(mutex); //需要释放独木桥临界资源,唤醒第一个由于在等待独木桥而处于等待状态的B方向上过独木桥的行人进程(如果此进程存在)
V(MA); //退出临界区
}
process B_direction_cross_bridge_person//B方向上过独木桥的行人进程
{P(S[2]); P4; V(S[5]);}
{P(S[4]); P5; V(S[6]);}
{P(S[5]); P(S[3]);P6; V(S[7]);}
{P(S[7]);P(S[6]);P7;}
coend
}
29.在公共汽车上,司机的活动描述为:启动汽车、正常行车、到站停车;售票员的活动描述为:关车门、售票、开车门;试写出司机与售票员之间的同步算法。
cobegin
process driver() process conductor()
{ {
while(1) while(1)
{ {
P(S1);关车门;
启动汽车; V(S1);
正常行车;售票;
到站停车; P(S2);
V(S2);开车门;
}上下乘客;
}
} }
coend
我们来分析这个过程,首先将信号量S1和S2的初值都设为0.然后进行以下分析:
for(int i=0;i<8;i++) S[i].Value=0;
process PP()
{
cobegin//伪代码cobegin和coend表示夹在它们之间的语句可以并发执行
{P1;V(S[1]);}
{P2;V(S[0]);}
{P(S[0]); P(S[1]); P3; V(S[2]); V(S[3]); V(S[4]);}
{
P(MB); //实现对临界资源countB的互斥访问
//当B方向上没有行人过独木桥时,这时有可能存在A方向上的行人在过独木桥。
if (countB==0)
P(mutex); //如果当前独木桥正在被使用,说明A方向上的行人正在过桥,则B方向上的行人必须等待。
countB=countB+1; //当A方向上没有行人过桥时,则B方向上的行人可以过独木桥。因此B方向上已在独木桥上的行人数增加1个
V(mutex); //需要释放独木桥临界资源,唤醒第一个由于在等待独木桥而处于等待状态的A方向上过独木桥的行人进程(如果此进程存在)
V(MB); //退出临界区
}
coend
27.有7个并发执行的进程Pi(i=1,2, …,7),若希望它们按照如下图所示的次序执行,试写出进程并发执行的算法。
Semaphore S[8]; //定义一个大小等于8的结构型信号量数组
26.假定有如下独木桥问题:过桥时,同一方向的行人可连续过桥,当某一方向有人过桥时,另一方向的行人必须等待;当某一方向无人过桥时,另一方向的行人可以过桥。试用信号量机制解决。
答:
(1)将独木桥的两个方向分别标记为A和B。用整型变量countA和wenku.baidu.comountB分别表示A、B方向上已在独木桥上的行人数,初值都设置为0。需要设置三个初值都为1的互斥信号量:MA用来实现对countA的互斥访问,MB用来实现对countB的互斥访问,mutex用来实现两个方向的行人对独木桥的互斥使用。