linux 設備驅動程序開發 第3版_Chapter2_Cconcurrency in th...

對併發的處理是內核編程和普通應用程序之間的一個很大的不一樣。大多數的應用程序,除了多線程 的應用程序外,基本上都是從頭至尾順序的執行,沒必要擔憂其餘事情的發生致使應用程序的運行環境 發生變化。內核代碼的運行環境不像應用程序那麼簡單,即便是最簡單的內核模塊在編寫時也要考慮 【同一時刻,可能會有許多事情正在發生】。編程

內核編程的併發主要有如下幾個緣由引發,首先,Linux系統是運行在多個進程,同一時刻可能會有不止一個進程在調用你的驅動程序。其次,大部分的設備均可以使處理器中斷;而中斷處理程序是 異步的,它有可能在驅動程序處理其餘任務時被調用。另外,若干種的軟件抽象(例如內核時間)也 是異步運行的。還有,Linux能夠運行在對稱多處理器系統上,這樣你的驅動程序可能會在多個CPU 上併發執行。最後,2.6版本的內核代碼是可搶佔的,這意味着即便是單處理器系統也會像多處理器 那樣會有不少的併發問題。 因此,Linux的內核代碼,包括驅動程序,都必須是可重入的------它必須保證可以同時正確運行在 多個上下文中。爲了正確保證多個線程分開執行,數據結構必須很是當心的設計,並且,訪問共享數 據的代碼必須避免破卡共享數據。要寫出處理併發而且避免競態(【不一樣的執行順序致使不一樣的,非 預期結果的發生】)的代碼是要花一些心思的。在編寫內核代碼時必需要有恰當的併發處理。由於這 個緣由,本書中的全部驅動程序的例子都考慮了併發,這些會在後續章節中進行介紹。第五章還會專 門討論併發的問題以及內核中用於併發處理的原語。數據結構

編寫驅動程序時每每會犯下面的錯誤,認爲只要代碼中的某一段沒有進入睡眠狀態或者阻塞狀態, 那就不會有併發的問題。在2.6版本的內核中,不能保證某一段代碼能獨佔處理器。若是在編寫代碼 時沒有考慮併發,將有可能會致使災難性的後果而且很是難以調試。多線程

相關文章
相關標籤/搜索