计算机操作系统第四章 进程同步

本文详细介绍了进程同步的基本概念,包括临界区问题、软件和硬件同步机制,重点讲解了信号量机制及其应用,以及经典的生产者-消费者问题、哲学家就餐问题和读者-写者问题。此外,还探讨了Linux进程同步的相关方法。
摘要由CSDN通过智能技术生成

文章目录

4.1 进程同步的基本概念

4.1.1 进程同步概念的引入

4.1.2 临界区问题

4.2 软件同步机制

4.3 硬件同步机制

4.4 信号量机制

4.4.1 信号量机制介绍

4.4.2 信号量的应用

4.5 管理机制

4.6 经典的进程同步问题

4.6.1 生产者——消费者问题

4.6.2 哲学家就餐问题

4.6.3 读者——写者问题

4.7 Linux进程同步机制

4.1 进程同步的基本概念

4.1.1 进程同步概念的引入

1、我们把异步环境下的一组并发进程因直接制约而互相发送消息、互相合作、互相等待,使得各进程按一定的速度执行的过程,称为进程同步。具有同步关系的一组并发进程称为协作进程。

2、主要任务

使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。

3、进程间的制约关系

间接相互制约关系(互斥关系):进程互斥使用临界资源

直接相互制约关系(同步关系):进程间相互合作

4、临界资源

系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源或共享变量。

诸进程间应采取互斥方式,实现对这种资源的共享

临界资源既可以是硬件资源,也可以是软件资源。

5、生产者消费者问题

6、共享变量

缓冲池buffer数组来表示具有n个缓冲区的缓冲池

输入指针in指示下一个可投放产品的缓冲区,每当生产者进程生产并投放一个产品后,输入指针加1,初值为0

输出指针out指示下一个可获取产品的缓冲区,每当消费者进程取走一个产品后,输出指针加1,初值为0

整型变量count初值0,表示缓冲区中的产品个数

4.1.2 临界区问题

1、临界区:进程中涉及临界资源的代码段
进入区:用于检查是否可以进入临界区的代码段。
退出区:将临界区正被访问的标志恢复为未被访问标志。
剩余区:其他代码

2、一个访问临界资源的循环进程的描述

While(TRUE){

  进入区

  临界区

  退出区

  剩余区
}

3、解决临界区问题的同步机制都应该遵循下述4条准则:

空闲让进:当无进程处于临界区,应允许一个请求进入临界区的进程立即进入自己的临界区;

忙则等待:已有进程处于其临界区,其它试图进入临界区的进程必须等待;

有限等待:等待进入临界区的进程不能"死等"

让权等待:不能进入临界区的进程,应释放CPU(如转换到阻塞状态)

4.2 软件同步机制

4.3 硬件同步机制

1、关中断

进入锁测试之前关闭中断,完成锁测试并上锁之后才打开中断

可有效保证互斥,但存在许多缺点

2、利用Tesr—and—Set指令实现互斥

3、利用swap指令实现进程互斥

4、信号量机制

4.4 信号量机制

4.4.1 信号量机制介绍

1、信号量-软件解决方案:

  • 保证两个或多个代码段不被并发调用
  • 在进入关键代码段前,进程必须获取一个信号量,否则不能运行
  • 执行完该关键代码段,必须释放信号量
  • 信号量有值,为正说明它空闲,为负说明其忙碌

 2、整型信号量

提供两个不可分割的[原子操作]访问信号量

wait(S):
	while s<=0 ;   /*do no-op*/
	s:=s-1;
signal(S):
	s:=s+1; 
  • Wait(s)又称为P(S)
  • Signal(s)又称为V(S)
  • 缺点:进程忙等

 3、记录型信号量:去除忙等的信号量

每个信号量S除一个整数值S.value外,还有一个进程等待队列S.list,存放阻塞在该信号量的各个进程PCB

  • 信号量只能通过初始化和两个标准的原语PV来访问--作为OS核心代码执行,不受进程调度的打断
  • 初始化指定一个非负整数值,表示空闲资源总数(又称为"资源信号量")--若为非负值表示当前的空闲资源数,若为负值其绝对值表示当前等待临界区的进程数

