Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >操作系统原理:进程同步的几种方式及基本原理

操作系统原理:进程同步的几种方式及基本原理

原创
作者头像
嵌入式Linux内核
发布于 2022-09-23 12:18:24
发布于 2022-09-23 12:18:24
3.4K00
代码可运行
举报
运行总次数:0
代码可运行

一,进程同步的几种方式

1、信号量

用于进程间传递信号的一个整数值。在信号量上只有三种操作可以进行:初始化,P操作和V操作,这三种操作都是原子操作。

P操作(递减操作)可以用于阻塞一个进程,V操作(增加操作)可以用于解除阻塞一个进程。

基本原理是两个或多个进程可以通过简单的信号进行合作,一个进程可以被迫在某一位置停止,直到它接收到一个特定的信号。该信号即为信号量s。

为通过信号量s传送信号,进程可执行原语semSignal(s);为通过信号量s接收信号,进程可执行原语semWait(s);如果相应的信号仍然没有发送,则进程会被阻塞,直到发送完为止。

可把信号量视为一个具有整数值的变量,在它之上定义三个操作:

  • 一个信号量可以初始化为非负数
  • semWait操作使信号量s减1.若值为负数,则执行semWait的进程被阻塞。否则进程继续执行。
  • semSignal操作使信号量加1,若值大于或等于零,则被semWait操作阻塞的进程被解除阻塞。

2、管程

管程是由一个或多个过程、一个初始化序列和局部数据组成的软件模块,其主要特点如下:

  • 局部数据变量只能被管程的过程访问,任何外部过程都不能访问。
  • 一个进程通过调用管程的一个过程进入管程。
  • 在任何时候,只能有一个进程在管程中执行,调用管程的任何其他进程都被阻塞,以等待管程可用。

管程通过使用条件变量提供对同步的支持,这些条件变量包含在管程中,并且只有在管程中才能被访问。有两个函数可以操作条件变量:

  • cwait(c):调用进程的执行在条件c上阻塞,管程现在可被另一个进程使用。
  • csignal(c):恢复执行在cwait之后因为某些条件而阻塞的进程。如果有多个这样的进程,选择其中一个;如果没有这样的进程,什么以不做。

3、消息传递

消息传递的实际功能以一对原语的形式提供:

  • send(destination,message)
  • receive(source,message)

这是进程间进程消息传递所需要的最小操作集。

一个进程以消息的形式给另一个指定的目标进程发送消息;

进程通过执行receive原语接收消息,receive原语中指明发送消息的源进程和消息。

二、进程互斥

由于进程具有独立性和异步性等并发特征,计算机的资源有限,导致了进程之间的资源竞争和共享,也导致了对进程执行过程的制约。

1.临界区相关概念: 临界资源:也就是一次只允许一个进程操作使用的计算机资源,这里的资源可以是物理资源,也可以是逻辑上的变量等。 临界区:把不允许多个并发进程交叉执行的一段程序称为临界区(critical region)或临界部分(critical section)。 当一个进程使用该临界资源时,其他需要访问该资源的进程必须阻塞,直到占用者释放该资源。

2、间接制约 把这种由于共享某一公有资源而引起的在临界区内不允许并发进程交叉执行的现象,称为由共享公有资源而造成的对并发进程执行速度的间接制约。这里的“间接”二字主要是指各种并发进程的速度受公有资源的制约,而非进程之间的直接制约。

3.进程互斥 在并发进程中,一个或多个进程要对公用资源进行访问时,必须确保该资源处于空闲状态,也就是说,在并发进程中,临界区只允许一个进程进入,而其他进程阻塞,等待该共享临界资源释放。

4.并发进程之间必须满足以下特征:

  • 平等竞争:即各并发进程享有平等地、独立地竞争共有资源的权利,且在不采取任何措施的条件下,在临界区内任意指令结束时,其他并发进程可以进入临界区。
  • 互斥使用:当并发进程中的时候 多个进程同时申请进入临界区时,它只允许一个进程进入临界区。
  • 不可独占:当进程不在临界区后,它不能阻止其他进程进入临界区。
  • 有限等待:也就是在就绪队列中的进程等待资源时间必须是有限的。并发进程中的某个进程从申请进入临界区时开始,应在有限时间内得以进入临界区。

内核学习网站:

Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈-学习视频教程-腾讯课堂​ke.qq.com/course/4032547?flowToken=1040236

三、互斥的实现

