操作系统进程同步练习题

1.题目:桌上有一个能盛得下五个水果的空盘子。爸爸不停的向盘子中放苹果或者桔子,儿子不停的从盘子中取出桔子享用,女儿不停的从盘中取出苹果享用。规定三人不能同时使用盘子。试用信号量实现爸爸、儿子、女儿这三个循环进程之间的同步。

代码:


//苹果,橘子,盘子是临界资源
semaphore mutex = 1, plate = 5, apple = 0, orange = 0;
void father()
{
    while (true)
    {
        buy fruits;
        wait(plate);
        wait(mutex);
        put in a fruit;
        signal(mutex);
        if (fruit == apple)
            signal(apple);
        else
            signal(orange);
    }
}
void boy()
{
    wait(orange);
    wait(mutex);
    put out and eat an orange;
    signal(mutex);
    signal(plate);
}
void girl()
{
    wait(apple);
    wait(mutex);
    put out and eat an apple;
    signal(mutex);
    signal(plate);

}


2.题目:试利用记录型信号量写出一个,至多只有四位哲学家去拿左边的筷子,不会死锁的哲学家进餐问题的算法。

  • AND方法解决:

  •  

其他解决方法:

3.题目:嗜睡的理发师问题:一个理发店由一个有N张沙发的等候室和一个放有一张理发椅的理发室组成。没有顾客要理发时,理发师便去睡觉。当一个顾客走进理发店时,如果所有的沙发都已经被占用,他便离开理发店;否则,如果理发师正在为其他顾客理发,则该顾客就找一张空沙发坐下等待;如果理发师因无顾客正在睡觉,则由新到的顾客唤醒理发师为其理发。在理发完成后,顾客必须付费,直到理发师收费后才能离开理发店。试用信号量实现这一同步问题。

 

代码:


// 理发师问题
// 临界资源:barber_sofa:理发椅,sofa_ed_num:被占用的沙发的数量,costumer:顾客数量
// mutex实现customer_num的互斥访问;
// 收付款也是影响程序能否向下进行的互斥量:
 
semaphore mutex = 1, barber_sofa = 1;
semaphore pay = 0,receive = 0;
int sofa_ed_num = 0; //被占用的沙发数量
void customer()
{
    come in;            //进店
    wait(mutex)                     //对临界资源sofa_ed_num的互斥访问
        if (sofa_ed_num >= N)       
        {
            leave;                  //沙发全被占用,离开理发店
            signal(mutex);          //customer_num 互斥访问结束
        }
        else 
        {
            sofa_ed_num++;          //沙发没有被全部占用,坐到沙发上
            signal(mutex);          //customer_num 互斥访问结束
 
            wait(barber_sofa);      //等待理发椅空出
 
            wait(mutex);            //对临界资源sofa_ed_num的互斥访问
            sofa_ed_num--;          //顾客离开沙发
            signal(mutex);          //customer_num 互斥访问结束
 
            signal(customer);       //顾客到来,唤醒理发师
            hair cut;               //剪发
            signal(pay);            //顾客付款
            wait(receive);          //等待理发师收款
            siganl(barber_sofa);    //顾客让出理发椅
            leave;                  //离开
        }
}


void barber()
{
    while (true)
    {
        wait(customer); //当customer=0时,等待顾客到来,同时睡觉
 
        //customer 不为0,则执行如下操作
        harcuting;           //理发
        wait(pay);           //等待顾客付款
        signal(receive);     //理发师收款
    }

}