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);
由於自旋鎖在同一時刻只能被最多一個內核任務持有,因此一個時刻只有一個線程容許存在於臨界區中。這點很好地知足了對稱多處理機器須要的鎖定服務。在單處理器上,自旋鎖僅僅看成一個設置內核搶佔的開關。若是內核搶佔也不存在,那麼自旋鎖會在編譯時被徹底剔除出內核。
簡單的說,自旋鎖在內核中主要用來防止多處理器中併發訪問臨界區,防止內核搶佔形成的競爭。另外自旋鎖不容許任務睡眠(持有自旋鎖的任務睡眠會形成自死鎖——由於睡眠有可能形成持有鎖的內核任務被從新調度,而再次申請本身已持有的鎖),它可以在中斷上下文中使用。
死鎖:假設有一個或多個內核任務和一個或多個資源,每一個內核都在等待其中的一個資源,但全部的資源都已經被佔用了。這便會發生全部內核任務都在相互等待,但它們永遠不會釋放已經佔有的資源,因而任何內核任務都沒法得到所須要的資源,沒法繼續運行,這便意味着死鎖發生了。自死瑣是說本身佔有了某個資源,而後本身又申請本身已佔有的資源,顯然不可能再得到該資源,所以就自縛手腳了。架構