操作系統之線程的基礎知識

    在傳統操作系統中,每個進程有一個地址空間和一個控制線程。不過,經常存在在同一個地址空間運行多個控制線程的情形,線程就像是分離想進程,不過他們共享着地址空間。

爲什麼需要線程?

    人們需要多線程的主要原因是,在許多應用中同時發生着多種活動。其中某些活動隨着時間的推移會被阻塞。通過將這些應用程序分解成多個準並行運行的順序線程,程序設計模型會變得更簡單。需要線程的理由如下:
1)有了多線程的概念,我們才加入了一種新的元素:並行實體共享一個地址空間和所有可用數據。這是多進程模型無法表達的(他們具有不同的地址空間)、
2)線程比進程更加輕量級,創建線程比創建進程通常快10-100倍。
3)如果存在大量IO操作,多線程允許這些活動彼此重疊進行,從而加快應用程序的執行速度。
4)在多CPU系統中,多線程使得真正的並行有了實現的可能。

經典線程模型

    進程基於兩種獨立的概念:資源分組與執行。將這兩個概念分開,即引入了線程這一概念。
    理解進程的一個角度是,用某種方法把相關的資源集中在一起。進程有存放程序正文和數據以及其他資源的地址空間。把他們都放到進程中更容易管理。
    另一個概念是,進程擁有一個執行的線程,通常簡寫爲線程(thread)。線程中有一個程序計數器記錄接着要執行哪個指令,一個堆棧記錄執行歷史,其中每一幀保存了一個已調用但還沒返回的方法。進程用於把資源集中到一起,線程則是在CPU上被調度執行的實體。
    由於各個線程都可以訪問進程地址空間中的沒一個內存地址,所以一個線程可以讀也可以寫或者清除另一個線程的堆棧。線程直接是沒有保護的,原因是1)不可能,2)沒必要。
    線程概念試圖實現的是,共享一組資源的多個線程的執行能力,以便這些線程可以爲完成某一任務而共同工作。
    線程也有若干種狀態:運行,就緒,阻塞或終止。

線程的實現

    有兩種主要的方式實現線程:在用戶空間中和在內核中。
    1)在用戶空間中實現線程,內核對線程一無所知。從內核的角度看,仍然是單線程進程。在用戶空間管理線程時,每個進程需要專用線程表。它的明顯的問題是,如何實現阻塞系統調用。另一個問題是,一個線程運行,另一個就不能運行,除非主動放棄。
    2)在內核中實現線程,內核中有記錄所有線程的線程表。
    3)混合實現,編程人員可以決定有多少個內核線程和多少個用戶級線程彼此多路複用。
發佈了222 篇原創文章 · 獲贊 4 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章