进程同步

竞争条件

竞争条件:操作系统能够并发运行多个进程/线程,这些进程可能共享某些数据。多个进程并发访问同一数据时,进程的推演顺序将影响最后的执行结果。
举个例子,进程P1和P2共享资源(数据)count(初始值为5).
P1中执行count++;
P2中执行count--;
P1和P2并发执行。
因为count++count--都不是原子操作,它们都需要经过一下步骤:

register=count;
register=register+1;
count=register;

如果P1和P2并发执行这段代码可能得不到预期的结果,count值可能为4,5,6。 可见count++count--在执行时的推演顺序会影响执行结果。这里,我们称count++count--为临界区代码。

临界区:当系统上并发执行的多个进程共享同一数据时, 操作这些共享数据的代码段称为临界区.

另外,P1和P2会并发执行count++count--,是基于系统是抢占调度。 如果是非抢占式内核, 进程会在结束或者切换为就绪状态才会进行CPU调度。

进程同步 与 避免竞争条件

竞争条件会导致程序得到非预期的结果,因此需要避免竞争条件。 进程同步机制就是用来避免竞争条件的。
进程同步首先要解决临界区问题,
临界区代码应达到以下目标: 任意时刻,只有一个进程进入临界区,且各个进程都能推进。
这一目标包含以下三个要求:
+ 互斥: 只要有一个进程进入临界区,其他进程不能进入临界区
+ 前进: 没有进程在临界区时,可以选择一个进程进入临界区。
+ 有限的等待: 一个进程做出进入临界区的请求后,其他进程进入临界区的次数要有上限。

信号量

信号量可以用于实现进程同步。
信号量是一种特殊变量,它有PV两种操作。
假设我们有信号量sv,则其PV操作含义如下:

操作含义描述
P(sv)检测、等待如果sv大于0,则sv减1,并往下执行; 如果sv等于0, 则挂起进程
V(sv)发送信号如果有其他进程被挂起,则让其恢复运行;否则,sv加1

模型:

while (True{
    P(sv);
    临界区;
    V(sv);
}

我们来看下信号量如何解决临界区的三个要求:
初始时,让sv初始为1, (表示最多允许一个进程进入临界区),
1. 互斥: 当一个进程进入临界区时,sv被减1,;这时其他进程不能再进入临界区。
2. 前进: 没有进程在临界区时,sv为1(上一个进程离开时,且没有其他进程立即进入是,sv因加1操作,被置为1了), 可以选择进程进入临界区
3. 有限等待: 有其他进程被挂起时,让其恢复运行;(注意,刚刚离开临界区的进程还没有被挂起,因而还不能进入,其他进程优先进入); 避免出现某个进程循环进入临界区。(在多个进程时,没有完全解决有限等待问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值