操作系统 第四章 进程同步
发布时间:2023年12月22日
- 基本概念
- 引入
- 在并发环境中,多个进程可能需要共享某些资源或通过某种方式进行通信。为了保证数据的一致性和进程的协调,需要有一种机制来控制进程对共享资源的访问,这就是进程同步。
- 临界区问题
- 临界资源
- 临界资源是在任何时刻只允许一个进程访问的资源。例如,打印机、数据库连接、文件等。
- 准则
- 1.空闲让进:
- 临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区;
- 2. 忙则等待:
- 当已有进程进入临界区时,其他试图进入临界区的进程必须等待;
- 3. 有限等待
- 对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿);
- 4. 让权等待
- 当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。
- 同步机制
- 软件同步机制
- 信号量(Semaphore):信号量是一个整数值,它提供了两个原子操作:P(等待)和V(信号)。如果一个进程在一个信号量上执行P操作,那么信号量的值将减一;如果信号量的值为零,那么进程将阻塞,直到信号量的值大于零。如果一个进程在一个信号量上执行V操作,那么信号量的值将加一,如果有进程在该信号量上阻塞,那么一个进程将被唤醒。
- 管程(Monitor):管程是一种高级同步机制,它将共享变量和对这些变量的操作封装在一起。进程可以调用管程中的方法来操作共享变量,但在任何时刻,只有一个进程可以在管程中执行。
- 硬件同步机制
- 1.关中断
- 在进入锁测试之前关闭中断,直到完成锁测试并上锁之后才能打开中断。进程在临界区执行期间,计算机系统不响应中断,从而不会引发调度,也就不会发生进程或线程的切换。由此保证了对锁测试和关锁操作的连续性和完整性,有效保证了互斥。
- 缺陷
- ①滥用关中断权力可能导致严重后果。
- ②关中断时间过长影响系统效率,限制了处理器交叉执行程序的能力。
- ③关中断方法不适用于多CPU系统,在一个处理器上关中断不能阻止进程在其他处理器上执行相同的临界段代码。
- 2.Test-and-Set 指令
- 这是一种硬件指令,它可以测试和设置一个内存位置的值。这个操作是原子的,即在执行这个操作的过程中,不会被其他进程或中断打断。这个指令通常用于实现锁,以保护临界区。
- 3.Swap指令实现进程互斥
- Swap指令是另一种硬件指令,它可以交换两个内存位置的值。这个操作也是原子的。Swap指令也可以用于实现锁。
- 信号量机制
- 介绍
- 1.整型信号量
- 最初有Dijkstra把整型信号量定义为一个用于表示资源数目的整型量S,它与一般整型量不同,除初始化外,仅能通过两个标准原子操作(Atomic Operation):wait(s),signal(s) 访问,很长时间以来,这两个操作一直被分别称为P,V操作。
- 2.记录型信号量
- 记录型信号量机制中S->value的初值表示系统中某类资源的数目,因而又称为资源信号量记录型信号量采取了“让权等待”策略而不存在“忙等”现象但是会有多个进程等待访问同一临界资源的情况所以在记录型信号量机制中除了需要一个表示资源数目的变量value外,还需要增加一个进程链表指针list,用于链接上述所有等待的进程。
- 3.AND型信号量
- AND型信号量的引入原因:AND型信号量针对一个进程需要获得两个或更多的共享资源后方能执行任务的场合。假定两个进程A和B,它们都要求访问共享数据D和E,共享数据都应作为临界资源。
- 4.信号量集
- 对AND型信号量机制进行扩充,对进程所申请的所有资源以及每类资源不同的资源需求量,在一次P,V原语操作中完成申请或释放。
- 应用
- 进程互斥:信号量可以用于实现进程互斥,即在任何时刻,最多只有一个进程可以访问某个资源。这可以通过初始化一个信号量为1,然后在进入临界区之前执行wait操作,在离开临界区之后执行signal操作来实现。
- 进程同步:信号量也可以用于实现进程同步,即控制进程的执行顺序。例如,一个进程P1在其执行过程中产生了某个结果,另一个进程P2需要使用这个结果,那么P2必须在P1之后执行。这可以通过初始化一个信号量为0,然后让P1在产生结果之后执行signal操作,让P2在使用结果之前执行wait操作来实现。
- 管程机制
-
-
- 含义
- 管程是一种同步机制,它将共享数据结构和对这些数据结构的操作封装在一起,形成一个资源管理模块。这样,只有通过这些操作才能访问共享数据,从而保证了数据的一致性。
- 组成
- 管程的名称:每个管程都有一个唯一的名称,用于标识这个管程。
- 局部于管程的共享数据结构说明:这些是管程内部的数据结构,只能被管程内的过程访问。
- 对该数据结构进行操作的一组过程:这些过程定义了如何操作共享数据。只有通过这些过程,才能访问共享数据。
- 对局部与管程的共享数据设置初始值的语句:这些语句用于初始化共享数据。
- 特点
- 模块化:管程是一个基本的程序单位,可以单独编译。这使得程序的结构更清晰,更易于理解和维护。
- 抽象数据类型:管程不仅包含数据,还包含对数据的操作。这使得数据和操作紧密地结合在一起,提高了程序的可靠性。
- 信息掩蔽:管程内的数据只能被管程内的过程访问,内部数据结构和过程对外不可见。这提供了一种有效的保护机制,防止了非法访问。
- 同步问题
- 1 生产者-消费者问题
- 该问题描述了共享固定大小缓冲区的两个线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。
- 2哲学家进餐问题
- 假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐桌上有五碗意大利面,每位哲学家之间各有一支餐叉。因为用一支餐叉很难吃到意大利面,所以假设哲学家必须用两支餐叉吃东西。他们只能使用自己左右手边的那两支餐叉。
- 3 读者-写者问题
- 问题描述为:对于同一个文件,读操作可以同时并行,读写操作互斥,写与写互斥。读者写者问题可分为读者优先、读写公平、写者优先三种,无论是其中哪一种,在没有程序占用临界区时,读者与写者之间的竞争都是公平的,所谓的不公平(优先)是在读者优先和写者优先中,优先方只要占有了临界区,那么之后所有优先方的程序便占有了临界区的主导权,所谓的优先可以理解为优先方在占有临界区后便可以对临界区进行“垄断”。
文章来源:https://blog.csdn.net/weixin_54727590/article/details/135150943
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:chenni525@qq.com进行投诉反馈,一经查实,立即删除!