lock=0;
}while(1);
12、 请写出“交换”的原子指令?给出利用“交换”指令实现互斥的算法。
void swap(int *a,int *b){ int temp; temp=*a;
*a=*b; *b=temp;
}
互斥算法:
int lock=0(初始=false); int key; do{
key=1; do {
swap(&lock,&key); } while(key==1); 临界区 lock=0; }while(1);
13、 什么叫做进程同步?
一组进程,为了协调其推进速度,在某些点处需要相互等待或者唤醒,进程之间这种相互制约的关系称为进程同步。
14、 请给出信号量类型的定义。
“信号量”是一个具有非负初值的整型变量,并且有一个队列与它关联。
15、 信号量变量的初值有什么要求?
初值必须是非负整数
同步的信号量初值一般为0 互斥的信号量初值一般为1
16、 什么叫做原语?
一段不可间断执行的程序称为原语
17、 分别写出对信号量进行P操作和V操作的操作原语。
P操作原语:
void P(semaphore *s){ s->value--; If(s->value<0)
asleep(s->queue); }
V操作原语:
void V(semaphore *s){
s->value++; If(s->value<=0) wakeup(s->queue); }
18、 请给出信号量元素s.value与s.queue之间的关系。
19、 说出初值分别是0、1、n(>1的值)时信号量的作用。
0为同步 1为互斥
N为子资源个数
20、 某图书馆阅览室有50个座位。进入阅览室的读者需要在登记簿上登记,登记后,如
果有空座位,安排到对应位置上;如果没有空座位,要求在入口等待。当读者离开阅览室时,进行注销登记。此时,如果有读者等待,唤醒等待读者进行阅览室。使用信号量、PV操作实现对阅览室进行管理。 【参考答案】 公共变量:
enum seat[50];(free,used) semaphore S;(50) semaphore mutex;(1)
进入登记控制: int Enter(){ int i; P(S); P(mutex);
for(i=0;i<50;i++)
if(seat[i]==free) break; seat[i]=used; V(mutex); return i; }
离开注销登记控制: void Leave(int j){ P(mutex); seat[j]=free; V(mutex); V(S); }
每个读者的活动: void Reader(){ int k; k=enter(); 阅读; Leave(k); }
21、 某公共汽车上司机、售票员、乘客的活动如下:
司机活动: 售票员活动: Driver () { Conductor () { do{ do { 启动车辆; 关车门; 正常行车; 售票; 到站停车; 开车门; } while (1); } while (1); } } 乘客活动: Customer () { 乘客上车; 乘坐; 乘客下车; }; 为安全起见,要求:
(1) 必须乘客全部上车,才能关闭车门;假设车门只允许一个乘客通过,且有自动
判别第一个下车乘客和最后一个上车乘客的装置,且遵守先下、后上原则;
(2) 关闭车门,才能启动汽车; (3) 车辆到站停稳,才能打开车门。
初始时,车辆停靠在站点上,车门是打开着。
请用信号量与PV操作实现对司机、售票员和乘客之间的同步。 【参考答案】
semaphore dc1,dc2;(0,0) semaphore cc1,cc2;(1,0) semaphore metux;(1); 乘客活动: 司机活动: 售票员活动: Customer(){ Driver(){ Conductor(){ P(mutex); do{ do{ if(最后一个上车乘客?)V(cc2); P(dc1); P(cc2); 乘客上车; 启动车辆; 关车门; V(mutex); V(dc1) 正常行车; 乘坐; 到站停车; 售票; P(mutex); V(dc2); P(dc2); 乘客下车; }while(1); 开车门; if(是第一个下车乘客?) P(cc1);
22、 在Linux操作系统中,sem_wait(sem_t *s) 和sem_post(sem_t *s)分别表示对信号量
的什么操作?
sem_wait(sem_t *s):P操作 sem_post(sem_t *s):V操作
23、 假设有两个进程,P1和P2,其中P1有一个活动act1、P2有一个活动act2;要求
act1执行完成后才能执行act2,用信号量“semaphore S;”实现对两个活动进行控制。请给出其实现的一般规则。
24、 P1和P2为两个同步进程. 要求P2完成动作B后P1才能执行动作A. 请根据要求
填写S的初值、P操作和V操作。 semaphore S; (initial value_(1)_) P1:_(2)_动作AP2:动作B_(3)_
25、 请完成下面生产者-消费者程序。
itemtype B[n];//shared variables(n个空箱子)
semaphore S1,S2,mutex; (初值: S1.value=___; S2.value=_____; mutex.value=____) int in,out;//shared variables void producer( ){ while(1){
produceitem(&item); ________ P(mutex); B[in]:= item; in:=(in+1) % k; _________ V(S2); } }
void consumer( ){ while(1){ P(s2); P(mutex); x:=B[out];
相关推荐: