操作系统学习笔记:进程同步与通信

本文详细介绍了操作系统中进程的同步与通信机制,包括进程间的相互作用、进程互斥的软件和硬件解决方法、信号量机制、经典进程同步问题(如生产者-消费者、读者-写者、哲学家进餐问题)以及死锁的概念、原因、解决策略。通过实例分析,阐述了如何利用管程、信号量等工具避免和解决死锁问题,深入理解进程间的同步与通信对于操作系统设计至关重要。
摘要由CSDN通过智能技术生成

目录:

一、进程间的相互作用:

进程之间的联系:

利用软件方法解决进程互斥问题:

利用硬件方法解决进程互斥问题:

信号量机制:

经典的进程同步问题:

管程的机制:

二、进程通信:

基本概念:

进程通信的类型(三大类):

直接通信和间接通信:

消息缓冲队列通信机制:

三、死锁:

什么是死锁?

产生死锁的原因和必要条件:

预防死锁:

避免死锁:

检测死锁:


一、进程间的相互作用:

在操作系统内部有着许多的并发活动——相互独立的用户程序之间可以并发运行;操作系统本身许多不同功能的程序之间可以并发运行;一个程序的不同程序段之间可以并发执行。

但是这些并发的执行都是通过进程来实现的,进程与进程之间有着各种制约关系,为了正确执行这些进程,操作系统必须提供相应的功能来协调这些制约关系


进程之间的联系:

进程之间的关系:

资源共享关系:多个进程之间共享如CPU、I/O设备等资源

相互合作关系:进程之间相互合作共同完成一件事情。譬如:打印一份文件,需要输入程序、计算程序和打印程序之间的相互合作,并且执行的先后顺序不能混淆

 

当多个进程共享使用一份资源的时候,不能让所有的进程一起使用,应该排队使用,一个一个来;此时该资源被称为临界资源!

 

临界资源:

定义:一种供多个进程互斥访问的资源。

属性:访问临界资源的进程必须互斥得访问它,也就是说,同一时刻只允许一个进程访问的资源叫临界资源

 

那么为什么要赋予进程之间共享资源的这种互斥访问的特性呢?

 

这个问题其实很好解答:

如果有一个变量 Count;代码 A 和代码 B 都要访问Count;并且使用变量Count 代码 A 和代码 B中的一段循环代码;它们的执行都会改变变量 Count 的值。

如果此时设定对于进程之间共享资源访问不是互斥的,代码 A 和代码 B 的相关进程在并发执行时会因为对变量 Count 的使用相互影响,最终都得不到正确的答案。 

 

临界区:不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。我们把在每个进程中访问临界资源的那段代码称为临界区(critical section)

  • 每个进程在进入临界区之前应当对欲访问的临界资源进行检查,看它是否正在被访问。

 

为了实现进程互斥,在系统中设置了专门的同步机制来协调进程,下面将介绍所有的同步机制都应遵循的四条准则!

 

同步机制应遵循的准则:(个人总结:有则用、无则等、有限等、不进让!)

空闲让进:临界资源处于空闲,让一个请求进入临界区的进程立即进入自己的临界区,以有效的利用临界资源。

忙则等待:已经有进程进入自己的临界区了,意味着临界资源有进程在使用了,为了保证临界资源互斥使用,其他想要进入临界区访问临界资源的进程都必须等待。

有限等待:对于要求访问临界资源的进程,应当保证在有效的时间内让其进入自己的临界区,进而访问临界资源。

让权等待:当进程不能进入自己的临界区时,应当立即释放处理机(即CPU)。


利用软件方法解决进程互斥问题:

讲解前提:两个进程 P1 和 P2 ,共享一个临界资源 R

算法一:设置一个公用整型变量turn,用于指示被允许进入临界区的进程的编号,即turn==1,表示允许进程 P1 进入临界区。

 缺点:强制轮流使用,不能保证实现“空闲让进”的准则

个人理解:这个算法的思想是利用P1和P2相互轮流,但是P1和P2的需求不一定完全契合;所以任何一方对临界资源的不使用,都造成了另一方想要使用时的无奈等待;进而导致临界资源无“人”使用的境遇,造成了资源浪费!)

 

