核心處理資源競爭的方法

來源:互聯網
上載者:User

什麼Linux 核心裡面很多代碼為了處理race condition(競爭條件),都加上了諸如cli sti這樣的開關中斷指令,這個問題貌似很不值得一提。在wait_on_buffer函數(如下代碼所示)中,開關中斷僅僅就是為了避免競爭條件和中斷對臨界代碼的幹擾?

static _inline void wait_on_buffer(struct buffer_head * bh){cli();// 關中斷。while (bh->b_lock)// 如果已被上鎖,則進程進入睡眠,等待其解鎖。sleep_on(&bh->b_wait);sti();// 開中斷。}

先還是來看看趙博的解釋吧:

當進入可能引起競爭條件的代碼區時,核心中就會用cli指令來關閉對外部中斷的響應,而在執行完競爭代碼區時核心就會執行sti指令已重新允許CPU響應外部中斷。

在繼續探討之前,我覺得有必要在兩個問題上達成共識,呵呵,比較嚴肅的說法。

1、在wait_on_buffer (包括其它同樣有開關中斷指令的程式碼) 它們都屬於核心代碼,也就是說當前這個進程是在核心態啟動並執行。

2、核心態的進程不能搶佔。

關於第一點,其實是很明白的。其它不說,就舉兩個例證:其一,我們執行sti這種特權指令,這個只能是核心態進程執行,不是一般使用者權限就能執行的!要是隨隨便便是個進程都執行,可能系統很早就癱了;其二,那就是我們讀的代碼都是核心代碼,所以這個就是核心代碼,有點強詞奪理......

關於第二點,我想表達的意思是如果我們正在執行wait_on_buffer時,即使是沒有關中斷,我們也不會跳到其它進程,當然也不會有其他進程恰好修改了這個buffer中的屬性。因為核心是非搶佔的!比如這裡的do_timer:

 if (!cpl)return;// 對於超級使用者程式,不依賴counter 值進行調度。schedule ();

大家可以看到如果是核心代碼執行do_timer的話,他直接會返回,而不會執行任務切換!

所以我們可以總結下,進程執行wait_on_buffer時,是處於核心態,即使是沒有關閉中斷,不會調度到其它進程執行。唯一能干擾這種沒有關閉中斷的"裸等"只是一些其他的中斷。但是就是為了防止這些其它的中斷可能會改變臨界區的一些關鍵變數,我們還是要關掉中斷以防萬一。

有同志不解,因為他沒有在其他中斷中發現可能會修改buffer從而導致臨界區異常的代碼,所以覺得Linux這樣寫不太妥。還是用趙博的一句話解釋吧:

在這方面不能就事論事。如果有一個中斷會修改呢?核心編程者總不能老是牽掛這方面的問題。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.