Linux wait_on_buffer函數研究__Oracle

來源:互聯網
上載者:User

      Linux0.11核心中的wait_on_buffer和wait_on_inode函數是非常有代表性的延遲性函數處理過程,網上關於這兩個函數的討論

也很多,最主要的一個問題是為什麼要在判斷b_lock之前關中斷,這個問題也困擾了我很長時間,查了不少文章,學到不少東西,但總是

覺得有些細節沒有弄清楚,因此藉著自己實踐開發一個小OS的過程,研究了一下wait_on_buffer,還是學到不少東西的。貼出來,分享

給大家,歡迎討論~

 

Linux0.11版函數定義:

static inline void wait_on_buffer(struct buffer_head * bh)
{
    cli();
    while (bh->b_lock)
        sleep_on(&bh->b_wait);
    sti();
}

 

分析如下:

1.       首先可以明確,wait_on_buffer是工作在核心態的函數。更進一步應當理解為兩種可能性:

          或者是當前某個使用者態的進程請求資料進而引發的,那麼可以認為是當前進程進入了核心態;又或者是核心本身的某個任務

          引發的操作。不管怎樣wait_on_buffer背後是代表這某個進程或者任務的。

 

2.       wait_on_buffer中通過cli和sti起到一個保護臨界區的作用,為什麼這麼說。

          原因首先還在於wait_on_buffer是工作在核心態的環境下,此時cli就意味著關閉了所有的可屏蔽中斷,如時鐘中斷和硬碟

   處理中斷等等,這也就意味著:

   1)當前工作在使用者態的進程不會因為時間片到了有可能被輪轉出去,切換成其他的進程,從而保證while(bh->b_lock)形成的

        若干條指令中間不會被打斷,造成可能有別的進程修改了bh->b_lock的值,造成錯誤;

   2)不會造成硬碟中斷的到來引發的其他進程對bh->b_lock的操作,進而造成錯誤。

        因此,通過關閉中斷,可以達到while (bh->b_lock)語句在執行期間被他人修改,從而實現臨界區的效果。

        關於這一點,第3版的《Understanding the Linux Kernel》在第五章(核心同步)裡明確也提到,確保一組核心語句被當作

   一個臨界區處理的主要機制之一就是中斷禁止,可惜本人在上學時學的OS教材是理論性較強的那種,只關注了各種各樣的臨界操

  作模型,沒有提到實現機制,導致很長時間都覺得臨界區的概念很虛,不好掌握。

 

3.      還有一個重要的問題就是如果關閉了中斷,那別的使用者進程怎麼辦。是不是整個系統在這段時間內都不能收到相關的中斷訊號

   了。這個問題也有很多人問,答案當然是不會影響其他的使用者進程,原因在於sleep_on在將當前進程掛起後,會執行一次進程調

   度操作,即schedule(),而一旦選擇了新進程進行切換時,會將新進程的EFLAGS寄存器內容也載入到相應的寄存器的,而這裡當

   然包含了IF(Interrupt Flag)位,也就是說如果此時切換過來的進程是使用自己原先的中斷開關狀態的,原來的開就開,原來的關

   就關,和之前的進程無關。因此,wait_on_buffer裡對中斷的操作,隻影響當時的進程,故這個中斷也被稱為“本地中斷”,這

   個稱呼更能反映其實質吧。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.