算法二:设置一个数组,使其中每个元素的初值为0,表示所有进程都未进入临界区,在每一个进程访问临界资源之前,先去查看一下临界资源是否正被访问。若正被访问,该进程需等待;否则进入自己的临界区 。譬如下图中的 flag[0]==1 则表示进程 P1 正在临界区,访问着临界资源。(个人理解:和算法一相比,由变量turn换成了数组,这样记录的状态信息就更多了,但是原理基本一致!)

缺点:可能同时进入临界区,违背了“忙则等待”的准则

  • 当进程 P1观察到进程P2 的标志为 0 的时候,便将自己的标志由 0 改为 1,这需要一段极短的时间,正是在这段时间里P1的状态标志仍为 0 被P2 所知道,进而产生了错误的操作。

个人理解:相比于算法一,算法二利用数组将 P1 和 P2的状态信息分别记录,通过观察对方的状态信息来进一步确定是否进入临界区;但是 P1 和 P2 状态信息的改变彼此之间并没有制约,会出现进程  P1 和 P2 同时访问临界资源的情况,这样就违背了互斥访问的初衷。)

 

算法三:使要进入临界区的进程先设置其要求进入的标志,然后,再去查看其他进程的标志。譬如:进程P1希望进入临界区时,先将flag[0]置为1,然后再去查看P2的标志;如果flag[1]==1,则P1进程等待否则进入临界区。

缺点:可能都进不了临界区,违背了“空闲让进”

  • 当进程P1和P2几乎同时希望进入临界区时,分别把自己的标志置为 1 ,再去检查对方的标志,此时发现对方的标志为 1 ,所以双方都进不了临界区,使用不了临界资源。

 

算法四:为每个进程设置了相应的标志为flag[];还设置了一个turn变量,用于指示允许进入临界区的进程编号。譬如:flag[1]==0或者turn==1时,进程P1才可以进入临界区,flag[1]==0表示P2没有进入临界区的意愿,turn==1表示只允许进程P1进入临界区。(融合了算法一和算法三中的关键思想!)(个人理解:要么没人抢,有人抢则轮着来!)

成功实现了“空闲让进”及“忙则等待”!


利用硬件方法解决进程互斥问题:

利用Test-and-Set指令实现互斥:对于一个字中内容的检测和修改。

原理:

  • 为每一个临界资源设置一个全局变量lock,lock等于0时表示资源空闲;lock等于1时表示资源正在被使用。
  • TS指令的含义:将lock变量的状态值存储在变量TS中,然后将lock赋值为1,相当于关闭了所以进程对临界资源的访问。
  • while (TS(lock))  no-op;检查TS指令获取到的lock状态值,进而进一步操作,当获取到lock==0时,即临界资源处于空闲,才让该进程访问临界资源,并且访问完后将lock置为0,以便于其他进程访问临界资源。

 

利用Swap指令实现进程互斥:交换两个字的内容。

原理:

  • 为每一个临界资源设置一个全局变量lock,lock等于0时表示资源空闲;lock等于1时表示资源正在被使用。
  • 借助局部变量key,实时获得lock的状态值,以便于进一步判断是否进入临界区,访问临界资源。

信号量机制:

信号量机制是一种非常有效的进程同步工具!

记录型信号量机制:

在信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还有一个进程链表L,用于链接所有等待该信号量代表资源的进程。记录型信号量机制是由采用了记录型的数据结构而出名的。

记录型的数据结构:

对信号量的操作:

信号量除初始化外,仅能通过两个标准的原子操作wait(s)signal(s)来访问。这两个操作很长时间以来被称为P、V操作。     当一个进程在修改某信号量时,没有其他进程可以同时对该信号量进行修改

 

信号量的物理含义(假定信号量用S表示):

  • S.value>0时 S.value表示可使用的资源数或表示可使用资源的进程数。
  • S.value=0时 S.value表示无资源可供使用或表示不允许进程得到该资源。
  • S.value<0时 S.value表示等待使用资源的进程个数或表示等待该资源的进程个数。

 

wait操作:申请一个资源,得到就继续,得不到就阻塞。

  • 6
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值