操做系統 - 線程

以前已經討論過進程了,如今討論線程。我在想如何用現實中的具體事物來比較進程和線程的關係。面試

舉個我認爲較恰當的例子。把進程比做一個工廠中的車間,車間中有若干個生產線,可是每條生產線都須要不一樣的零件,原料和員工。零件,原料和員工,是全部生產線均可以共同使用的資源。這裏就把生產線當作線程吧。這樣,每條生產線就只用管本身的生產過程。編程

就如討論進程同樣,這裏仍是列舉一下線程所包含的實體。數據結構

Program counter多線程

Register併發

Statck學習

State操作系統

不難發現,線程關心的只是下一刻CPU執行所需的必要實體,只須要知道PC等寄存器的信息,當前棧指針,不用關心我有沒有子進程啊,個人地址空間在哪裏,我打開了什麼文件等等的信息。由於這些信息CPU已經知道了。線程

爲何要使用線程

在《現代操做系統》中已經說明了使用線程的種種優點,很容易就能看明白。其實根據上文,也能猜到答案。這裏就不用說明了。翻譯

線程實現的方式

線程能夠在內核中實現,也能夠在用戶空間實現。我本身的理解是這樣的:在內核中實現就是操做系統提供線程支持;在用戶空間中實現就是用戶本身實現。原本覺得JVM的線程就是在用戶空間上實現的,可是搜了一下,貌似Linux平臺下是調用Pthred庫實現的。這裏仍是深刻學習一下這兩種線程的實現方式,爲之後的工做和學習打下基礎,說不定何時就用上了。看了幾遍《現代操做系統》中的相關章節,但是本身仍是雲裏霧裏的,不是很清楚,這一次就好好的搞明白(不必定搞的明白,目前尚未接觸過用戶空間實現的線程,也許是我孤陋寡聞)。指針

用戶空間實現線程

在這種狀況下,內核不知道線程的存在。當一個進程中的線程執行完畢,不須要進行系統調用(Trap),不須要進行上下文交換,因此線程的切換很是快。

可是在發生I/O中斷的時候,必需要內核去處理了。那麼問題來了,內核會鎖住當前線程所在的進程,由於內核不知道線程的存在,只知道進程。解決這個辦法有點麻煩。《現代操做系統》中提出了一個解法,在某些UNIX版本中有一個select系統調用,它能夠判斷I/O操做是否會阻塞。若是阻塞就不執行I/O操做。這樣run-time system(用的英文版教材,不少術語不會翻譯或者亂翻譯,囧)就知道是執行I/O,仍是執行該進程的其它進程。

內核實現線程

內核實現線程和進程區別不大。可是在線程被銷燬時,內核並不會銷燬線程的數據結構,只是會標記該線程是不可執行的。這樣,當新線程被建立時,覆蓋不可執行的線程的數據,效率大大的提升了。

還有一個問題,當一個多線程的進程執行fork時,子進程是否須要複製父進程的全部線程仍是個別線程,如何操做。這個,由於不多接觸Linux下的C編程,因此暫時放在這裏吧。

進程和線程的區別

面試的時候,這個問題多是問的最多的,能夠考察概括能力和是否理解進程和線程。這裏給出本身的理解。

首先,進程是操做系統資源分配和調度的基本單元,它包含了程序可以執行的必要資源。而線程也叫作輕權進程,只擁有CPU執行所需的必要資源。沒有進程,線程沒法單獨執行。

其次,進程的執行通常是線程的,一條道走到黑。線程只是進程執行的不一樣路徑,併發的執行。

就寫這麼多吧。

歡迎你們一塊兒交流和學習啊。

-end-

相關文章
相關標籤/搜索