內核同步措施
為了避免并發,防止競爭。內核提供了一組同步方法來提供對共享數據的保護。
我們的重點不是介紹這些方法的詳細用法,而是強調為什么使用這些方法和它們之間的差別。
Linux
使用的同步機制可以說從2.0到2.6以來不斷發展完善。從最初的原子操作,到后來的信號量,從大內核鎖到今天的自旋鎖。這些同步機制的發展伴隨
Linux從單處理器到對稱多處理器的過度;伴隨著從非搶占內核到搶占內核的過度。鎖機制越來越有效,也越來越復雜。
目前來說內核中原子操作多用來做計數使用,其它情況最常用的是兩種鎖以及它們的變種:一個是自旋鎖,另一個是信號量。我們下面就來著重介紹一下這兩種鎖機
制。
自旋鎖
------------------------------------------------------
自旋鎖是專為防止多處理器并發而引入的一種鎖,它在內核中大量應用于中斷處理等部分(對于單處理器來說,防止中斷處理中的并發可簡單采用關閉中斷的方式,
不需要自旋鎖)。
自旋鎖最多只能被一個內核任務持有,如果一個內核任務試圖請求一個已被爭用(已經被持有)的自旋鎖,那么這個任務就會一直進行忙循環——旋轉——等待鎖重
新可用。要是鎖未被爭用,請求它的內核任務便能立刻得到它并且繼續進行。自旋鎖可以在任何時刻防止多于一個的內核任務同
時進入臨界區,因此這種鎖可有效地避免多處理器上并發運行的內核任務競爭共享資源。
事實上,自旋鎖的初衷就是:在短期間內進行輕量級的鎖定。一個被爭用的自旋鎖使得請求它的線程在等待鎖重新可用的期間進行自旋(特別浪費處理器時間),所
以自旋鎖不應該被持有時間過長。如果需要長時間鎖定的話, 最好使用信號量。
自旋鎖的基本形式如下:
spin_lock(&mr_lock);
//臨界區
spin_unlock(&mr_lock);
因為自旋鎖在同一時刻只能被最多一個內核任務持有,所以一個時刻只有一個線程允許存在于臨界區中。這點很好地滿足了對稱多處理機器需要的鎖定服務。在單處
理器上,自旋鎖僅僅當作一個設置內核搶占的開關。如果內核搶占也不存在,那么自旋鎖會在編譯時被完全剔除出內核。
簡單的說,自旋鎖在內核中主要用來防止多處理器中并發訪問臨界區,防止
內核搶占造成的競爭。另外自旋鎖不允許任務睡眠(持有自旋鎖的任務睡眠會造成自死鎖——因為睡眠有可能造成持有鎖的內核
任務被重新調度,而再次申請自己已持有的鎖),它能夠在中斷上下文中使用。
死鎖:假設有一個或多個內核任務和一個或多個資源,每個內核都在等待其中的一個資源,但所有的資源都已經被占用了。這便會發生所有內核任務都在相互等待,
但它們永遠不會釋放已經占有的資源,于是任何內核任務都無法獲得所需要的資源,無法繼續運行,這便意味著死鎖發生了。自死瑣是說自己占有了某個資源,然后
自己又申請自己已占有的資源,顯然不可能再獲得該資源,因此就自縛手腳了。
信號量
------------------------------------------------------
Linux中的信號量是一種睡眠鎖。如果有一個任務試圖獲得一個已被持有的信號量時,信號量會將其推入等待隊列,然后讓其睡眠。這時處理器獲得自由去執行
其它代碼。當持有信號量的進程將信號量釋放后,在等待隊列中的一個任務將被喚醒,從而便可以獲得這個信號量。
信號量的睡眠特性,使得信號量適用于鎖會被長時間持有的情況;只能在進程上下文中使用,因為中斷上下文中是不能被調度的;另外當代碼持有信號量時,不可以
再持有自旋鎖。
信號量基本使用形式為:
static DECLARE_MUTEX(mr_sem);//聲明互斥信號量
if(down_interruptible(&mr_sem))
//可被中斷的睡眠,當信號來到,睡眠的任務被喚醒
//臨界區
up(&mr_sem);
信號量和自旋鎖區別
------------------------------------------------------
雖然聽起來兩者之間的使用條件復雜,其實在實際使用中信號量和自旋鎖并不易混淆。注意以下原則:
如果代碼需要睡眠——這往往是發生在和用戶空間同步時——使用信號量是唯一的選擇。由于不受睡眠的限制,使用信號量通常來說更加簡單一些。如果需要在自旋
鎖和信號量中作選擇,應該取決于鎖被持有的時間長短。理想情況是所有的鎖都應該盡可能短的被持有,但是如果鎖的持有時間較長的話,使用信號量是更好的選
擇。另外,信號量不同于自旋鎖,它不會關閉內核搶占,所以持有信號量的代碼可以被搶占。這意味者信號量不會對影響調度反應時間帶來負面影響。
自旋鎖對信號量
------------------------------------------------------
需求 建議的加鎖方法
低開銷加鎖 優先使用自旋鎖
短期鎖定 優先使用自旋鎖
長期加鎖 優先使用信號量
中斷上下文中加鎖 使用自旋鎖
持有鎖是需要睡眠、調度 使用信號量
from:
http://blog.chinaunix.net/u1/38576/showart_367985.html
只有注冊用戶登錄后才能發表評論。 | ||
【推薦】100%開源!大型工業跨平臺軟件C++源碼提供,建模,組態!
![]() |
||
相關文章:
|
||
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
|
||
|
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
31 | 1 | 2 | 3 | 4 | 5 | 6 | |||
7 | 8 | 9 | 10 | 11 | 12 | 13 | |||
14 | 15 | 16 | 17 | 18 | 19 | 20 | |||
21 | 22 | 23 | 24 | 25 | 26 | 27 | |||
28 | 29 | 30 | 1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
常用鏈接
留言簿(10)
隨筆分類(307)
- Algorithm(22)
- apache(1)
- Assembly(1)
- browser(2)
- C++_BASIS(39)
- Compiling Theorem(1)
- CPU(1)
- cvs(3)
- Database(8)
- Designed Patterns(3)
- FileFormat(4)
- FileSystem(1)
- freebsd(1)
- Game(2)
- gdb(1)
- Gossips(12)
- GP_STL(3)
- interview(8)
- java
- life and living(1)
- linux kernel(12)
- Linux_Coding(43)
- Linux_Driver
- Linux_SysAdmin(26)
- makefile(3)
- misce(5)
- MultiCore(1)
- Network(14)
- OS(18)
- RegularExpression(1)
- schedule(1)
- SearchEngine(1)
- security(2)
- Shell(25)
- Socket(18)
- storage(2)
- Template(4)
- VC_MFC(4)
- vi(5)
- website(1)
- windows(7)
隨筆檔案(297)
- 2012年10月 (1)
- 2012年9月 (1)
- 2012年7月 (1)
- 2012年6月 (7)
- 2012年5月 (3)
- 2012年4月 (2)
- 2011年9月 (3)
- 2011年8月 (3)
- 2011年6月 (3)
- 2011年5月 (2)
- 2011年3月 (2)
- 2011年1月 (1)
- 2010年12月 (2)
- 2010年11月 (6)
- 2010年10月 (4)
- 2010年9月 (7)
- 2010年8月 (12)
- 2010年7月 (6)
- 2010年6月 (5)
- 2010年5月 (11)
- 2010年4月 (16)
- 2010年3月 (20)
- 2010年2月 (18)
- 2010年1月 (26)
- 2009年12月 (34)
- 2009年11月 (36)
- 2009年10月 (5)
- 2009年9月 (1)
- 2009年7月 (2)
- 2009年6月 (3)
- 2009年5月 (6)
- 2009年4月 (6)
- 2009年3月 (11)
- 2009年2月 (6)
- 2008年11月 (1)
- 2008年10月 (1)
- 2008年9月 (3)
- 2008年8月 (4)
- 2008年7月 (16)
algorithm
- andytan
- algorithm, linux, os, network,etc
- EXACT STRING MATCHING ALGORITHMS
- httperf -- a web perf test tool
- Java多線程
- 編程夜未眠
- 布薩空間
- 結構之法
- 沈一峰 google技術博客
- 小兵的窩
Books_Free_Online
C++
- Bjarne Stroustrup's C++ Style and Technique FAQ
- boyplayee column
- C Plus Plus
- CPP Reference
- LearnC++Website
- Welcome to Bjarne Stroustrup's homepage!
database
Linux
Linux shell
linux socket
misce
- cloudward
- 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的
network
OSS
- Google Android
- Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
- os161 file list
overall
搜索
最新評論

