【操作系統】第七章:進程管理(Part3:線程管理)

線程(Thread)

OS中進程一直被作爲獨立運行的基本單位來被OS調度。80年代後,線程引入。線程是更小的能夠獨立運行的基本單位。

爲什麼要有線程?

在這裏插入圖片描述
實現上述三步的程序:
在這裏插入圖片描述
如果CPU能力不夠強,則有可能斷斷續續。因爲當Read()執行時,進程可能會持續等待,因爲讀取硬盤的速度遠遠慢於CPU和內存的速度,等一段時間後纔可能解壓和播放,則整體上Read會阻塞來整個進程的執行過程。各個進程之間不能並行執行,所以效率會比較差。
那麼如果用多進程的方式:
在這裏插入圖片描述
三步分別寫進程,當我們Read時,我們可以把這個進程放給其他進程去執行,整個過程類似於流水線處理。這種方式看起來可行,但是開銷大,而且中間存在數據通信問題。
爲了解決這個問題,我們需要滿足如下特徵的實體。實體之間可以併發執行(進程也可以),實體之間共享相同地址空間和相同資源(進程不可以)。這種實體就是線程。

線程的定義

在這裏插入圖片描述
定義:線程就是進程中的一條執行流程。這裏我們要重新接受一下進程。
從資源管理的角度:進程需要管理一系列資源,包含地址空間、打開的文件、訪問的網絡;而把進程的另一部分功能,它的執行功能和執行狀態交給線程管理。從運行角度來看,代碼被認爲線程,線程是進程的重要組成部分。進程除了資源管理,還需要一系列線程來完成執行過程。
所以進程分爲兩部分,一部分是資源管理,一部分是線程。一個進程裏可以存在多個線程,線程共享同一進程所擁有的資源。可以直接訪問進程提供的代碼、數據、內存、文件等。所以線程之間的資源共享就很容易實現了。

線程控制塊TCB

負責管理和執行流程相關的一系列信息,包含執行的程序計數器PC,堆棧SP,寄存器的信息等,有不同的執行流和控制流。控制流需要通過一系列寄存器來表示控制流的執行狀態,這是每個線程自己獨立的一部分信息。但是它的內存空間(堆、代碼、數據)是所有線程共享的。

在這裏插入圖片描述
線程=進程-控制資源。進程完成的是控制流的管理,進程裏存在多個線程,線程之間可以併發執行且可以共享地址空間和資源,使線程間數據傳輸、交換更加便捷。
缺點:如果一個線程出錯,就有可能破壞其他線程所共享的進程的資源。所以安全可靠性沒有保障,一個線程崩潰其他線程全部崩潰,整個進程死亡。
所以這裏出現了實用性問題,什麼時候用線程,什麼時候用進程。
強調性能時,用線程執行。比如,瀏覽器,現在的瀏覽器可以同時打開多個網頁標籤,可以線程實現,打開的很快,但是如果某一個網頁寫的不好或者惡意代碼,可能會引起整個瀏覽器的崩潰。Chrome採取進程機制實現,也就意味着某個網頁崩潰不會導致其他網頁的瀏覽,因爲現在 的計算機性能不是瓶頸,安全性纔是真正的考慮的要素。
不同OS對線程的支持也是不同的,現在的主流OS基本都支持多進程,以及一個進程裏的多線程。相對而言,現在的OS支持的靈活性更大。

進程需要的資源

在這裏插入圖片描述
對於單線程而言,它在進程空間裏只有一個控制流;對於多線程支持,在寄存空間內會出現多個控制流而且每個控制流的流程是不一樣的,而且需要各自獨立的寄存器和堆棧,但是能夠共享資源代碼、數據、文件資源、網絡資源。所有的獨佔資源都與線程的控制執行相關,所以說需要把這部分信息單獨保護起來,避免了線程之間的破壞。如果兩個線程共享一個寄存器,那麼執行流程中不可能實現分別實現不同的流程。

線程和進程的比較

在這裏插入圖片描述
線程不需要考慮資源釋放,所以結束時間短。
進程創建時需要創建其他一些管理信息,比如內存和文件的管理。線程的創建直接從進程所屬的資源來使用。
切換時,同一進程內的線程擁有同一個地址空間,擁有同一個頁表,不需要切換內存管理中的頁表,節省開銷。線程切換時共享同一頁表,所有信息可以重用,不需要缺失處理,效率高。
因爲線程共享進程的資源,線程間數據傳遞時,就不需要通過內核,直接通過內存地址就可以訪問。使得線程間數據交換效率很高。
所以線程執行過程中,其空間效率和時間效率確實比進程高。

線程的實現

在這裏插入圖片描述
用戶線程:OS看不到的線程。內核線程:OS管理起來,能夠看到的線程。
用戶線程由應用程序的庫來進行專門的線程管理。
用戶線程和內核線程之間的對應的映射關係:
在這裏插入圖片描述

用戶線程的實現

在這裏插入圖片描述

在這裏插入圖片描述
用戶態的庫完成了整個線程控制的管理,TCB在庫裏面實現,對於OS而言,它看不到TCB。整個進程的信息OS可以看到,但是看不到線程。所以整個線程的調度和管理由庫完成,不依賴於OS的內核,是由用戶級的線程庫函數來完成線程的管理。包含線程的創建、終止、同步。
由於OS只能看到線程所屬的進程,如果進程被OS設置爲等待狀態,進程所包含的線程就都不能執行了。每個進程需要自己的TCB表來保存、切換各個線程的狀態信息。
每一個線程都可以有自己自定義的線程調用算法,而線程的管理OS都感知不到。
缺點:
1.如果進程執行了一個阻塞型的系統調用,比如讀文件,有可能耗時長而掛起進程,如果進程是用戶線程級的,那麼即使其他用戶線程沒有發出系統調用,整個進程也都會等待。因爲OS感知不到線程,他會把進程阻塞,然後屬於進程的線程也就會跟着被停下。
2.當一個用戶線程開始運行,除非主動交出CPU使用權,他所在進程的其他線程都無法執行。因爲用戶態的線程庫沒法主動打斷當前用戶線程的執行。
3.分配單位是進程中的線程,多進程執行時,每個線程相對來說分的時間片較小,執行會比較慢。

內核線程

在這裏插入圖片描述
OS可以看見,也就說TCB是放在內核裏的,典型的WIN系統設計。有了這個設計,OS的調度單位就是線程而不是進程。所以的線程創建終止管理都由OS管理,進程完成資源管理。進程的PCB會管理到所有屬於這個進程的TCB的LIST,所有屬於這個進程的線程都被PCB管理,粒度小。只要完成一次線程的切換,就要有一次從用戶態到內核態的變化,這個開銷相對於用戶態線程而言就比較大。

輕量級進程LightWeight Process

在這裏插入圖片描述

輕量級進程:
內核支持的用戶線程,一個進程可以有一個或者多個輕量級進程,每個量級進程由一個單獨的內核線程支持。如圖所示,多個輕量級進程對應一個內核級線程,相對而言管理起來更加複雜,但是靈活性好。

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