操作系统--课堂问答笔记11--习题答案

课堂笔记学习视频来自 操作系统
说明:其他”课堂问答笔记“也在”操作系统“专栏

【2-5、2-6】

  1. 管程中的条件变量的意义?结合Hoare管程代码实现哲学家就餐问题,为什么有self[0…4]和selfCount[0…4]这10个条件变量
    主要条件变量不是之前讲的信号量,因此不要按信号量理解。

    有5个哲学家,每个哲学家都要等待就餐,因此就有5个条件变量:self[0…4],self[i]表示第i个哲学家等待就餐的等待条件(这个值只能是0或-1:0不等待,-1等待;显然5个人的等待条件是不一样的,任何只有左右两边的筷子空闲才能吃饭,管程中不像传统方法对筷子设置信号量);selfCount[i]第i个哲学家等待就餐的队列长度(这个值只能是0或1:第i个哲学家不等待队列长度为0,等待队列长度为1)。
    不要按信号量理解,条件变量的初始值一般是0,而信号量不是。
    还有,记住:管程中一旦执行wait必定阻塞自己,signal是释放别人(也可能是空操作)。
    当然执行wait,是进程通过执行管程中的一个方法或函数实现的。
    signal也是进程通过执行管程中的一个方法或函数实现的。
    管程monitor其实是监视器的意思,即监视所有进程,把所有进程的互斥同步操作统一交给monitor管理,所以叫管程(管理进程的机构,程序实现时管程相当于一个对象,管程的代码相当于一个class的定义)。
    管程中一旦执行wait必定阻塞自己,signal是释放别人(也可能是空操作),这个很重要!!!
    例如signal©,c是条件变量,若等待c的进程没有,则signal©就是空操作。c的值是0,则表示等待c的进程没有;是负数,其绝对值表示等待c的进程个数。
    因此处于同一条件下的哲学家就一个,但处于相同条件的生产者和处于相同条件的消费者就不一定一个了。
  2. Hansen管程和Hoare管程的主要区别是什么?
    管程实现的3种方案:
    当后面进入管程的进程执行唤醒操作时(例如P唤醒Q),管程中便存在2个同时处于活动状态的进程,那么如何解决对管程的互斥使用(当一个进入管程的进程执行等待操作时,它应当释放管程的互斥权):
    三种处理方法:
    1.P等待Q执行(Hoare)
    2.Q等待P继续执行(MESA)——Java语言中同步锁的实现参考了MESA模型
    3.规定唤醒操作为管程中最后一个可执行的操作(Hansen)
    Hansen管程中把唤醒signal操作作为最后一条语句,不会像Hoare管程存在一个紧急等待队列。Hoare管程唤醒一个进程,该被唤醒的进程获得管程的使用权(原来的进程到紧急等待队列排队,一旦当前进程执行完,首先判断紧急等待队列(优先级高)中是否有进程,没有再从入口等待队列再调入进程),而Hansen唤醒一个进程后,本身必须立刻退出管程(即不额外设置一个紧急等待队列,所有等待进入管程的进程是平等的),被唤醒的进程就可以获得管程的使用权。
    记住,任何时刻只有一个进程才能使用管程
  3. 利用Hansen管程实现生产者消费者问题时,用到的条件变量noEmpty和noFull的实际含义是?
    noEmpty和noFull表示两个等待队列(生产者等待放产品队列和消费者等待取产品队列)的信号量,初值都为0(管程中条件变量初始值一般为0),其负数的相反数是两个队列的长度。
    wait操作把0变-1,就是把自己阻塞到相应队列中去排队。
    当然第一个阻塞的是把0变-1,第二个就是-1变-2…
    在管程中(加这个条件)wait操作总是阻塞自己。
    noEmpty和noFull它们和传统的解决方案中empty和full信号量(注意,信号量的初始值不一定是0)的值的含义是不一样的。
  4. 进程之间有哪些通信方式?具体内容下节课详解。
    1)管道(Pipe)及有名管道(namedpipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
    2)信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
    3)报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列systemV消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
    4)共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
    5)信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
    6)套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。
发布了94 篇原创文章 · 获赞 40 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_46218781/article/details/105271463