临界资源的同步与互斥,区分临界资源与临界区,二义性分析

描述

互斥:同一时间,当只保证互斥,则可以保证临界资源访问不会造成临界资源数据的二义性,但是有可能占有临界资源的进程一直在占有,导致后面进程访问等待时间比较长
同步:保证对临界资源访问的合理性

1. 互斥
如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入,保证只能有一个进程访问临界资源
任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待
2. 同步
进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区
如果进程不能进入自己的临界区,则应让出 CPU,避免进程出现 “ 忙等 ” 现象

以管道举例:管道也要满足同步互斥的原则

当写端往管道当中写入数据的时候不超过 PIPE_BUF(一次性可读大小最大为4k,PIPE_SIZE管道大小为64k) 的时候,管道保证进程在读取数据时的原子性

概念

  1. 原子性:进程当前的操作不能被打断,即对管道的读写操作不能被打断,由于此特点,导致操作结果只有一个,要么完成,要么未完成,体现互斥同步思想

  2. 临界区:每个进程中访问临界资源(比如全局变量等公用资源)的代码称为临界区

  3. 临界资源:临界资源是一次仅允许一个进程使用的共享资源,如全局变量等),也称为临界段或互斥资源

二义性

每个进程都可以访问这个全局变量的代码,对于某一临界资源,对应的临界区具体来说有多个(多个进程都可以有)。

同一时间,当前的资源只能被一个进程所访问,由于不同的线程(进程),对资源的访问(读,写,修改),可能造成数据的二义性
用户对临界资源的访问 + 操作系统对进程的调度,有可能导致修改操作不是一步完成的,中途操作被打断,这会儿就有可能有其他的进程访问到上一个进程需要修改的资源,就会造成修改资源之后,数据的二义性,从而导致程序运行结果不正确
举个例:
有两个PCB(p1,p2)分别要对一个全局变量 val = 10 进行 – 的操作,正常情况下结果应该是 8 ,但在临界资源的访问 + 操作系统对进程的调度下,可能会导致 p1 先将数据进行寄存未修改,p2 就已经占用 CPU 进行数据寄存和修改 val 为 9,之后再进行 p1 的修改,p1根据上下文信息将未修改前的 val (10)进行修改,依旧得到 9

发布了47 篇原创文章 · 获赞 108 · 访问量 4725

猜你喜欢

转载自blog.csdn.net/qq_44759710/article/details/104354733
今日推荐