2.1、互斥的加锁实现: 对互斥的临界区进行加锁处理,即当一个进程进入了 临界区之后,对此临界区进行加锁,直到该进程退出临界区为止。而其他并发进程在申请进入临界区之前,必须测试该临界区是否加锁,如果是,则阻塞等待! 加锁实现是系统的原语:lock(key[S])和Unlock(key([S]))均保持原子操作。系统实现时锁定位key[S]总是设置在公有资源所对应的数据结构中的。

2.2、互斥加锁实现的缺点: 1.在进行锁测试和定位中将耗费CPU资源 2、进程加锁实现可能会对进程不公平,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
进程A:
lock(key[S])
<S>
unlock(key[S])
Goto A


进程Block(key[S])
<S>
unlock(key[S])
Goto B

如上面所示,进程A和B之间的一个进程运行到Goto之后,会使得另一个进程无法得到处理机资源运行。而处于永久饥饿状态(starvation)。

分析可以知道,一个进程能否进入临界区取决于进程自己调用lock过程去测试相应的锁定位。也就是说,每个进程能否进入临界区是依靠进程自己的测试判断。这样,没有获得执行机会的进程当然无法判断,从而出现不公平现象。

那么是否有办法解决这个问题呢?当然,很明显,办法是有的,我们可以为临界区设置一个管理员,由这个管理员来管理相应临界区的公有资源,它代表可用资源的实体,这个管理员就是信号量

3、信号量和P、V操作 信号量和P、V原语是荷兰科学家E. W. Dijkstra提出来的。 P原语:*P是荷兰语Proberen(测试*)的首字母。为阻塞原因,负责把当前进程由运行状态转换为阻塞状态,直到另外一个进程唤醒它。操作方法:申请一个空闲资源(把信号量减1),若成功,则退出;若失败,则该进程会被阻塞;

V原语:V是荷兰语Verhogen(增加)的首字母。为唤醒原语,负责把一个被阻塞的进程唤醒,它有一个参数表,存放着等待被唤醒的进程信息。操作为:释放一个被占用的资源(把信号量加1),如果发现有被阻塞的进程,则选择一个唤醒之。

【信号量semaphore】 在操作系统中,信号量sem是一个整数。

  • sem >= 0时,代表可供并发进程使用的资源实体数;
  • sem < 0时,表示正在等待使用临界区的进程数。

显然,用于互斥的信号量sem的初值应该大于0,而建立一个信号量必须说明所建信号量代表的意义,赋初值,以及建立相应的数据结构,以便指向那些等待使用该临界区的进程。sem初值为1。

【P、V原语】 信号量的数值仅能由P、V原语操作改变。采用P、V原语,可以把类名为S的临界区描述为:When S do P(sem) 临界区 V(sem) od。

  • 一次P原语操作使信号量sem减1
  • 一次V原语操作使信号量sem加1

P原语操作:

sem减1; 若sem减1后仍大于或等于0,则P原语返回,该进程继续执行; 若sem减1后小于0,则该进程被阻塞后进入与该信号相对应的队列中,然后转进程调度。

V原语操作:

sem加1; 若相加结果大于0,V原语停止执行,该进程返回调用处,继续执行; 若相加结果小于或等于0,则从该信号的等待队列中唤醒一个等待进程,然后再返回原进程继续执行或转进程调度。

这里给出一个使用加锁法的软件实现方法来实现P、V原语:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
P(sem):
    begin
        封锁中断;
        lock(lockbit)
        val[sem]=val[sem]-1
        if val[sem]<0
            保护当前进程CPU现场
            当前进程状态置为“等待”
            将当前进程插入信号sem等待队列
            转进程调度
        fi
        unlock(lockbit);开放中断
    end
V(sem):
    begin
        封锁中断;
        lock(lockbit)
        val[sem]=val[sem]+1
        if val[sem]<=0
            local k
            从sem等待队列中选取一个等待进程,将其指针置入k中
            将k插入就绪队列
            进程状态置位“就绪”
        fi
        unlock(lockbit);开放中断
    end

2.3用P、V原语实现进程互斥 设信号量sem是用于互斥的信号量,且其初始值为1表示没有并发进程使用该临界区。显然,由前面论述可知,只要把临界区置于P(sem)和V(sem)之间,即可实现进程之间的互斥。

用信号量实现两个并发进程PA和PB互斥的描述如下: (1)设sem为互斥信号量,其取值范围为(1,0,-1)。其中sem=1表示进程PA和PB都未进入类名为S的临界区,sem=0表示进程PA或PB已进入类名为S的临界区,sem=-1表示进程PA和PB中,一个进程已进入临界区,而另一个进程等待进入该临界区。 (2)实现过程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Pa:
    P(sem)
    <S>
    V(sem)
    .
    .
    .