4、AND型信号量

AND型信号量同步的基本思想:将进程在整个运行过程中需要的所有资源,一次性全部分配给进程,待进程使用完后再一起释放。

对若干个临界资源的分配,采用原子操作。

wait(S)操作中增加了一个“AND”条件,故称之为AND同步,或同时wait(S)操作,即Swait(Simultaneous wait)

5、信号量集

在记录型信号量中,wait或signal仅能对某类临界资源进行一个单位的申请和释放,当需要对N个单位进行操作时,需要N次wait/signal操作,效率低下

扩充AND信号量:对进程所申请的所有资源以及每类资源不同的资源需求量,在一次PV原语操作中完成申请或释放

  • 进程对信号量Si的测试值是该资源的分配下限值ti,即要求Si≥ti,否则不予分配。一旦允许分配,进程对该资源的需求值为di,即表示资源占用量,进行Si= Si-di操作
  • Swait(S1t1d1Sntndn)
  • Ssignal(S1d1Sndn)

4.4.2 信号量的应用

1、利用信号量实现进程互斥

2、利用信号量实现前驱关系

3、利用信号量实现进程同步

4.5 管理机制

1、管程定义

一个管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程改变管程中的数据

 2、管程功能

①互斥

  • 管程中的变量只能被管程中的操作访问
  • 任何时候只有一个进程在管程中操作
  • 类似临界区
  • 由编译器完成

②同步

  • 条件变量
  • 唤醒和阻塞操作

3、条件变量

管程内可能存在不止1个进程。

例如:进程P调用signal操作唤醒进程Q后。

4、存在的可能处理方式:

P等待,直到Q离开管程或等待另一条件(Hoare)。
Q等待,直到P离开管程或等待另一条件(Hansen)。

4.6 经典的进程同步问题

4.6.1 生产者——消费者问题

1、生产者-消费者问题是相互合作进程关系的一种抽象

2、利用记录型信号量实现:

假定,在生产者和消费者之间的公用缓冲池中,具有n个缓冲区,可利用互斥信号量mutex使诸进程实现对缓冲池的互斥使用;
利用资源信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量。
又假定这些生产者和消费者相互等效,只要缓冲池未满,生产者便可将消息送入缓冲池;只要缓冲池未空,消费者便可从缓冲池中取走一个消息

3、其它解决方案:AND信号集、管程

4、互斥分析

4.6.2 哲学家就餐问题

1、问题描述

五个哲学家的生活方式:交替思考和进餐 共用一张圆桌,分别坐在五张椅子上 在圆桌上有五个碗和五支筷子 平时哲学家思考,饥饿时便试图取用其左、右最靠近他的筷子,只有在拿到两支筷子时才能进餐 进餐毕,放下筷子又继续思考

2、存在问题

可能引起死锁,如五个哲学家同时饥饿而各自拿起左筷子时,会使信号量chopstick均为0;因此他们试图去拿右筷子时,无法拿到而无限期等待。

3、解决方法

①最多允许4个哲学家同时坐在桌子周围
②仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子。
③给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之

4.6.3 读者——写者问题

1、有两组并发进程:读者和写者,共享一组数据区。

2、要求:允许多个读者同时执行读操作;不允许读者、写者同时操作;不允许多个写者同时操作。

3、分类:

①读者优先(第一类读者写者问题)

如果读者来: 无读者、写者,新读者可以读。 有写者等,但有其它读者正在读,则新读者也可以读。 有写者写,新读者等

如果写者来:无读者,新写者可以写。有读者,新写者等待。有其它写者,新写者等待。

②写者优先(第二类读者写者问题)

多个读者可以同时进行

读写者必须互斥(只允许一个写者写,也不能读者写者同时进行)

写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)

4.7 Linux进程同步机制

1、Linux并发的主要来源:中断处理、内核态抢占、多处理器的并发。

2、同步方法:

  • 原子操作
  • 自旋锁(spin lock) 不会引起调用者阻塞
  • 信号量(Semaphore)
  • 互斥锁(Mutex)
  • 禁止中断(单处理器不可抢占系统)
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值