第三章 进程同步
目录
1.进程的同步与互斥
1.1 同步机制的规则
空闲让进、忙则等待、有限等待、让权等待
1.2整型信号量
只有一个整数变量记录可用资源数量;不满足让权等待的规则
1.3记录型信号量
请求1种资源,数量1个;1个整数变量value和1个阻塞队列L;value>0,表示资源可用数量,value<0,表示阻塞进程个数
1.4AND型信号量
请求n种资源,每种数量1个;多个信号量,资源要么全部分配,要么一个都不分配
1.5信号量集
请求n种资源,每种数量n个;通用的信号量表示方式,其他类型信号量都是它的特例;多个信号量,每种资源都带下限值
2.信号量机制(记录型信号量)
3.信号量机制实现进程的互斥、同步与前驱关系
3.1进程互斥
3.2进程同步
3.3进程的前驱关系
4.生产者-消费者问题
实现互斥的P操作一定要在实现同步的P操作之后
5. 阅览室管理问题
阅览室中有50个座位(即最多可坐下50位同学自习),只有一张登记表,欲进入阅览室的同学须先在登记表上登记,然后进入阅览室自习;出门时注销登记。
互斥公用信号量mutex:初值为1,实现临界资源(登记表)互斥使用。
空座位信号量seat:初值为50,指示空座位数目
6.读者-写者问题
给count加mutex互斥访问
- 这里说一下为什么要加mutex。
- 比如:当count=0时,第一个读者进程执行到p(rw),rw=0,假设此时时间片到了,切换到第二个读者进程,第二个进程发现count=0,则执行p(rw),但是此时rw=0,于是第二个进程被堵在p(rw)这里,同理,后面的可能会有多个进程堵在p(rw),只有当第一个进程再次获得时间片,执行count++,让count不为0,然后其他进程就可以直接绕过if直接进行count++来访问文件,但是第三个读者进程和后面的几个可能堵在p(rw)的多个读者进程则必须得等count–为0后才可以再次和写进程竞争来访问文件,对count的访问没有做到一气呵成,会导致本来一些进程一直堵在p(rw)。
加一个w实现“读写公平法”
- 在上面的算法中,读进程是优先的,即当存在读进程时,写操作将被延迟,且只要有 一个读进程活跃,随后而来的读进程都将被允许访问文件。这样的方式会导致写进程可能长时间等待,且存在写进程
“饿死”
的情况。 - 若希望写进程优先,
即当有读进程正在读共享文件时,有写进程请求访问,这时应禁止后续读进程的请求,等到已在共享文件的读进程执行完毕,立即让写进程执行,只有在无写进程执行的情况下才允许读进程再次运行
。为此,增加一个信号量并在上面程序的writer()和 reader()函数中各增加一对PV操作,就可以得到写进程优先的解决程序。
7. 过独木桥问题
有一座南北向独木桥,只能行走一人。如果桥上有一个人,则同向的人可以上桥并通过,反向的人只能等待。
过独木桥问题实际上是两类(读者)进程同时访问共享对象的问题,同种类的(读者)进程可以同时操作(读),但不同种类的(读者)进程不能同时操作(读)
互斥信号量mutex:初值为1,实现临界资源(独木桥)互斥使用。
南桥头行人数目:sCount,初值为0,表示正在从南向北过桥的行人数目,如果sCount=0(第一个由南桥头上桥的行人),进程必须执行wait(mutex)操作;行人过完桥后,如果sCount-1=0(最后一个从南桥头过桥的行人),进程必须执行signal(mutex)操作
南桥头私用信号量:sMutex,初值为1,实现对sCount互斥访问功能
北桥头行人数目:nCount,初值为0,操作与南桥头相同
北桥头私用信号量:nMutex,初值为1,实现对nCount互斥访问功能
8.哲学家进餐问题
五个哲学家,围着圆桌交替地进行思考和进餐;每次进餐时,必须同时拿到左右两边的两只筷子才能进餐;进餐后,再放下筷子继续思考。
若五位哲学家同时饥饿而各自拿起了左边的筷子,这使五个信号量 chopstick 均为 0,当他们试图去拿起右边的筷子时,都将因无筷子而无限期地等待下去,即可能会引起死锁。
8.1方法一
至多只允许四位哲学家同时去拿左筷子,最终能保证至少有一位哲学家能进餐,并在用完后释放两只筷子供他人使用。
设置一个初值为 4 的信号量 r,只允许 4 个哲学家同时去拿左筷子,这样就能保证至少有一个哲学家可以就餐,不会出现饿死和死锁的现象。
原理:至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释放出他所使用过的两支筷子,从而可使更多的哲学家进餐。
8.2方法二
仅当哲学家的左右手筷子都拿起时才允许进餐。
解法 1:利用 AND 型信号量机制实现。
原理:多个临界资源,要么全部分配,要么一个都不分配,因此不会出现死锁的情形。
解法 2:利用信号量的保护机制实现。
原理:通过互斥信号量 mutex 对 eat() 之前取左侧和右侧筷子的操作进行保护,可以防止死锁的出现。
8.2方法三
规定奇数号哲学家先拿左筷子再拿右筷子,而偶数号哲学家相反。
原理:按照下图,将是 2,3 号哲学家竞争 3 号筷子,4,5 号哲学家竞争 5 号筷子。1 号哲学家不需要竞争。最后总会有一个哲学家能获得两支筷子而进餐。
9.进程通信
共享存储器系统(无格式)
消息传递系统(有格式)
管道通信系统(相当于文件)
客户机-服务器系统
10.线程
10.1线程是调度和执行的基本单位
10.2线程与进程的关系
线程是进程中的运行实体
一个进程可包含多个线程
一个进程中至少包含一个线程,称主线程
进程相当于线程的载体
10.3 线程的分类
内核支持线程:线程的处理均由内核实现,内核为线程保留TCB,并通过TCB感知线程
用户级线程:线程的处理不通过内核实现,线程的状态信息等全部存放在用户空间中,内核不能感知用户级线程