摘要:輕量級進程和內(nèi)核線程是的關(guān)系。線程一個線程的本質(zhì)是一組寄存器的狀態(tài),是操作系統(tǒng)對寄存器狀態(tài)的抽象。
操作系統(tǒng)中的進程和線程 1.進程和線程的學(xué)習(xí)中容易混亂的地方
之所以覺得進程和線程難以理解,大概有這么幾個原因:
進程,線程的概念是不斷發(fā)展的,不同時期的書籍會有不同的闡述,如一開始內(nèi)核不支持線程到后來內(nèi)核開始支持線程
經(jīng)典的書籍如《現(xiàn)代操作系統(tǒng)》多是從原理的角度去說,高屋建瓴,但是難以有切身感受
操作系統(tǒng)對進程和線程的實現(xiàn)也是不同的,架構(gòu)者對進程和線程的理念有所不同,Linux和Windows內(nèi)核對線程的實現(xiàn)不同。
2.進程模型的演變最初,進程的內(nèi)涵分為兩個方面:
調(diào)度,執(zhí)行的基本單位
最初操作系統(tǒng)不支持線程的概念,內(nèi)核中維護著進程的各種信息,如運行狀態(tài),優(yōu)先級,寄存器等,也就是說OS可以根據(jù)這些信息調(diào)度和執(zhí)行進程。
資源所有權(quán)
包括程序,數(shù)據(jù),文件,socket 等資源。
將兩個獨立的功能分離,出現(xiàn)了線程的概念:
作為執(zhí)行與調(diào)度的基本單位——thread
資源所有權(quán): process
這也就是經(jīng)常說的:"process是資源容器,thread是執(zhí)行單位"。這樣帶來的巨大好處是:
線程的創(chuàng)建成本遠遠低于進程,因為線程中包含的數(shù)據(jù)量少于進程,線程只需要執(zhí)行相關(guān)的數(shù)據(jù)即可,如,pc,寄存器,棧,執(zhí)行狀態(tài)
進程中的線程共享地址空間,進程間的通信的代價遠大于線程間的通信。
3.三種線程模型彼時操作系統(tǒng)沒有提供對線程的支持,只是在應(yīng)用層面實現(xiàn)了線程,操作系統(tǒng)并不知道,,內(nèi)核維護著進程表,仍然以進程為單位進行系統(tǒng)調(diào)用。進程自身維護著線程表,維護線程的狀態(tài)。
優(yōu)勢
不用切換到內(nèi)核態(tài),性能極佳,
進程自己可以有定制的調(diào)度算法
在不支持多線程的操作系統(tǒng)實現(xiàn)多線程程序,如DOS
劣勢
對線程的操作,如創(chuàng)建,調(diào)度,都是應(yīng)用程序?qū)崿F(xiàn),導(dǎo)致編程困難
因為操作系統(tǒng)只知進程不知線程,也就只能調(diào)度進程而無法調(diào)度線程,所有只要一個線程所在的進程發(fā)生了阻塞,那操作系統(tǒng)即阻塞該進程,那么該進程的其他線程也就無法被調(diào)度,相當(dāng)于阻塞了。目前使用用戶線程的程序越來越少了。
后來,操作系統(tǒng)內(nèi)核開始支持線程,就出現(xiàn)了內(nèi)核級線程模型。這種線程模型中,內(nèi)核維護著進程表和線程表,也就是說,內(nèi)核可以對線程直接進行調(diào)度,
優(yōu)勢
內(nèi)核的調(diào)度粒度小至線程,就不會出現(xiàn)用戶級進程那種阻塞了進程,進程中所有線程都被迫“阻塞”的情況,內(nèi)核線程被阻塞,不會導(dǎo)致進程被阻塞,進程中的其他線程依然可以繼續(xù)執(zhí)行
劣勢
開銷挺大,從用戶態(tài)到內(nèi)核態(tài)的切換有一定的開銷
支持的線程總量較小,因為內(nèi)核線程占據(jù)內(nèi)核的空間,而內(nèi)核所持有的空間是有限的
一般而言,程序不會直接使用內(nèi)核線程,而是使用內(nèi)核線程的高級接口——輕量級進程。輕量級進程和內(nèi)核線程是1:1的關(guān)系。
有些操作系統(tǒng)支持,如Solaris平臺。比較主流的windows和linux不支持。
4.概括進程和線程的本質(zhì)進程:當(dāng)用戶啟動一個應(yīng)用,系統(tǒng)將程序的源碼和數(shù)據(jù)從磁盤加載到內(nèi)存中,并且開始執(zhí)行他的源碼。一個進程即一個正被執(zhí)行中的程序。與程序不同, 一個進程是一個活躍的實體 ,并且包含了程序作為單個實例在執(zhí)行期間狀態(tài)的快照。
線程:一個線程的本質(zhì)是一組寄存器的狀態(tài),是操作系統(tǒng)對寄存器狀態(tài)的抽象。
5.特殊的Linux線程實現(xiàn)Linux對進程與線程的實現(xiàn)比較特殊,對于Linux內(nèi)核來說,并不存在線程的說法,但是Linux中進程與進程可以是有區(qū)別的。對于linux內(nèi)核來說,只有進程,創(chuàng)建進使用系統(tǒng)調(diào)用clone,可通過設(shè)置該方法的參數(shù)設(shè)置進程是否共享某些數(shù)據(jù),比如:
fork():創(chuàng)建子進程,通過調(diào)用0共享的clone,創(chuàng)建的進程是完全復(fù)制父進程的數(shù)據(jù),二者不共享不可見。
pthread_create:通過調(diào)用最多共享的clone實現(xiàn),就相當(dāng)于一般意義上的線程了。
可以看到Linus對進程與線程的觀點:
Linus的觀點,Re: proc fs and shared pids
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/69444.html
摘要:父進程調(diào)用創(chuàng)建子進程。因而,一個進程的第一個線程會隨著這個進程的啟動而創(chuàng)建,這個線程被稱為該進程的主線程。另一方面,線程不可能獨立于進程存在。終止線程線程可以通過多種方式來終結(jié)同一個進程中的其他線程。 前言 不積跬步,無以至千里;不積小流,無以成江海。在學(xué)習(xí)Java多線程相關(guān)的知識前,我們首先需要去了解一點操作系統(tǒng)的進程、線程以及相關(guān)的基礎(chǔ)概念。 進程 通常,我們把一個程序的執(zhí)行稱為一...
摘要:進程一般由程序數(shù)據(jù)集進程控制塊三部分組成。線程概述線程的出現(xiàn)是為了降低上下文切換的消耗,提高系統(tǒng)的并發(fā)性。線程突破了一個進程只能干一件事的缺陷,使到進程內(nèi)并發(fā)成為可能。進程與線程的關(guān)系進程是計算機中的程序關(guān)于某數(shù)據(jù)集合上的一次運行活動。 進程概述 進程:正在運行的程序,是系統(tǒng)進行資源分配和調(diào)用的獨立單位。 進程就是一個程序在一個數(shù)據(jù)集上的一次動態(tài)執(zhí)行過程。 進程一般由程序、數(shù)據(jù)集、進...
閱讀 1452·2021-11-25 09:43
閱讀 2594·2021-09-24 10:30
閱讀 3669·2021-09-06 15:02
閱讀 3605·2019-08-30 15:55
閱讀 3307·2019-08-30 15:53
閱讀 1702·2019-08-30 15:52
閱讀 2149·2019-08-30 14:21
閱讀 2018·2019-08-30 13:55