進(jìn)程
進(jìn)程:進(jìn)程是具有獨(dú)立功能的程序在某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),也是操作系統(tǒng)進(jìn)行資源分配和保護(hù)的基本單位嗤朴。
如果你熟悉面向?qū)ο缶幊膛渫郑⑹熘惻c對(duì)象的概念。不妨這樣理解進(jìn)程和程序兩者之間的關(guān)系:進(jìn)程是程序的實(shí)例對(duì)象雹姊,程序是進(jìn)程的類描述股缸。
或者你也可以這樣理解進(jìn)程與程序:程序是建筑圖紙,進(jìn)程是房子施工建筑的過程吱雏。程序?yàn)檫M(jìn)程的執(zhí)行提供了規(guī)劃模板敦姻,而進(jìn)程則是程序的一次動(dòng)態(tài)執(zhí)行過程。
進(jìn)程的屬性
- 動(dòng)態(tài)性:進(jìn)程是程序在數(shù)據(jù)集合上動(dòng)態(tài)執(zhí)行的過程歧杏,基于不同的數(shù)據(jù)集合镰惦,程序可以同時(shí)創(chuàng)建多個(gè)進(jìn)程。其次進(jìn)程是具有生命周期的犬绒。而程序是靜態(tài)的旺入,是一種存儲(chǔ)在磁盤中的資源文件。在日常工作中懂更,很多時(shí)候都把程序和進(jìn)程混為一談眨业,不加以區(qū)別,比如說:這個(gè)程序開始跑了——嚴(yán)格來說是進(jìn)程在執(zhí)行沮协。
不過一般情況下龄捡,也不需要對(duì)程序和進(jìn)程這兩個(gè)概念加以嚴(yán)格得區(qū)分。
- 獨(dú)立性:每個(gè)進(jìn)程都是操作系統(tǒng)中的一個(gè)獨(dú)立實(shí)體慷暂,有自己的虛存空間聘殖,程序計(jì)數(shù)器和內(nèi)部狀態(tài)。
- 制約性:進(jìn)程因共享資源或協(xié)同工作產(chǎn)生相互制約關(guān)系行瑞,造成進(jìn)程執(zhí)行速度的不可預(yù)測(cè)性奸腺。
- 并發(fā)性:多個(gè)進(jìn)程的執(zhí)行在時(shí)間段上是可以重疊的。比如將廚師當(dāng)成CPU血久,那么假設(shè)煲湯為線程A突照、煮飯為線程B和炒菜為線程C。在廚師做菜的過程中氧吐,煲湯讹蘑、煮飯和炒菜這三個(gè)任務(wù)是可以同時(shí)去做的末盔。線程也是一樣,在某個(gè)CPU執(zhí)行時(shí)間段內(nèi)座慰,CPU并不會(huì)等待一個(gè)線程執(zhí)行完再去執(zhí)行下一個(gè)線程陨舱,而是不斷的調(diào)度執(zhí)行多個(gè)線程。
進(jìn)程的狀態(tài)
三態(tài)模型
- 運(yùn)行態(tài):進(jìn)程占有CPU正在處理的狀態(tài)版仔。
- 就緒態(tài):進(jìn)程具備運(yùn)行條件游盲,等待系統(tǒng)分配CPU以便運(yùn)行的狀態(tài)。
- 等待態(tài):進(jìn)程需要等待某個(gè)事件完成蛮粮,不具備運(yùn)行的狀態(tài)益缎。
七態(tài)模型
- 新建態(tài):進(jìn)程被創(chuàng)建時(shí)的狀態(tài),尚未進(jìn)入就緒隊(duì)列蝉揍。
- 就緒態(tài):同三態(tài)模型链峭。
- 掛起就緒態(tài):當(dāng)系統(tǒng)內(nèi)存等資源不足時(shí)畦娄,就會(huì)將就緒態(tài)的進(jìn)程從內(nèi)存中剝離又沾,對(duì)換到磁盤交換區(qū)中的狀態(tài)。
- 掛起等待態(tài):當(dāng)系統(tǒng)內(nèi)存等資源不足時(shí)熙卡,就會(huì)將等待態(tài)的進(jìn)程從內(nèi)存中剝離杖刷,對(duì)換到磁盤交換區(qū)中的狀態(tài)。
- 運(yùn)行態(tài):同三態(tài)模型驳癌。
- 等待態(tài):同三態(tài)模型滑燃。
- 終止態(tài):進(jìn)程完成任務(wù)結(jié)束,或是出現(xiàn)錯(cuò)誤而異常終止颓鲜,或被操作系統(tǒng)終止表窘。最終,系統(tǒng)會(huì)將終止態(tài)的進(jìn)程銷毀掉甜滨。
進(jìn)程的組成
- 進(jìn)程控制塊:即PCB乐严,每個(gè)進(jìn)程有且僅有一個(gè)PCB,并與之一一對(duì)應(yīng)的衣摩,用來存儲(chǔ)進(jìn)程的標(biāo)志信息昂验、現(xiàn)場信息和控制信息。
- 進(jìn)程程序塊:被進(jìn)程執(zhí)行的程序艾扮,規(guī)定進(jìn)程一次運(yùn)行所應(yīng)完成的功能既琴。
- 進(jìn)程核心棧:每個(gè)進(jìn)程捆綁一個(gè),并與之一一對(duì)應(yīng)泡嘴。進(jìn)程在內(nèi)核狀態(tài)工作時(shí)使用甫恩,用來保存中斷/異常現(xiàn)場酌予,保存函數(shù)調(diào)用的參數(shù)磺箕、局部變量和返回地址纹腌。
- 進(jìn)程數(shù)據(jù)塊:時(shí)進(jìn)程的私有地址空間,存放各種私有數(shù)據(jù)滞磺,用戶棧也在數(shù)據(jù)塊中開辟升薯,用于在函數(shù)調(diào)用時(shí)存放棧幀、局部變量和返回地址等參數(shù)击困。
線程
線程是進(jìn)程中能夠并發(fā)執(zhí)行的實(shí)體涎劈,是進(jìn)程的組成部分,也是處理器調(diào)度和分派的基本單位阅茶。
如果進(jìn)程是做菜這樣簡單的任務(wù)蛛枚,可能還不需要引入線程。當(dāng)進(jìn)程是蓋房子這樣的任務(wù)時(shí)脸哀,就需要引入線程來提高系統(tǒng)資源的利用率和效率了蹦浦。當(dāng)建筑公司要修建多做房子時(shí)(一個(gè)CPU要執(zhí)行多個(gè)進(jìn)程),多個(gè)房子可以按照建筑的不同時(shí)期撞蜂,建筑公司可以同時(shí)進(jìn)行建筑盲镶。但由于線程的限制,建筑公司只能是蝌诡,要么把所有的建筑資源建筑這套房子溉贿,要么把所有的建筑資源建筑那套房子。這樣浦旱,在進(jìn)程任務(wù)復(fù)雜之后宇色,建筑公司調(diào)整安排建筑任務(wù)的資源浪費(fèi)是十分巨大的(CPU在進(jìn)行進(jìn)程任務(wù)調(diào)度時(shí)的資源浪費(fèi))。所以為了減少這樣的浪費(fèi)颁湖,將進(jìn)程的程序任務(wù)再進(jìn)行分割小的宣蠕,可并發(fā)的線程程序任務(wù)。這樣甥捺,建筑公司就能夠盡量完成某個(gè)建筑任務(wù)抢蚀,再去完成其它的(減少CPU在進(jìn)程之間的調(diào)度,轉(zhuǎn)為對(duì)進(jìn)程里多線程的調(diào)度)涎永。
線程的優(yōu)點(diǎn)
- 快速線程切換:同一進(jìn)程中的多線程切換只需改變堆棧和寄存器思币,地址空間不變。
- 通訊易于實(shí)現(xiàn):自動(dòng)共享進(jìn)程的內(nèi)存和文件羡微,線程可以自由訪問全局?jǐn)?shù)據(jù)谷饿,實(shí)現(xiàn)數(shù)據(jù)共享十分方便,線程通信相對(duì)簡單不必經(jīng)過內(nèi)核妈倔。
- 減少管理開銷:線程插件和撤銷工作比進(jìn)程少很多博投,并且無須再分配存儲(chǔ)空間和各種資源。
- 并發(fā)程度提高:多線程適宜并發(fā)工作盯蝴,能充分發(fā)揮處理器與設(shè)備的并行工作能力毅哗,是多核和多處理器系統(tǒng)的效能發(fā)揮更好听怕。
線程的狀態(tài)
在同一進(jìn)程中的不同線程會(huì)競爭CPU和數(shù)據(jù)資源,而出現(xiàn)各種等待事件虑绵,繼而存在各種狀態(tài)尿瞭。同線程一樣,有運(yùn)行翅睛、就緒声搁、等待和終止?fàn)顟B(tài)。對(duì)于線程來說捕发,它并不是資源擁有單位疏旨,其資源來自進(jìn)程的共享。故而掛起狀態(tài)對(duì)線程來說是沒有意義的扎酷。
參考文獻(xiàn)
[1] 費(fèi)翔林檐涝,駱斌.操作系統(tǒng)教程[M].高等教育出版社,2014:71-85.