《現代操做系統》讀書筆記——線程

線程是最小的任務調度單位,是依賴於進程而存在的迷你進程。和進程同樣,線程也有三種狀態——運行、就緒、阻塞。我認爲,線程是進程中任務真正的執行者,而進程提供了內存空間、CPU、程序計數器以及寄存器讓線程使用。算法

爲何要存在

對於進程來講,多個進程之間沒法分享內存空間,對於一些應用而言,共享內存空間的能力是必須的,而同一個進程下的多個進程,是共享進程的內存空間的。同時,因爲這一特性,線程的建立相較於進程,要快得多。緩存

還有一點,可能也是不少人誤解的,那就是線程能夠加快程序的運行速度。這是一種錯誤的觀點。多線程並不能加快程序執行的速度,而是能充分利用 CPU,從而給咱們形成了程序速度變快的假象。例如,在 I/O 處理時,線程阻塞另外一個線程開始,而不須要等待 I/O 完成。多線程

這裏,咱們應該知道,在單 CPU 的狀況下,某一時刻只能有一個進程運行,只能有一個線程運行。併發

用戶態與內核態

線程有兩種,一個是內核態線程,一個是用戶態線程。性能

當在一個進程中建立一個內核態線程時,這個線程便陷入了內核中,同時佔據 CPU、寄存器和程序計數器,而且和進程同樣,將線程表存在內核中。內核對這個線程是有感知的,而且內核直接參與線程的調度。操作系統

而用戶態線程的狀態是存儲在進程中的。進程中有一個專門的運行時系統,用於調度用戶線程。因此,每一個進程能夠本身實現本身的調度算法,從而能夠增長程序的靈活度。例如,在一個線程要作可能會形成阻塞的事情時,會通知運行時系統,由運行時系統來經過進程中的線程表的線程的狀態,來決定調度線程。線程

可是,因爲內核不直接參與調度用戶線程,那麼就有一個問題,進程調度線程須要線程主動讓出,這樣用戶線程的權利是很是大的。若是一個線程作了形成本地阻塞的事情而不通知進程,那麼就會使整個進程一直處於阻塞狀態,即便進程中其它線程是就緒狀態。協程

這裏插一句,好像上面的事情和如今說的比較多的協程很類似。沒錯,我認爲,協程就是用戶態線程,它有至關高的主動權,來經過進程的堆棧來調度,能夠有效解決併發的問題。進程

混合實現

能夠看到,內核線程和用戶線程都有各自的優勢和缺點。內存

內核線程由內核直接調度,在多處理機系統中能夠實現同時運行。並且因爲是內核調度,線程沒有主動權,能夠避免線程佔據 CPU 過久而致使其餘線程沒法運行。可是因爲內核線程是內核直接調度的,在調度時會陷入內核,這個代價是很是大的。

用戶線程由進程中的運行時系統來調度,全部的線程的數據都保存在進程棧中,而不須要陷入內核,不須要上下文切換,也不須要對緩存進行刷新,因此這樣的調度時很是快的。同時用戶線程由進程實現調度算法,有很強的擴展性。可是因爲用戶線程的主動權很是大,可能會致使線程阻塞但其它就緒的線程沒有機會運行。並且因爲線程的數據均保存在進程的內存中,若是線程不少,可能會佔用至關多的內存,從而發生一些問題。

既然內核線程和用戶線程由各自的優勢,那麼能夠將它們的有點集合起來。例如,可使用內核線程,而且內核線程和用戶線程多路複用,經過內核線程來控制和使用用戶線程。

調度程序激活機制

調度程序激活的目標是模擬內核線程的功能,可是爲線程提供在用戶空間中才能實現的更好的性能以及更強大的靈活性。

進程的運行時系統,將線程分配在處理器上。當內核瞭解到一個線程阻塞時,它啓動運行時系統,以此當作通知,讓運行時系統決定如何調度本身的擁有的線程。

在某個用戶線程運行的過程當中,發生了一個硬件中斷,此時 CPU 進入內核態。若是進程中的線程須要這個中斷,進程對中斷感興趣,那麼進程將被中斷的線程掛起並保存在堆棧中,而後選擇線程進行調度。若是不感興趣,則恢復被中斷的線程。

本文是做者閱讀《現代操做系統》的一些總結與理解,僅此記錄下來已被往後翻閱。同時,也分享給各位但願瞭解這些知識的同道者們。因爲做者水平有限,若有錯誤之處,望不吝賜教,謹表感謝。

相關文章
相關標籤/搜索