- 1.?re: memcached完全剖析系列教程《轉》
- mark
- --zgpxgame
- 2.?re: 用prctl給線程命名
- 評論內容較長,點擊標題查看
- --none
- 3.?re: 用prctl給線程命名
- 請問大俠: 用top命令的時候可以顯示修改后的線程名么?如何做呢?
- --dhao123@sina.com
- 4.?re: 解決Linux pthread_create內存泄漏問題
-
我試過,每一種方法有的時候不行。
第二種是可以的。
- --朱先生
- 5.?re: 著名程序庫的比較和學習經驗
- 評論內容較長,點擊標題查看
- --buy dissertation
- 6.?re: linux的消息隊列與共享內存編程
- 內容選擇得很好,謝謝
- --朱志超
- 7.?re: 著名程序庫的比較和學習經驗
- 評論內容較長,點擊標題查看
- --LillianHancock
- 8.?re: 解決Linux pthread_create內存泄漏問題[未登錄]
- 不錯,支持一個。
- --jack
- 9.?re: 淺談游戲服務器---功能模塊上來看[未登錄]
- 不錯 好文!! 期待博主繼續
- --cppexplore
- 10.?re: 全面整理的C++面試題
- 評論內容較長,點擊標題查看
- --chatler
- 11.?re: 微軟面試中簡單的算法題目(轉)
- 評論內容較長,點擊標題查看
- --chatler
- 12.?re: Browsers, processes, cookies and session state
- 每個IE Instance該是不同的進程吧,可以獲取進程ID,在每個instance里建一個名稱包含進程id的目錄名,就可以分目錄存儲了吧。
- --chatler
- 13.?re: Browsers, processes, cookies and session state
-
文章說的很清楚,多謝
我有一個問題:
如何為每個ie instance ie實例的 Persistent cookies cookie 指定不同的存儲目錄? - --domolo
- 14.?re: 從一道面試題看指針與數組的區別
- 一個字,強!
- --路過
- 15.?re: 一個關于單向鏈表的面試題
- 評論內容較長,點擊標題查看
- --chatler
閱讀排行榜
- 1.?Windows Socket五種I/O模型(8344)
- 2.?最大公約數(Gcd)兩種算法(Euclid && Stein)<轉>(5501)
- 3.?用prctl給線程命名(5058)
- 4.?Linux core dump file詳解 <轉>(4497)
- 5.?算法面試題(3403)
- 6.?64位與32位編程的數據類型區別(3235)
- 7.?解決Linux pthread_create內存泄漏問題(3130)
- 8.?NUMA與英特爾下一代Xeon處理器學習心得<轉>(2998)
- 9.?c語言抓取網頁數據(2835)
- 10.?CVSNT服務器配置——添加用戶、解決無法登陸(2739)
- 11.? pthread_join函數及linux線程(2647)
- 12.?一個基于Event Poll(epoll)的TCP Server Framework,淺析epoll(2578)
-
13.?為 C/C++ 項目構建您自己的內存管理器
(2565) - 14.?memcached完全剖析系列教程《轉》(2511)
- 15.?G++編譯選項(2407)
- 16.?STL容器 erase的使用陷井<轉載>(2197)
- 17.?epoll使用例子(2120)
- 18.?linux的消息隊列與共享內存編程(2072)
- 19.?gdb帶參數調試(2064)
- 20.?The Linux Kernel Module Programming Guide(2015)
- 21.?一個關于單向鏈表的面試題(1913)
- 22.?c中strncmp與memcmp的區別(1886)
- 23.?優化Derby數據庫技巧(1836)
- 24.?一個基于完成端口的TCP Server Framework,淺析IOCP(1762)
- 25.?自己整理的指令(1754)
- 26.?autotools制作Makefile 和configure文件(1641)
- 27.?Google C++ Style Guide(1632)
- 28.?linux系統調用函數(1626)
- 29.?An In-Depth Look into the Win32 Portable Executable File Format(1614)
- 30.? vim大小寫轉換(1585)
- 31.?淺談游戲服務器---功能模塊上來看(1556)
-
32.?MIPS architecture
(1507) - 33.?教你用c實現http協議(1505)
- 34.?Aix下查看占用端口的進程(1484)
- 35.?史上最強bash函數庫(1410)
- 36.?linux trap詳解(1342)
- 37.?ms,google,vmware,nvidia美國總部面試題(1328)
- 38.?多CPU上的原子操作(1316)
- 39.?power函數寫法《轉》(1284)
-
40.?Critical Section
(1257)
評論排行榜
- 1.?著名程序庫的比較和學習經驗(3)
- 2.?解決Linux pthread_create內存泄漏問題(2)
- 3.?用prctl給線程命名(2)
-
4.?Browsers, processes, cookies and session state
(2) - 5.?全面整理的C++面試題(1)
- 6.?linux的消息隊列與共享內存編程(1)
- 7.?一個關于單向鏈表的面試題(1)
- 8.?從一道面試題看指針與數組的區別 <轉>(1)
- 9.?淺談游戲服務器---功能模塊上來看(1)
- 10.?微軟面試中簡單的算法題目(轉)(1)
- 11.?memcached完全剖析系列教程《轉》(1)
- 12.?死鎖和活鎖 deadlock and livelock(0)
- 13.?IT公司筆試算法題(0)
- 14.?effective c++(0)
-
15.?為 C/C++ 項目構建您自己的內存管理器
(0) -
16.?Comparing Two High-Performance I/O Design Patterns
(0) - 17.?boost 庫 enable_shared_from_this 實現原理分析<轉>(0)
-
18.?Which is asymptotically larger: lg(lg* n) or lg*(lg n)$? <
>(0) - 19.?TCMalloc : Thread-Caching Malloc(0)
- 20.?有抗癌效果的神奇食物(0)
- 21.?ubuntu下編譯內核(0)
- 22.?MySQL索引背后的數據結構及算法原理(0)
- 23.?wget進行整站下載<轉>(0)
- 24.?What are the difference between DDL, DML and DCL commands?<轉載>(0)
- 25.?通過證書方式實現ssh的無密碼登陸<轉>(0)
- 26.?50個有關編程的至理名言<轉>(0)
- 27.?How I explained Design Patterns to my wife《reprint》(0)
- 28.?How to explain OOD to my wife-code project《轉載》(0)
- 29.?ifconf.c《轉載》(0)
- 30.?vim configuration(0)
- 31.?<轉>how to start a kernel thread(0)
- 32.?Linux系統性能指標介紹(0)
- 33.?Linux進程的狀態和調度(0)
- 34.?關鍵字的作用 auto static register const volatile extern (0)
- 35.?epoll使用例子(0)
- 36.?Windows Socket五種I/O模型(0)
- 37.?TCP的流量控制 (0)
- 38.?Linux下各類TCP網絡服務器的實現源代碼《轉》(0)
- 39.?fopen 文本文件與二進制文件區別(0)
- 40.?Linux目錄掃描程序(0)