应sicofiled同学建议,把读书笔记写成博客,目前看到了互斥同步至管程模块。
5.4 管程
1.使用信号的管程
5.boundedbuffer控制着用于保存和取回字符的缓冲区,有两个条件变量:notfull为真则至少有增加一个字符的空间,notempty为真则缓冲区至少有一个字符。
6.信号量和管程的责任不同,管程构造自己的互斥机制,缓冲区的访问由管程控制;使用信号量互斥和同步都属于程序员的责任。
7.cwait()后无csignal()的进程将被阻塞,但优先级较高(入紧急队列)。如果没有进程在条件x上等待,csignal()的执行将不会产生任何效果。
8.管程相对于信号量的优点:所有同步机制都被限制在管程内易于验证同步的正确性,易于检查出错误。
2.使用通知和广播的管程
1. 使用信号的管程的缺点:可能增加额外的进程切换;信号相关的进程调度必须非常可靠。
2. cnotify代替csignal使得信号中隐含的消息(足够空闲,满足分配请求)得以模块化,无错误唤醒。
3. while语句代替if 使得至少多一次对条件变量的检测。
4. cbroadcast()原语可以使所有在该条件上等待的进程都设置为就绪状态。
5.5消息传递
1.同步
1.消息传递是进程间同步和通信的方式之一。
2.send & recieve原语有阻塞和无阻塞两种状态。对大多数进程无阻塞send和阻塞recieve是最自然的,但无阻塞send会导致进程重复重复产生消息;阻塞recieve会导致进程无限期被阻塞下去,可使用无阻塞recieve来解决(会导致消息丢失) or 。
3.同步时为了确定那个进程接收消息。
2.寻址
1.寻址是为了指明消息来源:直接/间接寻址。
2.直接寻址:send原语包含目标进程的标识符;receive原语有两种处理方式:1->显示的指定源进程(并发进程合作) 2->隐式寻址,不可能指定所期望的源进程,此时source参数保存了接收操作执行后的返回值。
3.间接寻址:消息发送到共享数据结构,称作信箱的临时保存消息队列。更灵活:一对多,多对一,多对多。多对一的关系中,信箱称作端口。进程和信箱间的关联可以静态(端口、一对一),可以动态。
4.信箱所有权问题:端口归接收进程所有,随进程撤销而销毁。信箱归创建者/操作系统所有,随进程/显式销毁。
3.消息格式
1.短定长消息减少处理和存储开销。大量数据时,消息可引用数据文件。
2.可变长度消息最灵活。消息头+消息体。
4.排队原则
先进先出/检查下次接受
5.互斥
1.无阻塞send和阻塞receive原语用于一组并发进程,初始化信箱(空)。希望进入临界区的进程首先接收一条消息,若信箱空,则阻塞该进程,否则进入临界区,然后把消息放回信箱。若消息仅传递给一个进程则阻塞其他进程,空消息队列阻塞所有进程,有一条时,激活一个阻塞进程。
2.好例:mayproduce & mayconsume 信箱。,可用于分布式系统。
6.读者-读写问题
1.通过信号量传递 wsem和rsem完成互斥。
2.通过消息传递。
------------------------------------------------------------------------------------------------------
第五章读书笔记到此