盘点操作系统之第三章 进程同步与通信

第三章 进程同步与通信

前言

为了保证系统的正常活动,使程序的执行具有可再现性,操作系统必须提供某种机制。

进程之间的协作关系包括互斥、同步和通信

互斥是指多个进程不能同时使用同一个资源,当某个进程使用某种资源时,其他进程必须等待。

同步是指多个进程中发生的事件存在着某种时序关系,某些进程的执行必须先于另一些进程。

进程通信是指多个进程之间要传递一定量的信息。

3.1 进程同步与互斥

3.1.1 并发原理

1.并发带来的问题

带来了以下苦难:
1)全局变量的共享充满了危险。
2)操作系统很难最佳地管理资源的分配。
3)定位程序的错误是很苦难的。

2.进程的交互

按进程之间是否知道对方的存在以及进程的交互方式划分,可分为以下情况:
1)进程之间不知道对方的存在
2)进程间接知道对方
3)进程直接得知对方

进程的并发执行使进程之间存在着交互,进程之间的交互关系包括互斥、同步和通信。

按照进程间之间的程度:进程通信>进程同步>进程互斥

3.进程互斥

竞争双方本来毫无关系,但由于竞争统一资源,使二者产生了相互制约的 关系,这种制约关系就是互斥。所谓互斥就是指多个进程不能同时使用同一资源。

4.进程同步

所谓进程同步,是指多个进程中发生的事件存在着某种时序关系,它们必须按时序执行,以共同完成一项任务。

3.1.2 临界资源与临界区

1.临界区和临界资源的概念

在某段时间内只允许一个进程使用的资源成为临界资源,每个进程中访问临界资源的那段程序称为临界区。

几个进程共享同一临界资源,它们必须以互相排斥的方式使用临界资源,即当一个进程正在使用临界资源且尚未使用完毕时,其他进程必须延迟对该资源的进一步操作,在当前进程使用完毕之前,不能从中插入使用这个临界资源,否则将会造成信息混乱和操作出错。

2.进程访问临界区的一般结构

即:进入区、临界区、退出区、剩余区

进入区:在临界区前面增加的一段用于进行检查临界资源是否被访问的代码
退出区:在临界区后面的用于将临界区正在被访问的标志恢复为未被访问标志的代码
剩余区:进程中除了上述进入区、临界区及退出区之外的其他部分的代码

3.临界区进入准则

所有同步机制都必须遵循下述4个准则
1)空闲让进。当无进程处于临界区时,临界资源处于空闲状态,允许进程进入临界区。
2)忙则等待。当已有进程进入临界区时,临界资源正在被访问,其他想要进入临界区的进程必须等待。
3)有限等待。对于要求访问临界资源的进程,应保证在有效的时间内进入,以免进入“死等”状态。
4)让权等待。当进程不能进入临界区时,应立即释放处理机,以免其他进程进入“忙等”状态。

3.1.3 互斥实现的硬件方法

1.禁止中断

2.专用机器指令

1)硬件方法分为TS指令、Swap指令

2)硬件方法的优点
(1)适用范围广
(2)简单
(3)支持多个临界区

3)硬件方法的缺点
(1)进程在等待进入临界区时,不能做到“让权等待”
(2)由于进入临界区的进程是从等待过程中随机选择的,可能造成某个进程长时间不能被选上,从而导致“饥饿”现象。

3.1.4 互斥实现的软件方法

1.算法一:单标志算法

可以保证任何时刻至多只有一个进程进入临界区,但缺点是强制性轮流进入临界区,不能保证“空闲让进”。

2.算法二:双标志、先检查算法

解决了“空闲让进”,但不能保证“忙则等待” 。

3.算法三:双标志、先修改后检查算法

可防止两个进程同时进入临界区,但缺点是可能两个进程因过分“谦让”而都进入不了临界区。

4.算法四:先修改、后检查、后检查、后修改者等待算法

