《操作系统》第三章 进程同步

第三章 进程同步

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感知线程
用户级线程:线程的处理不通过内核实现,线程的状态信息等全部存放在用户空间中,内核不能感知用户级线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值