并行中的同步与互斥

同步与互斥

1同步:同步是指多个进程之间的依赖关系,后者必须依赖前面进程产生的数据。

2互斥:互斥是指多个进程的制约关系,尤其是在多任务操作系统中,有的资源同一时间只能够有一个进程进行使用,不然会发生数据的不确定性。

3实现互斥的方法:

3.1原子操作

假设使用一个全局变量peinter(只能是全局变量)表示可用的打印机数量,这个变量初始化为1,进程按照下面的方式申请使用打印机。

1 intrequest_printer()

2 {

3     while(printer==0)

4         wait();

5     printer--;

6  ………….

7 }

分析下这段代码的运行过程:当printer0时,说明别的进程正在使用打印机,于是当前进程进入等待状态(即挂起),当进程被唤醒时,如果检测到printer不为0的时候,就跳出while循环。While的实现模式还有种过程被称作忙等待(即while condition );这种实现模式下,通过while循环的忙计算来获得全局变量的标志,但是忙等待的计算是没有必要的,白白浪费了珍贵的CPU时间。

3.2信号量:信号量是建立在原子操作的基础上的,信号量实际上是一个整数型变量,有两个最基本的原子操作,我们还是以上面的打印机的例子来说明信号量是怎样保证多线程同时访问一块数据区域的。当进程需要使用打印机时:执行如下操作

1  printer--

2  if(printer>=0){

3  /*使用打印机*/

4  }else{

5  /*

6  *把当前进程设置为阻塞模式,并且加入到信号量printer的等待

7  *队列然后调度其他进程运行

8  */

9  }

当这个进程使用结束后需要执行:

1  printer++

2  if(printer<=0){

3  /*从信号量printer的等待队列中唤醒一个进程*/

4  }

可以看出,信号量的初值表示资源的可用数量,当它为0时,说明供求恰好满足,当它小于0的时候,说明供小于求,当它大于0的时候反映了供大于求。

3.3.自旋锁:

CPU的工作过程可以了解通过关中断的方式可以使CPU在执行某些“临界区”的时候避免发生打扰,但是cli只能关闭当前CPU的中断,因此在多CPU的系统中还是无法解决进城同时访问一块数据的情况,这是因为当其中一个CPU关闭中断后,不能保证别的CPU不访问这段数据。由于以下的理由,在多CPU的环境下,信号量显得不合适:

1信号量引起的进程切换消耗相对较大,显的不太合适。

2由于信号量可能引起进程切换,但是在某些环境下,是不允许进程切换的

因此在这种情况下,当一个进程不能进入临界区时,最好的办法就是让CPU处于忙等待状态。其基本原理就是设置一个锁变量,当CPU进入临界区之前检查锁的状态,如果已经上锁,则CPU执行一个空循环反复检查锁的状态,知道锁处于解锁状态。由于在CPU处于忙等待的“自旋状态”,因此把这种机制成为自旋锁。具体的代码形式就不在写了,whilecondition repeat

3.4RCU机制:自旋锁能够很好的对临界资源进行保护,但是当CPU处于自旋状态实际上是在做“无用功”,因此我们需要尽量避免使用自旋锁,在实际应用中,对于某些关键数据而言,读取操作的次数远远超过修改操作的次数。典型的例子就是OS内核中的路由表,每当接受一个数据是,OS内核路由模块都要读取路由表,但是我们知道很少修改路由表,事实上多CPU同时读取路由表的时候并不会造成任何损害,有兴趣的同学可以好好看看这方面的东西。

3.5percpu变量:相对于自旋锁来说,RCU减小了临界区同步的开销,但并不是所有应用都满足RCU的前提条件(读取操作远远大于修改操作,读操作不加锁,写操作加锁)。例如在CPU的调度队列中,假设多个CPU共享同一个调度序列,各个CPU需要频繁对调度序列中的关键字进行操作,而且读写的次数并不会远远小于写操作的次数。因此必须使用自旋锁来保护。事实上内核中的进程切换非常频繁,各个CPU都需要频繁的访问调度序列。在这种情况下,某些CPU由于获取不到自旋锁进入了忙等待状态。为了提高性能,最好的办法就是各个CPU使用各自的运行队列,这样在访问时就不需要使用锁来保护,当某个CPU的就绪进程个数为0或大于某个阈值时,启动负载均衡机制来平衡各个CPU的运行队列。我们把这样的变量称为percpu变量。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值