windows核心編程第七章–線程調度

來源:互聯網
上載者:User

  在第6章中,我們介紹了每個線程是如何擁有一個上下文結構的,這個結構維護線上程的核心對象中。這個上下文結構反映了線程上次運行時該線程的CPU寄存器的狀態。每隔20毫秒左右,Windows要查看當前存在的所有線程核心對象。在這些對象中,只有某些對象被視為可以調度的對象。Windows選擇可調度的線程核心對象中的一個,將它載入到CPU的寄存器中,它的值是上次儲存線上程的環境中的值。這項操作稱為上下文轉換。Windows實際上儲存了一個記錄,它說明每個線程獲得了多少個運行機會。這時,線程正在執行代碼,並對它的進程的地址空間中的資料進行操作。再過20毫秒左右,Windows就將CPU的寄存器重新儲存到線程的上下文中。線程不再運行。系統再次查看其餘的可調度線程核心對象,選定另一個線程的核心對象,將該線程的上下文載入到CPU的寄存器中,然後繼續運行。當系統引導時,便開始載入線程的上下文,讓線程運行,儲存上下文和重複這些操作,直到系統關閉。這就是系統對線程進行調度的過程。請記住,你無法保證你的線程總是能夠運行,也不能保證你的線程能夠得到整個進程,並且無法保證其他線程不允許運行,等等。

  暫停和恢複線程的運行 

線上程核心對象的內部有一個值,用於指明線程的暫停計數。當你調用CreateProcess或CreateThread函數時,就建立了線程的核心對象,並且它的暫停計數被初始化為1。這可以防止線程被調度到CPU中。當然,這是必須的,因為線程的初始化需要時間,你不希望在系統做好充分的準備之前就開始執行線程。當線程完全初始化好了之後,CreateProcess或CreateThread要查看你是否已經傳遞CREATE_SUSPENDED標誌。如果你已經傳遞了這個標誌,那麼這些函數就返回,同時新線程處於暫停狀態。如果你尚未傳遞該標誌,那麼該函數將線程的暫停計數遞減為0。當線程的暫停計數是0的時候,除非線程正在等待其他某種事情的發生,否則該線程就處於可調度狀態。

 對於Windows來說,不存在暫停或恢複進程的概念,因為進程從來不會被安排獲得CPU時間。但是, Windows確實允許一個進程暫停另一個進程中的所有線程的運行,但是從事暫停操作的進程必須是個偵錯工具。特別是,進程必須調用WaitForDebugEvent和ContinueDebugEvent之類的函數。

  調用Sleep,可使線程自願放棄它剩餘的時間片。

  系統提供了一個稱為SwitchToThread的函數,它使得另一個可調度線程能夠運行。

  系統只能為基本優先順序等級在1至15之間的線程提高其優先順序等級。實際上這是因為這個範圍稱為動態優先順序範圍。此外,系統決不會將線程的優先順序等級提高到即時範圍(高於15)。由於即時範圍中的線程能夠執行大多數作業系統的函數,因此給等級的提高規定一個範圍,就可以防止應用程式幹擾作業系統的運行。另外,系統決不會動態提高即時範圍內的線程優先順序等級。

 

相關文章

聯繫我們

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