实现了同步机制的前两条——“空闲让进”和“忙则等待” 。

3.1.5 信号量和PV操作

1.信号量的定义

2.信号量的物理意义

3.用信号量解决互斥问题

4.用信号量解决同步问题

3.2 经典进程同步与互斥问题

3.2.1 生产者——消费者问题

3.2.2 读者——写者问题

3.2.3 哲学家进餐问题

3.2.4 打瞌睡的理发师问题

3.3 AND信号量

3.3.1 AND信号量的引入

3.3.2 用AND信号量解决实际应用

3.4 管程

3.4.1 管程的思想

1.管程的概念

管程的定义是一个共享资源的数据结构以及一组能为并发进程在其上执行的针对改资源的一组操作,这组操作能同步进程和改变管程中的数据。

管程的基本思想是把信号量及其操作原语封装在一个对象内部,即将共享资源以及针对共享资源的所有操作集中在一个模块中。管程可以用函数库的形式实现,一个管程就是一个基本程序单位,可以单独编译。

2.管程的特现

管程的主要特征为以下几点:
(1)局限于管程的共享变量(数据结构)只能被管程的过程访问,任何外部过程都不能访问。
(2)一个进程通过调用管程的一个过程进入管程。
(3)任何时候只能有一个进程在管程中执行,调用管程的任何其他过程都被挂起,以等待管程变为可用,即管程有效地实现互斥。

3.4.2 管程的结构

1.条件变量

管程必须使用条件变量提供对同步的支持,这些条件变量包含在管程中,并且只有在管程中才能被访问。以下两个函数可以操作条件变量:
a.cwait(c):调用进程的执行在条件c上挂起,管程现在可被另一个进程使用
b.csignal(c):恢复在cwait上因为某些条件而挂起的进程的执行。如果有多种这样的进程,选择其中一个。

2.管程的结构

3.4.3 用管程解决实际应用

1.生产者——消费者问题

2.管程与信号量的区别

3.5 同步与互斥实例

3.5.1 Solaris的同步与互斥

1.自旋锁

2.读写门

3.十字转门

3.5.2 Windows的同步与互斥

1.屏蔽中断

2.调度对象

3.5.3 Linux的同步与互斥

3.6 进程通信

按照交换信息量的大小,可以把进程之间的通信分为低级通信和高级通信。

低级通信之中,进程之间只能传递状态和整数值,信号量机制属于低级通信方式。其优点是传递信息的速度快,缺点是传送的信息量少、通信效率低。

高级通信之中,进程之间可以传送任意数量的数据,传递的信息量大。

3.6.1 进程通信的类型

高级通信机制可分为三大类,分别为共享存储器系统、消息传递系统和管道通信。

1.共享存储器系统

2.消息传递系统

因实现方式不同,又分为直接通信方式和间接通信方式。
1)直接通信方式
2)间接通信方式

3.管道通信

所谓管道,是指用于连接一个读进程和一个写进程,以实现进程之间通信的一种共享文件,又称Pipe文件

为了协调双方的通信,管道通信机制必须提供以下几个方面的协调能力。
1)互斥
2)同步
3)双方是否存在

3.6.2 进程通信中的问题

1.通信链路的建立方式

2.通信方向

3.通信链路连接方式

4.通信链路的容量

5.数据格式

6.同步方式

3.6.3 消息传递系统的实现

1.消息传递系统的数据结构

2.发送原语

3.接收原语

3.6.4 客户端——服务器系统通信

常用的通信方式有命名管道、套接字和远程过程调用

1.命名管道

2.套接字

3.远程过程调用

4.远程方法调用

————————————————————————————————————
大概就是这些,有些点到为止,有些就需要自己好好琢磨了,诸如经典进程同步与互斥问题,每一个都需要自己慢慢琢磨,教材的讲解和例子都有限,反正我们上网课,和课本的有出入,所以慢慢来,一步一步走踏实。

原创文章 66 获赞 100 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_44735533/article/details/105722456