操作系统期末复习题

进程同步(P、V操作)

  1. 桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。

答:爸爸、儿子、女儿共用一个盘子,盘中一次只能放一个水果。当盘子为空时,爸爸可将一个水果放入果盘中。若放入果盘中的是桔子,则允许儿子吃,女儿必须等待;若放入果盘中的是苹果,则允许女儿吃,儿子必须等待。本题实际上是生产者-消费者问题的一种变形。这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。

father()

{

while(1)

{

P(S);

将水果放入盘中;

if(放入的是桔子)V(So);

elseV(Sa);

}

}

son(){

while(1)

{

P(So);

从盘中取出桔子;

V(S);

吃桔子;

}

daughter()

{

while(1)

{

P(Sa);

从盘中取出苹果;

V(S);

 吃苹果;

} 

  1. PV操作题。一批生产者生产特定结构的产品,并将其放入具有n个缓冲区的环状缓冲池,即若当前使用的是n-1号缓冲区,下一个可用的就是0号缓冲区。生产者一次只能生产并放入一个产品,消费者一次只能取出并消费一个产品,且生产者和消费者、消费者之间、生产者之间均对缓冲池互斥访问。请使用P、V原语实现生产者与消费者之间的协调操作,说明每个信号量的含义、初值和值的范围。

答:在这个问题中,生产者和消费者使用固定的有限数目的n个缓冲区来进行任意数目消息的传递,依据题意设置如下信号量,

semaphore mutex =   1   , // 互斥信号量

semaphore  full = 0, // 可用的满资源信号量

semaphore  empty = n, // 可用的空资源信号量

buffType buffer[n];

生产者进程: 消费者进程:

Producer(){ Consumer( ) {

       bufType *next, *in; bufType *next, *out;

      while(TRUE) { while (TRUE) {

      produceItem(next); P(full)    ;

      P(empty);              P(mutex);

      P(mutex);                copyBuffer(out, next);

      copyBuffer(next, in);     out=(out+1) mod n;

      in=(in +1) mod n;          V(mutex);    

      V(mutex);              V(empty);    

      V(full);                    consumeItem(next);

   } }

}

  1. 有一座东西方向的独木桥,同一方向的行人可连续过桥。当某一方向有行人过桥时,另一方向行人必须等待。桥上没有行人过桥时,任何一端的行人均可上桥。请用P、V操作来实现东西两端人过桥问题。    

答:依据题意设置如下信号量

int countA = 0, countB = 0;

semaphore mutex =  1  , xA = 1, xB = 1;

east_west: west_east:

    Repeat Repeat

        P(xA) P(xB);

        countA++; countB++;

        if (countA==1) P(mutex); if (countB==1) P(mutex);

        V(xA); V(xB);

        //过桥 //过桥

        P(xA); P(xB);

        countA--;  countB--;

        if (countA==0) V(mutex); if (countB==0) V(mutex);

        V(xA); V(xB)

  1. 银行提供一个服务窗口和10个供顾客等待的座位。顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号。取号机每次仅允许一位顾客使用。当营业员空闲时,通过叫号选取一位顾客,并为其服务

答:依据题意设置如下信号量

semaphore mutex = 1;              //互斥使用取号机的信号量

semaphore empty =   10  ;         //空座位的数量信号量

semaphore full = 0;                //已占座位的数量信号量

semaphore service = 0;             //等待叫号信号量

void customer_i(){ void server(){

    P(empty); while(1){

    P(mutex); P(full)

    //取号 V(serveice)

    V(mutex); //服务

    V(full); }

    P(service); }

    V(empty);

    //获取服务

}

  1. 在4x100米接力赛中,4个运动员之间存在如下关系,运动员1跑到终点把接力棒交给运动员2;运动员2一开始处于等待状态,在接到运动员1的棒后才往前跑,跑到终点把接力棒交给运动员3;同理,运动员3跑到终点把接力棒交给运动员4;运动员4跑完最后100米。试用信号量机制进行描述这个过程。

答:根据题意,设P1、P2、P3和P4分别为4个运动员的进程,他们对应的信号量分别为S1、S2、S3和S4,初值为S1= 1 ,S2=S3=S4=0

P1: P2: P3: P4

P(S1) P(S2) P(S3) P(S4)

起跑,前进100米 起跑,前进100米 起跑,前进100米 起跑,前进100米

V(S2) V(S3) V(S4) 到达终点

  1. 桌子上有一只盘子,盘子只能放一个水果。爸爸专门向盘子里放香蕉,妈妈专门向盘子放苹果,一个儿子专等吃盘中的香蕉,女儿专等吃盘中的苹果。请用PV操作实现他们之间的同步机制。

解:信号量S1表示盘子临界资源,初值为1;信号量S2和S3分别表示香蕉和苹果的信号量,初值均为0;

爸爸: 妈妈: 儿子: 女儿

Repeat repeat repeat repeat

取一个香蕉 取一个苹果 P(S2) P(S3)

P(S1) P(S1) 从盘中取香蕉 从盘中取苹果

香蕉放进盘子 苹果放进盘子 V(S1) V(S1)

V(S2) V(S3) 吃香蕉 吃苹果

Until false Until false Until false Until false

你可能感兴趣的:(算法,java,鸿蒙系统)