【操作系统】【进程同步】信号量机制

进程互斥

进程p1和p2都会访问同一个临界资源,那么必须保证两者不能同时访问,对应一把钥匙一扇门,当其中一个进程拿到钥匙后,另外一个进程只能等待,即进入阻塞状态,假设p1拿到钥匙,p2在等待,但是p2不能一直等待,不进行下去啊,所以p1访问完临界资源后,要记得把钥匙还回去,即将p2从阻塞状态变为就绪状态。

之后P2从就绪状态变为运行状态,p2拿到钥匙,此时p1不能再进去了,等到p2访问完临界资源后,将钥匙返还。

一个进程执行的顺序,首先拿钥匙,没有钥匙就会进入阻塞状态(①)。其次,访问临界资源(②),之后应该归还钥匙,归还钥匙,看看有没有进程在门外等待,有的话,应该将其唤醒(③),使其从阻塞状态转变为就绪状态,最后,还有一些其他的事情要做(④)。
在①、②、③、④步,任何一步执行完后,都会因为分配的时间片到了,从运行状态转变为就绪状态。

现在啊,我有两把钥匙,有四个进程需要执行p1,p2,p3,p4。进程p1先执行、其他进程进入就绪状态,拿到钥匙,此时,还剩一把钥匙。访问临界资源后,执行完第②步后,因为时间片到了,所以进入就绪状态,那么进程p2拿到钥匙,此时没有钥匙了,访问临界资源,时间片到,变为就绪状态,此时,进程p3执行,发现没有钥匙了,进入阻塞状态。p4执行,也发现没有钥匙,进入阻塞状态。此时,进程p2由就绪进入运行状态,归还钥匙,发现有进程在门外等待,将进程p3唤醒,p3进入就绪状态,进行其他操作(④),时间片到了,变为就绪状态。p3由就绪状态转变为运行状态,借钥匙,访问临界状态,归还钥匙,(此时,p1手中还有一把钥匙),还钥匙发现p4在门外等待,于是将其唤醒,p4进入就绪状态,p3因为归还钥匙后,时间片也到了,于是进入就绪状态,p1从就绪状态转变为运行状态,归还钥匙,执行其他操作,时间片到,进入就绪状态。进程p4从就绪状态转变为运行状态,借钥匙,访问临界资源,时间片到,进入就绪状态,后续故事…未完结

注意:必须保证在任意时刻都要有进程在运行状态,(从就绪队列的挑选进程运行)
由于时间片在①、②、③、④步后,任何一步都可能终结,所以以上过程是有多种可能的,不要纠结为什么在第②步,时间片就到了,第③步、第④步,时间片到,也有可能。也不要纠结为什么突然就跳到p1从就绪转变为运行状态了,因为要保证有一个进程运行,从就绪队列里随机抽取。

进程同步

进程同步:即不仅要求进程互斥,而且进程之间还要要求按照一定的顺序执行。

我要先刷完牙、洗完脸,才能干饭啊!因此进程之间也是有先后顺序的,现在要求必须进程p1完成后,p2才能开始运行。那如何进行设计呢?

我呢,设计一开始是没有钥匙的,那么p2之后在门外等待,然后,当p1完成后,就给一把钥匙,将p2从阻塞状态转变为就绪状态。等到p1让出cpu时,p2就能执行了。

现在呢,要求必须保证进程p1、p2访问临界资源后,p3才能执行,还要保证p3访问临界资源后,p4才能执行。(不是立即执行)

我呢,设计一开始是没有钥匙的,所以p3,p4只能在门外等待。我设计进程p1访问临界资源后,给一个钥匙a,p2访问临界资源后,给一个钥匙b,那么在p1,p2没有给钥匙之前,p3只能阻塞。当p1,p2都把钥匙a,b给出后,p3才能进入就绪状态,当p3访问临界资源后,给一个钥匙c,p4才能运行。

注意: 拿钥匙和还钥匙都是原子操作,就是不能被打断。而访问临界资源和进行其他操作都有可能中途被打断,时间片到了,进程需要让出CPU,进入就绪状态。
不允许两个进程同时访问相同的临界资源,就是必须保证只有一个进程将该临界资源访问完,其他进程才能进行访问。如果一个进程访问临界资源中途时间片到了,轮到其他进程运行,不允许其他进程可以访问该临界资源。

想象一个临界资源就是一扇门,只有一把钥匙可以打开这扇门。无论有多少个进程都需要访问该临界资源,都必须获得唯一一把钥匙,才能访问,否则只能进入阻塞状态。

现在,思考一个问题,河南岸与河北岸各有8个小孩子,只有一个独木桥连接着两岸,要求所有的小孩子都到达对岸,不允许独木桥上有一个小孩过桥,后面还有小孩跟着,只允许独木桥每次只有一个小孩过桥,如何设计呢?

操作系统概念第七版习题答案

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
操作系统中的进程同步是为了保证多个进程或线程之间的顺序执行和资源的正确访问。以下是一些常见的操作系统进程同步代码: 1. 互斥锁(Mutex): 互斥锁是最常见的进程同步机制之一,它用于保护共享资源的访问。在进程需要访问共享资源之前,先获取互斥锁,访问完成后再释放互斥锁,以确保同一时间只有一个进程可以访问共享资源。 示例代码: ``` // 定义互斥锁 Mutex mutex; // 进程1 mutex.lock(); // 访问共享资源 mutex.unlock(); // 进程2 mutex.lock(); // 访问共享资源 mutex.unlock(); ``` 2. 信号量(Semaphore): 信号量是一种计数器,用于控制对共享资源的访问。它可以用来限制同时访问共享资源的进程数量。 示例代码: ``` // 定义信号量 Semaphore semaphore(1); // 初始值为1,表示只允许一个进程访问共享资源 // 进程1 semaphore.wait(); // 等待信号量 // 访问共享资源 semaphore.signal(); // 释放信号量 // 进程2 semaphore.wait(); // 等待信号量 // 访问共享资源 semaphore.signal(); // 释放信号量 ``` 3. 条件变量(Condition Variable): 条件变量用于在多个进程之间进行等待和通知。当一个进程需要等待某个条件满足时,可以通过条件变量进行等待,而其他进程可以通过条件变量发送信号来通知等待的进程。 示例代码: ``` // 定义条件变量和互斥锁 ConditionVariable condVar; Mutex mutex; // 进程1 mutex.lock(); while (!condition) { condVar.wait(mutex); // 等待条件满足 } // 执行操作 mutex.unlock(); // 进程2 mutex.lock(); condition = true; // 设置条件为满足 condVar.signal(); // 发送信号通知等待的进程 mutex.unlock(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值