IPC习题
IPC习题上链接:https://blog.csdn.net/qq_37221167/article/details/99964617
5 面包师问题
面包师问题。面包师有很多面包和蛋糕,由 n 个销售人员销售。每个顾客进店后先取一个号,并且等着叫号。当一个销售人员空闲下来,就叫下一个号。请分别编写销售人员和顾客进程的程序。
Semaphore buyer= 0; //顾客人数
Semaphore seller = n; //销售人员数
Semaphore mutex_s = 1; //用于销售人员的互斥信号量
Semaphore mutex_b = 1; //用于顾客的互斥信号量
int count_s = 0; //记录取号的值
int count_b = 0; //记录叫号的值
void Buy() //顾客进程
{
进店();
P(mutex_b); //取号
count_b++;
V(mutex_b);
V(buyer);
P(seller); //等待叫号
买面包();
离开();
}
void Sell()
{
while(true)
{
P(buyer);
P(mutex_s); //叫号
count_s++;
叫编号为count_s的顾客();
V(mutex_s);
V(seller);
}
}
6 水果问题(2)
桌上有一空盘,运行存放一只水果,爸爸可向盘中放苹果,也可放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘中空时一次只能放一个水果供吃者取用, 用 P,V 原语实现爸爸儿子和女儿 3 个并发进程的同步。
Semaphore S = 1; //S 表示盘子是否为空;
Semaphore Sa = 0; //Sa 表示盘中是否有苹果;
Semaphore Sb = 0; //Sb 表示盘中是否有桔子;
void Father(){
while(true){
P(S);
放入苹果或桔子();
if(放入苹果){
V(Sa);
}else{
V(Sb);
}
}
}
void Son(){
while(true){
P(Sb);
拿桔子();
V(S);
吃桔子();
}
}
void Daughter(){
while(true){
P(Sa);
拿苹果();
V(S);
吃苹果();
}
}
7 写者优先的读者–写者问题
读者-写者问题为数据库访问建立了一个模型。例如,一 个系统,其中有许多竞争的进程试图读写其中的数据,多个进程同时读是可以接受的,但如果一个进程正在更新数据库,则所有的其他进程都不能访问数据库,即使读操作也不行。 写者优先是指当一个写者到达时,将阻止其后面的读者进入数据库,直到其离开为止。
semaphore fmutex=1, rdcntmutex=1, wtcntmutex=1, queue=1;
int reader_count = 0, writer_count = 0;
void reader(){
while( true){
P(queue);
P(rdcntmutex);
if( reader_count == 0 ) { P(fmutex); }
reader_count = reader_count + 1;
V(rdcntmutex);
V(queue);
//Do read operation ...
P(rdcntmutex);
reader_count = reader_count - 1;
if( reader_count == 0 ) { V(fmutex); }
V(rdcntmutex);
}
}
void writer(){
while( TRUE ){
P(wtcntmutex);
if( writer_count == 0 ) { P(queue); }
writer_count = writer_count + 1;
V(wtcntmutex);
P(fmutex);
//Do write operation ...
V(fmutex);
P(wtcntmutex);
writer_count = writer_count - 1;
if( writer_count == 0 ) { V(queue); }
V(wtcntmutex);
}
}
8 天南大路径问题
在天津大学与南开大学之间有一条弯曲的小路,这条路上每次每个方向上只允许一辆自 行车通过。但其中有一个小的安全岛 M,同时允许两辆自行车停留,可供两辆自行车已从两端进入小路的情况下错车使用。如图所示。 下面的算法可以使来往的自行车均可顺利通过。其中使用了 4 个信号量,T 代表天大路 口资源,S 代表南开路口资源, L 代表从天大到安全岛一段路的资源,K 代表从南开到 安全岛一段路的资源。程序如下,请在空白位置处填写适当的 PV 操作语句,每处空白 可能包含若干个 PV 操作语句。
begin
t:=1;s:=1;l:=1;k:=1;
cobegin
从天大到南开的进程
begin
______(1)______
通过 L 路段;
进入安全岛 M;
______(2)______
通过 K 路段
______(3)______
end
从南开到天大的进程
begin
略,与“从天大到南开的进程”相反。
end
coend
end
解答
(1) P(T); P(L);
(2) V(L); P(k);
(3) V(K); V(T);
9 缓冲区问题
三个进程 P1、P2、P3 互斥使用一个包含 N(N>0)个单元的缓冲区。P1 每次用 produce() 生成一个正整数并用 put()送入缓冲区某一空单元中;P2 每次用 getodd()从该缓冲区中取出一个奇数并用 countodd()统计奇数个数;P3 每次用 geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义信号量的含义。要求用伪代码描述。
思路:
定义信号量S1控制P1与P2之间的同步;S2控制P1与P3之间的同步;
empty控制生产者与消费者之间的同步;mutex控制进程间互斥使用缓冲区。
semaphore s1=0,s2=0,
empty=N,mutex=1;
P1()
{
X=produce( );//生成一个数
P(empty);//判断缓冲区是否有空单元
P(mutex);//缓冲区是否被占用
Put();
if(x%2==0)//如果是偶数,向P3发出信号
V(s2);
else //如果是奇数,向P2发出信号
V(s1);
V(mutex);//使用完缓冲区,释放
P2()
{
P(s1);//收到P1发来的信号,已产生一个奇数
P(mutex);//缓冲区是否被占用
getodd( );
countodd( )=countodd( )+1;
V(mutex); //释放缓冲区
V(empty); //向P1发信号,多出一个空单元
P3()
{
P(s2);//收到P1发来的信号,已产生一个偶数
P(mutex);//缓冲区是否被占用
geteven();
counteven()=counteven()+1;
V(mutex);
V(empty);
}