操作系統學習筆記_04_線程的概念、操作和應用

1.線程的基本概念

線程概念是進程模型的進一步深化,是現代操作系統爲適應新硬件、新要求而提供的模型。在線程模型中,單個進程包含多個控制線程,這些線程共享代碼、數據、文件等資源,而每個線程有獨立的寄存器和堆棧,並獨立處理任務。工作時,每個線程執行一個任務。他們可以相互調用或調用系統調用,但不能回到任務分配的位置。在多核體系結構下,線程可以利用同一資源併發運行,充分改善資源利用率和計算機工作效率。

單線程進程和多線程進程

多線程是實際需求下的產物,存在如下好處:一,經濟性。現代計算機的應用經常需要執行多個相似任務,如果爲每個任務建立進程,需要耗費不必要的內存空間。多線程可以使全部任務共享同一份資源,節省空間。二,充分利用體系結構。當今的體系結構以多核爲主,多線程通過使不同的核獨立運行不同的線程,可以實現真正的多核並行,而單線程進程只能在單核上運行。三,響應度高。即使某個線程被封鎖,其他線程還可以繼續運行。此特性可應用於交互式應用程序,實現即時響應的效果,即同時接受輸入和計算結果。四,易於通信。多線程方便了任務之間的通信,兩個線程可通過訪問相同的資源進行交互;對應於進程通信,進程之間要共享資源需要設定共享內存或設立通信機制,這些都需要程序員額外部署,沒有線程的資源共享這麼方便。

多線程面臨的挑戰包括如下幾點:一,調度。爲了保證硬件資源的充分合理運用,操作系統要權衡任務執行的先後順序,併合理調度線程的生成與銷燬,對應任務的執行。在執行中,操作系統也需要明確各任務、各線程的狀態(任務是等待執行還是正在執行,線程是正在運行、等待資源還是已經完成任務等)。目前操作系統分爲進程調度和線程調度兩種,前者只調度到進程,具體進程運行哪個線程由線程庫控制;後者直接按線程調度,對進程的控制直接封裝在裏面。二,測試和調試。針對多線程進程的系統調用和原來有所區別,比如fork()分爲兩種形式,複製全部線程或只複製調用fork()的線程;exec*()對應改動爲程序代碼替換所有線程。系統調用針對多線程有所調整,那麼基於系統調用的函數等必須要重新調試。三,數據獨立及同步。線程彼此獨立運行在不同的核上,所以它們使用的數據必須分離開;但考慮到各線程對數據的共享,線程對數據的修改需要及時同步,以防數據衝突。

2.線程的模型

線程模型的支持由用戶層(user space)的用戶線程和內核層(kernel space)的內核線程提供。前者受內核支持而無需內核管理,後者受操作系統支持和管理。在操作系統的實際設計中,用戶線程和內核線程可以採取多對一、一對一和多對多的對應關係。

多對一,即所有用戶線程映射到同一個內核線程。這樣做好處是易於實現、效率高(線程管理由線程庫在用戶空間進行),壞處是單個線程容易阻塞(以下用系統調用block()代稱)整個進程,另外多個線程也不能多核並行。

一對一,即每個用戶線程對應一個內核線程,規避掉了多對一的兩點壞處:線程調用block()只會封鎖自身,不影響其他線程;多線程可以作爲獨立進程而運行在不同的核上,實現高度並行。缺點是內核線程的開銷太大,影響到整個應用的性能(甚至用盡內核存儲),所以一般會限制線程總數。

多對多就是建立多個進程承載多個線程。這樣做規避掉了一對一中線程總數的受限,也保證了高並行度,頗受開發者青睞。

3.線程的具體編程實現

在實際的操作系統中,線程模型與操作是通過線程庫實現的。線程庫中建立了線程的模型,並提供若干操作接口(API).常用的操作有創建(系統調用pcreate根據函數和參數創建線程)、傳參數(通過修改公共區域數據直接傳參),返回值(系統調用pjoin接收線程的結束信號,併爲任務的返回值提供返回地址)。

在實際工作情況下,爲了提升效率、增進安全性等各種目的,還會使用一些實用模型與操作,比如線程隱式實例化,在此不再贅述。

參考文獻:

[1] Abraham Silberschatz. 操作系統概念:Java實現:第7版:翻譯版. 高等教育出版社, 2010.1.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章