美文网首页Core CS
《操作系统概念》笔记 临界区问题 - TSL & mutex l

《操作系统概念》笔记 临界区问题 - TSL & mutex l

作者: 不动点P | 来源:发表于2019-06-06 20:18 被阅读0次

mutex lock是建立在操作系统给的特殊指令上的一种软件解决方法。

实际上就是test_and_set 以及 compare_and_swap 等指令的高级调用。当然,这里的test and set 和 compare and swap不是具体实现在某个平台的指令,只是抽象的定义了两类的指令。

如果不熟悉test and set的话,那么test and set指令的定义是这样的

bool tas(bool *target){
  bool rv = *target;
  *target = true;
  return rv
}

当然,这只是定义,整个命令是作为一个atomic的指令的。

利用test and set命令来实现互斥是这个样子的:

do{
  while(tas(&lock))
      ;
  /*critical section*/
  lock = false;
  /*remainder section*/
}while(true);

lock 一开始被初始化为false,然后执行第一句while(tas(&lock)) 的时候
会发生两件事情,第一个就是这句话本身结果是false,这样就允许该线程接着往下执行进入临界区,第二个是这句话将lock赋值成true。

而当lock 取true值的时候,第二个线程如果执行第一句while(tas(&lock))的话,会无限循环busy waiting。就进不了临界区,直到第一个线程将lock 设置为false。 那个时候第一个线程也就已经离开临界区了,就达到了互斥的效果。

compare_and_swap的指令定义如下:

int cas(int *val, int exp, int new_val){
  int tmp = *val;
  if(*val = exp)
    *val = new_val;
  return tmp;
}

使用cas命令的互斥:

lock = 0;
do{
  while(cas(&lock,0,1) != 0 )
    ;
  lock = 0;
}while(true);

cas命令的分析也不难。

以上两个是操作系统提供的硬件的解决方法。但很可惜的是,用户程序一般不用汇编开发。所以类似于pthread ,windows都会提供软件上的解决方法。

最直接的思路就是mutex lock:在进入临界区之前应当获得一个lock,其他没有lock的线程就进入不了临界区,离开临界区应该释放掉这个lock,以便其他线程获得lock。

lock 的两个动作 ---获得,释放的定义如下:

acquire(){
  while(!available)
    ;
  available = false;
}
release(){
  available = true;
}

要注意的是,acquire和release都是atomic的。

看到acquire的定义的时候是不是感觉到了一股既视感?回想一下tas里,第一句while执行的时候的两个动作,我们将lock 从 false变成 true,我们
tas指令返回false,从而使得while空循环不执行。

在这里,available默认为true,从而使得while空循环不执行,然后我们将available从true变成了false。

把lock 看成 (!available),我们知道tas固定设置lock = true ,也就是available = false;
这里用tas实现一下acquire :

/*初始化lock = false*/
while(tas(&lock)) 
  ;

tas(&lock)返回false,进入临界区,同时lock = true 阻碍了其他进程进入临界区。

但是因为tas命令只能实现lock = true 也就是available = false,所以我们无法用它来实现release,这个时候就可以用cas命令

而release实现如下:

cas(&lock, false, true);

当lock = false 的时候,我们将他改变成true。

于是我们现在有了TSL和mutex lock了。

相关文章

  • 《操作系统概念》笔记 临界区问题 - TSL & mutex l

    mutex lock是建立在操作系统给的特殊指令上的一种软件解决方法。 实际上就是test_and_set 以及 ...

  • 25. Mutex

    25. Mutex 临界区 在学习 Mutex 之前,我们需要理解并发编程中临界区(Critical Sectio...

  • RTOS基础(事件控制块实现)笔记

    临界区保护 问题原因 临界区概念 使用关中断保护临界区 嵌套中断问题 设计实现 思考 调度锁保护 设计目标 调度锁...

  • 临界区问题概念

    临界区 Critical Sections 是访问共享数据的代码,生产者消费者代码中的count++\count-...

  • 多线程学习(十一)

    所需头文件 一.windows临界区 下面我们介绍一下,windows临界区,与我们前面介绍的C++中的mutex...

  • Locks

    与锁有关的操作 Acquire() :在进入临界区前调用 Release():在离开临界区后调用有的操作系统可能会...

  • android 多线程——Callback

    线程同步的四种机制 线程同步有四种机制,分别是临界区(Critical Section)、互斥量(Mutex)、信...

  • 临界区

    什么是临界区被synchronized包裹的代码叫临界区 效率问题synchronized包裹的代码越多,临界区越...

  • 操作系统基本概念

    操作系统中为什么要引入线程? 减小程序在并发执行时所付出的时空开销 提高操作系统的并发性能 什么是临界资源与临界区...

  • golang笔记——深入了解go中锁机制

    一、锁的基础知识 1. 互斥量/互斥锁 互斥量(Mutex), 又称为互斥锁, 是一种用来保护临界区的特殊变量, ...

网友评论

    本文标题:《操作系统概念》笔记 临界区问题 - TSL & mutex l

    本文链接:https://www.haomeiwen.com/subject/ciauxctx.html