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