




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第第7 7章章 設備驅動中的并發(fā)控制設備驅動中的并發(fā)控制現(xiàn)代操作系統(tǒng)有三大特性:中斷處理、多任務處理和現(xiàn)代操作系統(tǒng)有三大特性:中斷處理、多任務處理和多處理器(多處理器(SMP)。這些特性導致當多個進程、線程或者)。這些特性導致當多個進程、線程或者CPU同時訪問一個資源時,可能導致錯誤,這些錯誤是操作同時訪問一個資源時,可能導致錯誤,這些錯誤是操作系統(tǒng)運行所不允許的。在操作系統(tǒng)中,內核需要提供并發(fā)控系統(tǒng)運行所不允許的。在操作系統(tǒng)中,內核需要提供并發(fā)控制機制,對公用資源進行保護。本章將對保護這些公用資源制機制,對公用資源進行保護。本章將對保護這些公用資源的方法進行簡要的介紹。的方法進行簡要的介紹。
2、7.1 7.1 并發(fā)與競爭并發(fā)與競爭并發(fā)是指在操作系統(tǒng)中,一個時間段中有幾個程序都并發(fā)是指在操作系統(tǒng)中,一個時間段中有幾個程序都處于已啟動運行到運行完畢之間,且這幾個程序都是在同一處于已啟動運行到運行完畢之間,且這幾個程序都是在同一個處理機上運行,但任一個時刻點上只有一個程序在處理機個處理機上運行,但任一個時刻點上只有一個程序在處理機上運行。并發(fā)容易導致競爭的問題。競爭就是兩個或者兩個上運行。并發(fā)容易導致競爭的問題。競爭就是兩個或者兩個以上的進程同時訪問一個資源,從而引起資源的錯誤。以上的進程同時訪問一個資源,從而引起資源的錯誤。7.2 7.2 原子變量操作原子變量操作原子變量操作是原子變量操
3、作是Linux中提供的一種簡單的同步機制。中提供的一種簡單的同步機制。原子變量操作是一種在操作過程中不會被打斷的操作,所以原子變量操作是一種在操作過程中不會被打斷的操作,所以在內核驅動程序中非常有用。本節(jié)對在內核驅動程序中非常有用。本節(jié)對Linux中原子變量的操中原子變量的操作進行詳細的分析。作進行詳細的分析。7.2.1 7.2.1 原子變量操作原子變量操作所謂原子變量操作,就是該操作絕不會在執(zhí)行完畢前所謂原子變量操作,就是該操作絕不會在執(zhí)行完畢前被任何其他任務或事件打斷。也就說,原子變量操作是一種被任何其他任務或事件打斷。也就說,原子變量操作是一種不可以被打斷的操作。原子操作需要硬件的支持,
4、因此是架不可以被打斷的操作。原子操作需要硬件的支持,因此是架構相關的,其構相關的,其API和原子類型的定義都定義在內核源碼樹的和原子類型的定義都定義在內核源碼樹的include/asm/atomic.h文件中,它們都使用匯編語言實現(xiàn),因文件中,它們都使用匯編語言實現(xiàn),因為為C語言并不能實現(xiàn)這樣的操作。語言并不能實現(xiàn)這樣的操作。7.2.2 7.2.2 原子整形操作原子整形操作有時候需要共享的資源可能只是一個簡單的整形數(shù)值。例如有時候需要共享的資源可能只是一個簡單的整形數(shù)值。例如在驅動程序中,需要對包含一個在驅動程序中,需要對包含一個count的計數(shù)器。這個計數(shù)器表示的計數(shù)器。這個計數(shù)器表示有多少
5、個應用程序打開了設備所對應的設備文件。通常在設備驅有多少個應用程序打開了設備所對應的設備文件。通常在設備驅動程序的動程序的open()函數(shù)中,將函數(shù)中,將count變量加變量加1。在。在close()函數(shù)中,將函數(shù)中,將count減減1。如果只有一個應用程序執(zhí)行打開和關閉操作,那么這里。如果只有一個應用程序執(zhí)行打開和關閉操作,那么這里的的count計數(shù)不會出現(xiàn)問題。但是如果有多個應用程序同時打開或計數(shù)不會出現(xiàn)問題。但是如果有多個應用程序同時打開或者關閉設備文件,那么就可能導致者關閉設備文件,那么就可能導致count多加或者少加,出現(xiàn)錯誤多加或者少加,出現(xiàn)錯誤。為了避免這個問題,內核提供了一個原
6、子整形變量,稱為為了避免這個問題,內核提供了一個原子整形變量,稱為atomic_t。7.2.3 7.2.3 原子位操作原子位操作除了原子整數(shù)操作外,還有原子位操作。原子位操作除了原子整數(shù)操作外,還有原子位操作。原子位操作是根據(jù)數(shù)據(jù)的每一位單獨進行操作。根據(jù)體系結構的不同,是根據(jù)數(shù)據(jù)的每一位單獨進行操作。根據(jù)體系結構的不同,原子位操作函數(shù)的實現(xiàn)也不同。原子位操作函數(shù)的實現(xiàn)也不同。7.3 7.3 自旋鎖自旋鎖自旋鎖是一種簡單的并發(fā)控制機制,其是實現(xiàn)信號量自旋鎖是一種簡單的并發(fā)控制機制,其是實現(xiàn)信號量和完成量的基礎。自旋鎖對資源有很好的保護作用,在和完成量的基礎。自旋鎖對資源有很好的保護作用,在Li
7、nux驅動程序中進程使用,本節(jié)將對自旋鎖進行詳細的介驅動程序中進程使用,本節(jié)將對自旋鎖進行詳細的介紹。紹。7.3.1 7.3.1 自旋鎖概述自旋鎖概述在在Linux中提供了一些鎖機制來避免競爭條件,最簡單中提供了一些鎖機制來避免競爭條件,最簡單的一種就是自旋鎖。引入鎖的機制,是因為單獨的原子操作的一種就是自旋鎖。引入鎖的機制,是因為單獨的原子操作不能滿足復雜的內核設計需要。例如,當一個臨界區(qū)域要在不能滿足復雜的內核設計需要。例如,當一個臨界區(qū)域要在多個函數(shù)之間來回運行時,原子操作就顯得無能無力了。多個函數(shù)之間來回運行時,原子操作就顯得無能無力了。Linxu中一般可以認為有兩種鎖,一種是自旋鎖,
8、另一中一般可以認為有兩種鎖,一種是自旋鎖,另一種是信號量。這兩種鎖是為了解決內核中遇到的不同問題開種是信號量。這兩種鎖是為了解決內核中遇到的不同問題開發(fā)的。其實現(xiàn)機制和應用場合有所不同,下文將分別對這兩發(fā)的。其實現(xiàn)機制和應用場合有所不同,下文將分別對這兩種鎖機制進行介紹。種鎖機制進行介紹。7.3.2 7.3.2 自旋鎖的使用自旋鎖的使用在在Linux中,自旋鎖的類型為中,自旋鎖的類型為struct spinlock_t。內核提。內核提供了一系列的函數(shù)來對供了一系列的函數(shù)來對struct spinlock_t進行操作。下面將對進行操作。下面將對自旋鎖的操作方法進行簡要的介紹。自旋鎖的操作方法進行
9、簡要的介紹。1定義和初始化自旋鎖定義和初始化自旋鎖2鎖定自旋鎖鎖定自旋鎖3釋放自旋鎖釋放自旋鎖4使用自旋鎖使用自旋鎖7.3.3 7.3.3 自旋鎖的使用注意事項自旋鎖的使用注意事項在使用自旋鎖時,有幾個注意事項需要讀者理解,這在使用自旋鎖時,有幾個注意事項需要讀者理解,這幾個注意事項是:幾個注意事項是:自旋鎖是一種忙等待。自旋鎖是一種忙等待。自旋鎖不能遞歸使用。自旋鎖不能遞歸使用。7.4 7.4 信號量信號量本節(jié)介紹鎖的另一種實現(xiàn)機制,這種機制就是本節(jié)介紹鎖的另一種實現(xiàn)機制,這種機制就是Linux中中常用的信號量。常用的信號量。Linux中提供了兩種信號量,一種用于內核中提供了兩種信號量,一種
10、用于內核程序中,一種用于應用程序中。由于這里講解的是內核編程程序中,一種用于應用程序中。由于這里講解的是內核編程的知識,所以只對內核中的信號量進行詳細講述。的知識,所以只對內核中的信號量進行詳細講述。7.4.1 7.4.1 信號量概述信號量概述和自旋鎖一樣,信號量也是保護臨界資源的一種有用方和自旋鎖一樣,信號量也是保護臨界資源的一種有用方法。信號量與自旋鎖的使用方法基本一樣。與自旋鎖相比,信法。信號量與自旋鎖的使用方法基本一樣。與自旋鎖相比,信號量只有當?shù)玫叫盘柫康倪M程或者線程才能夠進入臨界區(qū),執(zhí)號量只有當?shù)玫叫盘柫康倪M程或者線程才能夠進入臨界區(qū),執(zhí)行臨界代碼。信號量與自旋鎖的最大不同點在于,
11、當一個進程行臨界代碼。信號量與自旋鎖的最大不同點在于,當一個進程試圖去獲取一個已經鎖定的信號量時,試圖去獲取一個已經鎖定的信號量時,進程不會像自旋鎖一樣進程不會像自旋鎖一樣在遠處忙等待,在信號量中采用了另一種方式,這中方式如下在遠處忙等待,在信號量中采用了另一種方式,這中方式如下所述。所述。7.4.2 7.4.2 信號量的實現(xiàn)信號量的實現(xiàn)根據(jù)不同的平臺,其提供的指令代碼有所不同,所以根據(jù)不同的平臺,其提供的指令代碼有所不同,所以信號量的實現(xiàn)也有所不同。信號量的實現(xiàn)也有所不同。下面詳細介紹一下這個結構體的各個成員變量:下面詳細介紹一下這個結構體的各個成員變量:1lock自旋鎖自旋鎖2count變
12、量變量3等待隊列等待隊列7.4.3 7.4.3 信號量的使用信號量的使用在在Linux中,信號量的類型為中,信號量的類型為struct semaphore。內核提。內核提供了一系列的函數(shù)來對供了一系列的函數(shù)來對struct semaphore進行操作。下面將進行操作。下面將對信號量的操作方法進行簡要的介紹。對信號量的操作方法進行簡要的介紹。1定義和初始化自旋鎖定義和初始化自旋鎖2鎖定信號量鎖定信號量3釋放信號量釋放信號量4使用信號量使用信號量5信號量用于同步操作信號量用于同步操作7.4.4 7.4.4 自旋鎖與信號量的對比自旋鎖與信號量的對比自旋鎖和信號量是解決并發(fā)控制的兩個很重要的方法。在自
13、旋鎖和信號量是解決并發(fā)控制的兩個很重要的方法。在使用時,應該如何選擇它們其中的一種方法呢?這要根據(jù)被包使用時,應該如何選擇它們其中的一種方法呢?這要根據(jù)被包含資源的特定來確定。含資源的特定來確定。自旋鎖是一種最簡單的保護機制,從上面的代碼分析中,自旋鎖是一種最簡單的保護機制,從上面的代碼分析中,可以看出自旋鎖的定義只有一個結構體成員。當被包含的代碼可以看出自旋鎖的定義只有一個結構體成員。當被包含的代碼能夠在很短的時間內執(zhí)行完成時,那么使用自旋鎖是一種很好能夠在很短的時間內執(zhí)行完成時,那么使用自旋鎖是一種很好的選擇。因為自旋鎖只是忙等待,不會進入睡眠。要知道,睡的選擇。因為自旋鎖只是忙等待,不會
14、進入睡眠。要知道,睡眠是一種非常浪費時間的操作。眠是一種非常浪費時間的操作。7.5 7.5 完成量完成量在驅動程序開發(fā)中,一種常見的情況是:一個線程需在驅動程序開發(fā)中,一種常見的情況是:一個線程需要等待另一個線程執(zhí)行完某個操作后,才能夠繼續(xù)執(zhí)行。上要等待另一個線程執(zhí)行完某個操作后,才能夠繼續(xù)執(zhí)行。上面講的信號量其實也能夠完成這種工作,不過其效率不如面講的信號量其實也能夠完成這種工作,不過其效率不如Linux中專門針對這種情況的完成量機制。本節(jié)將對完成量中專門針對這種情況的完成量機制。本節(jié)將對完成量進行詳細的介紹。進行詳細的介紹。7.5.1 7.5.1 完成量概述完成量概述Linux中提供了一種
15、機制來實現(xiàn)一個線程發(fā)送一個信號來通知中提供了一種機制來實現(xiàn)一個線程發(fā)送一個信號來通知另一個線程開始完成某個任務,這種機制就是完成量。完成量的目另一個線程開始完成某個任務,這種機制就是完成量。完成量的目的是告訴一個線程某個事件已經發(fā)生,可以在此事件基礎上做你想的是告訴一個線程某個事件已經發(fā)生,可以在此事件基礎上做你想做的另一個事件了。其實完成量和信號量比較類似,但是在這種線做的另一個事件了。其實完成量和信號量比較類似,但是在這種線程通信的情況下,使用完成量有更高的效率。在內核中,程通信的情況下,使用完成量有更高的效率。在內核中,可以進程可以進程看見使用完成量的代碼。完成量是一種輕量級的機制,這種
16、機制在看見使用完成量的代碼。完成量是一種輕量級的機制,這種機制在一個線程希望告訴另一個線程某個工作已經完成的情況下是非常有一個線程希望告訴另一個線程某個工作已經完成的情況下是非常有用的。用的。7.5.2 7.5.2 完成量的實現(xiàn)完成量的實現(xiàn)完成量是實現(xiàn)兩個任務之間同步的簡單方法,在內核完成量是實現(xiàn)兩個任務之間同步的簡單方法,在內核中完成量由中完成量由struct completion結構體來表示。該結構體定義結構體來表示。該結構體定義在在includelinuxcompletion.h文件中。文件中。下面詳細介紹一下這個結構體的兩個成員變量:下面詳細介紹一下這個結構體的兩個成員變量:1done成員成員2wait成員成員7.5.3 7.5.3 完成量的使用完成量的使用在在Linux中,信號量的類型為中,信號量的類型為struct completion。內核。內核提供了一系列的函數(shù)來對提供了一系列的函數(shù)來對struct completion進行操作。下面進行操作。下面將對完成量的操作方法進行簡要的介紹:將對完成量的操作方法進行簡要的介紹:1定義和初始化完成量定義和初始化完成量2等待完成量等待完成量3釋放完成量釋放完成量4使用完成量使用完成量7.6 7.6 小結小結本章介紹了本章介紹了Li
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- DB31/T 680.3-2017城市公共用水定額及其計算方法第3部分:游泳池
- DB31/T 229-2011礦物油型有機熱載體
- DB31/T 1256-2020消毒產品衛(wèi)生安全評價信息數(shù)據(jù)集
- DB31/T 1193-2019山雞養(yǎng)殖技術規(guī)范
- CAB 1027-2014汽車罩
- 高中三年如何規(guī)劃:從高一到高三的全程指南
- 2024年工藝氣體壓縮機資金籌措計劃書代可行性研究報告
- 海外醫(yī)療記錄租賃與安全保障合同
- 跨境電商物流配送車隊委托國際化經營管理合同
- 新能源汽車電池租賃保險理賠及責任追溯協(xié)議
- 22G101三維彩色立體圖集
- 《計算機網絡實驗教程》全套教學課件
- DL∕T 904-2015 火力發(fā)電廠技術經濟指標計算方法
- DL∕T 552-2015 火力發(fā)電廠空冷凝汽器傳熱元件性能試驗規(guī)程
- 數(shù)字化設計與制造課程教學大綱
- php校友管理系統(tǒng)論文
- TD/T 1040-2013 土地整治項目制圖規(guī)范(正式版)
- 2023北京朝陽區(qū)高二下學期期末英語試題及答案
- 《鐵路路基施工與維護》課件-7 基床以下路堤施工
- 《民航客艙設備操作與管理》課件-項目四 飛機艙門及撤離滑梯
- DL-T 1476-2023 電力安全工器具預防性試驗規(guī)程
評論
0/150
提交評論