原子操做和锁

https://blog.csdn.net/xgjianstart/article/details/4544314
原子操做linux

在多进程(线程)的操做系统中不能被其它进程(线程)打断的操做就叫原子操做,文件的原子操做是指操做文件时的不能被打断的操做。原子操做是不可分割的,在执行过程当中不会被任何其它任务或事件中断。

  linux内核提供了一系列函数来实现内核中的原子操做,这些函数又分为两类,分别针对位和整型变量进行原子操做。它们的共同点是在任何状况下操做都是原子的,内核代码能够安全地调用它们而不被打断。位和整型变量原子操做都依赖底层CPU的原子操做实现,所以全部这些函数都与CPU的架构密切相关。

 ------------------------------------------------------安全


  在linux中,实现文件上锁的函数有lock和fcntl,其中lock用于对文件施加建议性锁,而fcntl不只能够施加建议性锁,还能够施增强制锁。同时,fcntl还能对文件的莫一记录进行上锁,也便是记录锁。记录锁分为读取锁(共享锁)和写入锁(排斥锁)。
  自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来讲,防止中断处理中的并发可简单采用关闭中断的方式,不须要自旋锁)。
  自旋锁最多只能被一个内核任务持有,若是一个内核任务试图请求一个已被争用(已经被持有)的自旋锁,那么这个任务就会一直进行忙循环——旋转——等待锁从新可用。要是锁未被争用,请求它的内核任务便能马上获得它而且继续进行。自旋锁能够在任什么时候刻防止多于一个的内核任务同时进入临界区,所以这种锁可有效地避免多处理器上并发运行的内核任务竞争共享资源。
  事实上,自旋锁的初衷就是:在短时间间内进行轻量级的锁定。一个被争用的自旋锁使得请求它的线程在等待锁从新可用的期间进行自旋(特别浪费处理器时间),因此自旋锁不该该被持有时间过长。若是须要长时间锁定的话, 最好使用信号量。
  自旋锁的基本形式以下:
  spin_lock(&mr_lock);
  //临界区
  spin_unlock(&mr_lock);
  由于自旋锁在同一时刻只能被最多一个内核任务持有,因此一个时刻只有一个线程容许存在于临界区中。这点很好地知足了对称多处理机器须要的锁定服务。在单处理器上,自旋锁仅仅看成一个设置内核抢占的开关。若是内核抢占也不存在,那么自旋锁会在编译时被彻底剔除出内核。
  简单的说,自旋锁在内核中主要用来防止多处理器中并发访问临界区,防止内核抢占形成的竞争。另外自旋锁不容许任务睡眠(持有自旋锁的任务睡眠会形成自死锁——由于睡眠有可能形成持有锁的内核任务被从新调度,而再次申请本身已持有的锁),它可以在中断上下文中使用。
  死锁:假设有一个或多个内核任务和一个或多个资源,每一个内核都在等待其中的一个资源,但全部的资源都已经被占用了。这便会发生全部内核任务都在相互等待,但它们永远不会释放已经占有的资源,因而任何内核任务都没法得到所须要的资源,没法继续运行,这便意味着死锁发生了。自死琐是说本身占有了某个资源,而后本身又申请本身已占有的资源,显然不可能再得到该资源,所以就自缚手脚了。架构

相关文章
相关标签/搜索