Pb:
    P(sem)
    <S>
    V(sem)
    .
    .
    .

四,进程互斥的软件实现方法:

1,单标志法

1)在进入区只检查,不上锁

2)在退出区把临界资源的使用权交给另一个进程

3)主要问题:不遵循空闲让进的原则

2,双标志先检查

1)在进入区先检查后上锁,退出区解锁

2)主要问题:不遵循原则等待原则

3,双标志后检查

1)在进入区先

上锁后检查,退出区解锁

2)主要问题:不遵循空闲让进,有限等待原则,可能导致饥饿

4,Peterson算法

1)在进入区主动争取——》主动谦让——》检查对方是否想进,己方是否谦让

2)主要问题:不遵循让则等待原则,会发送忙等

五、进程同步

【进程间的直接制约】:一组在异步环境下的并发进程,各自的执行结果互为对方的执行条件,从而限制各进程的执行速度的过程称为并发进程间的直接制约。这里的异步环境主要是指各并发进程的执行起始时间的随机性和执行速度的独立性。

【进程间的同步】:把异步环境下的一组并发进程因直接制约而互相发送消息而进行互相合作、互相等待,使得各进程按一定的速度执行的过程称为进程间的同步。具有同步关系的一组并发进程称为合作进程,合作进程间相互发送的信号称为消息或事件。 用消息实现进程同步:

用 wait(消息名) 表示进程等待合作进程发来的消息。 用 signal(消息名) 表示向合作进程发送消息。 过程wait的功能是等待到消息名为true的进程继续执行,而signal的功能则是向合作进程发送合作进程所需要的消息名,并将其值置为true。

进程互斥和进程同步】: 进程同步不同于进程互斥,进程互斥时它们的执行顺序可以是任意的。一般来说,也可以把个进程之间发送的消息作为信号量看待。与进程互斥时不同的是,这里的信号量只与制约进程及被制约进程有关,而不是与整租并发进程有关。因此,称该信号量为私用信号量(private semaphore)。一个进程Pi的私用信号量semi是从制约进程发送来的进程Pi的执行条件所需要的信息。与私用信号量相对应,称互斥时使用的信号量为公用信号量。

