操作系统进程同步练习题

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);     //理发师收款
    }

}

 

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这段文字似乎是一个问题,内容是关于一个理发店的:一个理发店由一个由n张沙发发的等候室和一个有一张理发椅的理发室组成。没有顾客要理发时,理发师便去睡觉。当一个顾客走进理发店时,如果所有的沙发都已被占用,他便离开理发店;否则,理发师便去理发。问:当一个顾客进入理发店时,如果所有的沙发都已被占用,他便离开理发店吗?如果理发店正在为一个顾客理发,他离开理发店吗? ### 回答2: 题意理解 这道题目讲述了一个嗜睡的理发师的日常工作情景,他总是在没有客人理发的时候就会去睡觉。然而当有一个顾客来到理发店时,如果等候室所有的沙发都已经被占用,那么这个顾客就会离开理发店,否则这个顾客就可以进入理发室理发。我们需要设计一个程序,使得能够模拟出这个场景,求解在一个具有n张沙发的等候室中,理发师的睡觉时间以及顾客离开理发店的机率。 问题分析 这个问题应该可以采用概率论知识来解决。考虑到顾客来店的时刻服从泊松过程,我们可以借助泊松过程的性质来确定每个顾客来店的时间。当一个顾客来店时,如果等候室还有余的沙发,他就可以进入等候室等待理发;否则他就会离开理发店。 在理发师的睡觉问题上,我们考虑到理发师在每个顾客到来时都会被吵醒,所以他的睡眠会被打断,而睡眠状态的中断时间服从指数分布。当理发师被吵醒后,他就会去理发室接待客人;当他没有人理发时,他就会继续睡觉,等待下一个客人的到来。 问题求解 我们可以模拟出一个具有$n$张沙发的等候室和一个理发室的状态,以此来推导出理发师的睡眠时间和顾客离开理发店的概率。 首先,我们设等候室中还有$k$张沙发可以供客人等待。当一个顾客来店时,如果等候室已经没有沙发了,那么他就会离开理发店;否则他就会进入等候室等待理发。 然后,我们考虑到理发师的睡眠状态可能会被客人的到来所中断。当理发师被吵醒时,他就会去理发室接待客人;如果他没有客人,他就可以继续睡觉。由于睡眠状态的中断时间服从指数分布,所以我们可以采用指数分布对此进行建模。设理发师在任意时刻进入沉睡状态的概率为$p$,则在$t$时刻内他进入沉睡状态的概率为$p(1-p)^t$。我们可以通过这个概率来计算出理发师在$t$时刻内处于沉睡状态的概率,以此来推导出理发师的睡眠时间。 最后,我们可以通过求解概率公式或者数值解的方法,来计算出顾客离开理发店的概率。 总结 以上所述即为嗜睡的理发师问题的解答思路和方法。我们需要综合运用概率论和数学等相关知识,来模拟出这个场景并求解出问题的答案。同时,我们还需要注意对于模型的精度和数据要求,以使得研究结果更加准确可靠。 ### 回答3: 这是经典的计算机科学问题,被称为“嗜睡的理发师问题”。它涉及到一个理发店的运营,其中有一位理发师和一个等候室。问题是,在没有顾客要理发的时候,理发师会睡觉,但当有顾客到来时,他必须待在理发室内为其服务。如果没有沙发着,顾客就会离开。 为了解决这个问题,我们可以使用线程同步的方法和一个计数器来跟踪等候室中有多少人。例如,我们可以使用一个计数器和锁来确保同一时间只有一个顾客能够进入等候室,从而避免竞争条件。此外,我们可以使用条件变量来控制顾客和理发师之间的协调,从而避免死锁问题。 解决此问题的一种方法是使用两个计数器:一个表示等待的人数,另一个表示当前正在等待理发师的人数。一开始,等待计数器为0,理发师计数器为0。当有人进入理发店时,如果没有人在等待,理发师必须开始为其服务,并将等待计数器增加1。如果有人在等待,理发师会直接为其服务,并将等待计数器减少1。当理发师完成工作,如果没有人在等待,他会继续睡觉。如果有人在等待,他会继续为其服务,直到等待计数器再次为0。 通过这种方式,我们可以确保顾客和理发师之间的协调,并在需要时唤醒等待线程,从而避免资源浪费和死锁问题。这个问题很好地说明了使用线程同步的重要性,同时也让我们更好地了解了多线程编程的难点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值