用P、V原语实现进程同步】: 首先为各并发进程设置私用信号量,然后为私用信号量赋初值,最后利用P、V原语和私用信号量规定各进程的执行顺序。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
『操作系统』 进程的描述与控制 Part2 进程同步
(1)直接: 相互制约关系源于进程合作,表现为: 进程—进程 (同步:合作完成任务的关系!) 为完成同一个任务的诸进程间,因需要协调它们的工作而相互等待、相互交换信息所产生的直接制约关系。 这种制约主要源于进程间的合作。 发生在相关进程之间 eg:
风骨散人Chiam
2021/09/06
1.4K0
操作系统 并发与同步
如果一个进程的执行不影响其他进程的执行,且与其他进程的进展情况无关,即它们是各自独立的,则说这些并发进程的相互之间是无关的。无关的并发进程一定没有共享的变量。
Meng小羽
2019/12/23
1.1K0
操作系统第二章进程的描述与控制_进程同步和互斥的区别
知识点回顾:进程具有异步性的特征。异步性是指,各并发执行的进程以各自独立的、不可预知的速度向前推进。
全栈程序员站长
2022/09/30
6960
操作系统第二章进程的描述与控制_进程同步和互斥的区别
操作系统之进程管理(下),同步互斥死锁问题,看看操作系统怎么解决的
进程具有异步性的特征。异步性是指,各并发执行的进程以各自独立的、不可预知的速度向前推进。
阿甘的码路
2022/09/22
8530
操作系统之进程管理(下),同步互斥死锁问题,看看操作系统怎么解决的
操作系统:第二章 进程的描述与控制(下)
进程同步:在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约关系。
Here_SDUT
2022/08/08
7610
操作系统:第二章 进程的描述与控制(下)
看完了进程同步与互斥机制,我终于彻底理解了 PV 操作
在多道批处理系统中,多个进程是可以并发执行的,但由于系统的资源有限,进程的执行不是一贯到底的, 而是走走停停,以不可预知的速度向前推进,这就是进程的「异步性」。
飞天小牛肉
2021/03/18
14.2K0
看完了进程同步与互斥机制,我终于彻底理解了 PV 操作
操作系统学习笔记-并发性:互斥和同步
支持并发进程的基本要求是加强**互斥(Mutual exclusion)**的能力(即排他性),具体表现为:当一个进程被授予互斥能力时,在该进程的访问共享资源(如文件、I/O访问)的活动期间,不允许其它进程访问该资源。
花猪
2022/02/16
1.5K0
操作系统学习笔记-并发性:互斥和同步
操作系统笔记【进程互斥同步及通信死锁问题】
由于我们今天的问题是基于并发的,所以我简单的通过一个 Java 多线程的例子来引入今天的内容(今天主要讲的是进程,这里的多线程问题,体会一下出现的问题就好了)
BWH_Steven
2020/05/09
7040
操作系统高级议题:并发控制与进程互斥技术
为了使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性,必须提供进程同步机制。
Srlua
2024/03/30
1910
操作系统高级议题:并发控制与进程互斥技术
进程的同步、互斥、通信的区别,进程与线程同步的区别
这两天看进程的同步与通信,看了几本书上的介绍,也从网上搜了很多资料,越看越迷惑,被这几个问题搞得很纠结。
全栈程序员站长
2022/11/15
1.3K0
操作系统之信号量、P、V操作
信号量是最早出现的用来解决进程同步与互斥问题的机制(也可实现进程通信),包括一个称为信 号量的变量及对它进行的两个原语操作。信号量为一个整数,我们设这个信号量为:sem。很显然,我们规定在sem大于等于零的时候代表可供并发进程使用的 资源实体数,sem小于零的时候,表示正在等待使用临界区的进程的个数。根据这个原则,在给信号量附初值的时候,我们显然就要设初值大于零。
kif
2023/02/27
1.5K0
OS-操作系统学习笔记-5:进程同步与进程互斥(二):信号量机制
在上一篇笔记中,我们介绍到了进程同步和进程互斥,以及用软件层面上的四种方法、硬件层面上的三种方法,分别实现进程互斥。但是这些方法大部分都存在着一些问题:
Chor
2020/03/31
2K0
OS-操作系统学习笔记-5:进程同步与进程互斥(二):信号量机制
进程同步概念简介 多线程上篇(四)
比如尽管有两个人去水井打水,但是水井却只有一个;合理安排的话刚好错开,但是如果安排不合理,那就会出现冲突,出现冲突怎么办?总有一个先来后到,等下就好了。
noteless
2019/03/04
1.5K0
[每天五分钟,备战架构师-2]操作系统基本原理
操作系统是管理和控制计算机硬件和软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件。注意,这里说的裸机可以是物理机,也可以是虚拟机。随着技术的发展,现在还出现了Docker容器技术,一个Docker容器实际上不一定需要具备完整的系统功能也能够运行程序,其底层是通过宿主机的内核来与硬件进行交互的。
大江小浪
2018/09/19
5380
[每天五分钟,备战架构师-2]操作系统基本原理
16-用信号量实现进程互斥,同步,前驱关系
例如,在上面的P1和P2进程中,由于异步性导致程序执行顺序并不确定,但我们必须保证代码1和代码2在代码4之前执行,此时就需要使用进程同步机制实现
Ywrby
2022/10/27
6900
16-用信号量实现进程互斥,同步,前驱关系
信号量机制实现进程控制
我们将一次仅允许一个进程访问的资源称为临界资源,而临界区是指访问临界资源的那段代码。
wsuo
2020/11/24
8530
信号量机制实现进程控制
进程的同步、互斥以及PV原语
在处理进程间的同步与互斥问题时,我们离不开信号量和PV原语,使用这两个工具的目的在于打造一段不可分割不可中断的程序。应当注意的是,信号量和PV原语是解决进程间同步与互斥问题的一种机制,但并不是唯一的机制。
大江小浪
2018/07/25
1.8K0
进程的同步、互斥以及PV原语
操作系统 - 进程
系统为每一个运行的程序配置一个数据结构,称为进程控制块(PCB),用来描述进程的各种信息(如程序代码存放位置)
ppxai
2020/09/23
9420
操作系统 - 进程
其他篇之操作系统——进程管理
(2)不考虑缓存情况,CPU能且只能对内存进行读写,不能访问外设(输入输出设备);
一半是我
2020/04/26
7250
操作系统笔记-进程
由于某些硬件或操作是需要操作系统进行调用的,保证安全所以防止用户直接进行操作,而当用户要操作的只有操作系统能够调用的操作的时候,此时需要通知操作系统,而此时则是产生中断,中断实际上就是设置中断寄存器的标识位,cpu会在每个指令后检查其中断寄存器是否发生中断,如果发生则需要执行对应的中断程序。
大猫的Java笔记
2023/03/08
6150
操作系统笔记-进程
推荐阅读
相关推荐
『操作系统』 进程的描述与控制 Part2 进程同步
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验