第二部分 進(jìn)程概念
引入進(jìn)程的概念
一個(gè)操作系統(tǒng)必然是CPU和I/O設(shè)備協(xié)同工作的一個(gè)過程,如下圖:
圖上表明铛楣,當(dāng)I/O閑置時(shí)刀荒,CPU高速工作弱左,而當(dāng)I/O變?yōu)楦唠娖絾?dòng)時(shí)窄陡,CPU先等待然后等I/O設(shè)備啟動(dòng)后,CPU繼續(xù)完成其他的工作拆火。這一定程度上造成CPU的使用效率達(dá)不到100%跳夭。
最理想的多任務(wù)模型
一個(gè)理想情況:
現(xiàn)在內(nèi)存里有兩個(gè)程序A和B。由電平上看们镜,A币叹,B程序也是一會(huì)執(zhí)行CPU指令,一會(huì)執(zhí)行I/O指令模狭。但如果搭配得當(dāng)颈抚,使得A程序執(zhí)行CPU指令時(shí),B程序執(zhí)行I/O指令嚼鹉,協(xié)同搭配贩汉,就可以提高CPU的使用效率九妈,使得其不再等待。
進(jìn)程
進(jìn)程概念
An operating system executes(執(zhí)行) a variety of programs:
- Batch system - jobs
- Time-shared systems - user programs or tasks
為什么不能把程序稱之為進(jìn)程
- different data with same program
- different program with same data
上面兩種實(shí)際上都是兩個(gè)進(jìn)程雾鬼。
進(jìn)程定義
Process - a program in execution;process execution must progress in sequential fashion
進(jìn)程有三個(gè)維度的要素:
1.是正在執(zhí)行的程序
2.進(jìn)程執(zhí)行的程序正在處理數(shù)據(jù)
3.進(jìn)程的狀態(tài)。靜止的程序是不運(yùn)行的程序宴树,但它不是一個(gè)進(jìn)程策菜。
進(jìn)程狀態(tài)遷移實(shí)例:
- 有五個(gè)基本狀態(tài):new,ready(一切準(zhǔn)備就緒,只要CPU給指令就可以執(zhí)行),waiting(進(jìn)程還未準(zhǔn)備好),running,terminated(進(jìn)程結(jié)束執(zhí)行).
PCB(進(jìn)程控制塊)
每一個(gè)進(jìn)程都有一個(gè)PCB酒贬,是在內(nèi)存里面駐留的一對(duì)一的又憨,反映相應(yīng)進(jìn)程信息。
進(jìn)程通常與下列信息關(guān)聯(lián):
- Process state
- Process number锭吨,進(jìn)程號(hào)蠢莺,必須嚴(yán)格控制每個(gè)進(jìn)程號(hào)不同,是一個(gè)正整數(shù)零如。
- Program counter(計(jì)算機(jī)中提供要從存儲(chǔ)器中取出的下一個(gè)指令地址的寄存器)
- CPU registers
- CPU scheduling information
- Memory-management information
- Accounting information
- I/O status information
- THAT SPECIFIC TO THE PROCESS(不會(huì)放到程序中去)
進(jìn)程管理:
總的來講躏将,一個(gè)進(jìn)程由一個(gè)PCB塊來控制。而進(jìn)程主要有三個(gè)狀態(tài):就緒狀態(tài)考蕾,等待狀態(tài)和執(zhí)行狀態(tài)祸憋。三種狀態(tài)分別拉成鏈表中隊(duì)列的形式,里面分別有head指針和tail指針肖卧。
我們可以把他們看成就緒隊(duì)列蚯窥,等待隊(duì)列和執(zhí)行隊(duì)列。
- 就緒的進(jìn)程全部放入一個(gè)隊(duì)列中塞帐。這樣的好處是當(dāng)我要執(zhí)行就緒進(jìn)程時(shí)我只需要關(guān)注這個(gè)隊(duì)列里的進(jìn)程就可以了拦赠,其他的進(jìn)程可以一概不管。
- 執(zhí)行隊(duì)列葵姥。假設(shè)只有單核CPU的狀態(tài)下荷鼠,則只有一個(gè)進(jìn)程或沒有(CPU空閑)在執(zhí)行。
- 等待隊(duì)列牌里。比較直觀的設(shè)計(jì)是颊咬,在等待同一個(gè)資源進(jìn)程的時(shí)候,這些進(jìn)程組成一個(gè)隊(duì)列牡辽。如圖tape,disk,terminal三種不同資源組成三個(gè)隊(duì)列喳篇。
思考:操作系統(tǒng)的管理實(shí)際就是把PCB從一個(gè)隊(duì)列放入另外一個(gè)隊(duì)列(遷移)。相當(dāng)于是管理不同的進(jìn)程隊(duì)列态辛。
進(jìn)程調(diào)度隊(duì)列麸澜,動(dòng)態(tài)反應(yīng)操作系統(tǒng)全貌
- Job queue — 等待進(jìn)入計(jì)算機(jī)系統(tǒng)的待處理任務(wù)
- Ready queue — 駐留內(nèi)存,準(zhǔn)備就緒奏黑,等待CPU
- Device queues — 等待I/O設(shè)備的進(jìn)程隊(duì)列
進(jìn)程是如何在隊(duì)列中遷移的
- 這個(gè)圖強(qiáng)調(diào)Ready queue炊邦,當(dāng)進(jìn)程拿到CPU后编矾,進(jìn)程離開Ready queue,進(jìn)入執(zhí)行隊(duì)列馁害。執(zhí)行進(jìn)程不可能一直占用CPU窄俏,因?yàn)槌绦虮旧沓艘獔?zhí)行,還需要執(zhí)行I/O操作碘菜。當(dāng)執(zhí)行I/O操作時(shí)凹蜈,它需要被轉(zhuǎn)移到其他的I/O請(qǐng)求的隊(duì)列里去,從而與外部設(shè)備進(jìn)行連接(如第二行)忍啸,當(dāng)做完I/O操作以后仰坦,繼續(xù)進(jìn)入ready queue。
- time slice expired為時(shí)間片计雌,它可以強(qiáng)制剝奪進(jìn)程的CPU使用權(quán)(時(shí)間片用完)悄晃。但之后由于它擁有資源,所以還會(huì)立馬轉(zhuǎn)入ready queue等待下一次獲取CPU凿滤。
- 第四行則為一個(gè)進(jìn)程創(chuàng)建了一個(gè)子進(jìn)程妈橄。等子進(jìn)程做完以后,才可以喚醒進(jìn)程鸭巴。它有一個(gè)等待狀態(tài)眷细。它等待的資源不是I/O資源,而是等待子進(jìn)程結(jié)束鹃祖。
- 第五行為進(jìn)程需要等待一個(gè)中斷信號(hào)產(chǎn)生溪椎。中斷信號(hào)發(fā)生,則可以進(jìn)入ready queue恬口。
進(jìn)程上下文切換(Context Switch)
- CPU任何時(shí)候只能為一個(gè)進(jìn)程服務(wù)
- 當(dāng)CPU轉(zhuǎn)向?yàn)榱硪粋€(gè)進(jìn)程服務(wù)時(shí)校读,由于CPU內(nèi)部資源(內(nèi)部寄存器)有限,它必須保存原有(轉(zhuǎn)換前)進(jìn)程的狀態(tài)祖能,裝入待服務(wù)(轉(zhuǎn)換后)進(jìn)程的狀態(tài)歉秫,也即“進(jìn)程上下文切換”
- “狀態(tài)”指寄存器、標(biāo)志位养铸、堆棧等當(dāng)前值雁芙。
- 上下文切換時(shí)間是一種額外開銷(overhead),因?yàn)槠陂gCPU不做對(duì)用戶進(jìn)程直接有益的事钞螟。
- 上下文切換時(shí)間決定于CPU硬件支持力度兔甘。
進(jìn)程操作
進(jìn)程創(chuàng)建
- 父進(jìn)程創(chuàng)建若干子進(jìn)程,后者再創(chuàng)建其子進(jìn)程鳞滨,以此類推洞焙,構(gòu)成了反映“傳承”關(guān)系的一顆進(jìn)程樹。進(jìn)程的運(yùn)行實(shí)際上就是進(jìn)程樹的運(yùn)行。
- 子進(jìn)程的資源分配類型
1.子進(jìn)程共享父進(jìn)程的所有資源(UNIX)
2.子進(jìn)程共享父進(jìn)程的部分資源
3.子進(jìn)程不從父進(jìn)程共享資源澡匪,重新獨(dú)立申請(qǐng) - 執(zhí)行代碼的執(zhí)行順序
1.父進(jìn)程和子進(jìn)程并發(fā)執(zhí)行
2.父進(jìn)程在子進(jìn)程執(zhí)行期間等待熔任,待子進(jìn)程執(zhí)行完畢后才恢復(fù)執(zhí)行余下代碼
創(chuàng)建進(jìn)程分三步:
1.申請(qǐng)PCB空間,分配一個(gè)指向PCB的指針唁情。
2.申請(qǐng)一個(gè)唯一的PID號(hào)即進(jìn)程號(hào)疑苔。
3.對(duì)PCB空間每一個(gè)單元賦值。
以UNIX為例進(jìn)行進(jìn)程創(chuàng)建
地址空間中的image
- 子進(jìn)程Duplicate父進(jìn)程的image甸鸟。
解釋一下Duplicate:創(chuàng)建一個(gè)與原來進(jìn)程幾乎完全相同的進(jìn)程夯巷,也就是兩個(gè)進(jìn)程可以做完全相同的事,但如果初始參數(shù)或者傳入的變量不同哀墓,兩個(gè)進(jìn)程也可以做不同的事。
也即Linux中的fork()函數(shù)喷兼。 - UNIX的進(jìn)程創(chuàng)建中篮绰,fork系統(tǒng)首先先創(chuàng)建一個(gè)新的(子)進(jìn)程,fork之后季惯,exec系統(tǒng)調(diào)用裝入一個(gè)新程序吠各。
- 父進(jìn)程fork()一個(gè)子進(jìn)程,子進(jìn)程繼承了父進(jìn)程所有的資源勉抓。
- 但往往子進(jìn)程不想要父進(jìn)程的資源贾漏,所以調(diào)用system call函數(shù)exec()裝進(jìn)自己新的程序。
- 當(dāng)子進(jìn)程發(fā)送了exit()藕筋,即中止信號(hào)返回給父進(jìn)程纵散,父進(jìn)程結(jié)束wait狀態(tài),進(jìn)入就緒隊(duì)列隐圾。
一個(gè)具體代碼:
- 代碼首先定義Pid類型伍掀,此時(shí)只有一個(gè)進(jìn)程,定義了一個(gè)Pid的局部變量暇藏。
- 調(diào)用fork()創(chuàng)建子進(jìn)程蜜笤。按照Linux的做法,子進(jìn)程完全繼承父進(jìn)程的一切盐碱。子進(jìn)程和父進(jìn)程唯一不同的是PID號(hào)把兔,同時(shí)兩個(gè)進(jìn)程相互獨(dú)立,子進(jìn)程獨(dú)立執(zhí)行execlp()瓮顽。
- fork()在返回過程中县好,父進(jìn)程返回值是一個(gè)非0正整數(shù),而這個(gè)正整數(shù)為子進(jìn)程的PID號(hào)趣倾。而子進(jìn)程的返回值為0聘惦,如果出現(xiàn)錯(cuò)誤,fork返回一個(gè)負(fù)值。
- Pid_t pid在子進(jìn)程不執(zhí)行善绎。因?yàn)楦高M(jìn)程已經(jīng)定義過PID號(hào)黔漂,子進(jìn)程無需重新定義。
- 最后一個(gè)else父進(jìn)程調(diào)用wait之后會(huì)一直阻塞禀酱,等待子進(jìn)程結(jié)束炬守,父進(jìn)程wait一旦返回則表示子進(jìn)程所有資源已經(jīng)被回收。
進(jìn)程終止
進(jìn)程終止語(yǔ)義之一:
子進(jìn)程執(zhí)行完最后一條指令后剂跟,要求操作系統(tǒng)將自己彈出(exit)减途。語(yǔ)義動(dòng)作含:
- 子進(jìn)程傳遞數(shù)據(jù)給父進(jìn)程(通過父進(jìn)程的wait操作)。
- 子進(jìn)程的資源被操作系統(tǒng)收回曹洽。
進(jìn)程終止語(yǔ)義之二:
父進(jìn)程終止子進(jìn)程的執(zhí)行鳍置。有很多原因,一般情況下是子進(jìn)程沒有執(zhí)行完畢就被終止了送淆。
問題:如果父進(jìn)程終止了税产,它的子進(jìn)程怎么辦?
結(jié)論:有些操作系統(tǒng)把這些子進(jìn)程也全部終止(All children terminated - cascading)偷崩。
進(jìn)程間合作
- 獨(dú)立進(jìn)程不會(huì)影響其它進(jìn)程的執(zhí)行辟拷,也不被影響。
- 合作進(jìn)程影響其它進(jìn)程阐斜,或者受其影響衫冻。
- 進(jìn)程間合作是必須的。如共享信息谒出,加速執(zhí)行任務(wù)隅俘,模塊化,方便調(diào)用等笤喳。
經(jīng)典案例:生產(chǎn)者-消費(fèi)者問題
- 生產(chǎn)者進(jìn)程“生產(chǎn)”出信息考赛,存儲(chǔ)在緩沖區(qū),供消費(fèi)者進(jìn)程“消費(fèi)”莉测。即生產(chǎn)者消費(fèi)者共享緩沖區(qū)颜骤。
我們討論bounded buffer情況,即緩沖區(qū)數(shù)量有限的情況捣卤。此時(shí)考慮:
- 如果緩沖區(qū)為空忍抽,那么消費(fèi)者無法消費(fèi),無法從緩沖區(qū)取東西董朝。必須等待鸠项。
- 如果緩沖區(qū)滿了,那么生產(chǎn)者無法生產(chǎn)子姜。生產(chǎn)的東西放不進(jìn)緩沖區(qū)祟绊。
故兩者需要相互關(guān)聯(lián)。
Interprocess Communication(IPC)
進(jìn)程間通信IPC,提供一套進(jìn)程通信牧抽、進(jìn)程同步的機(jī)制嘉熊。
消息系統(tǒng) — 進(jìn)程間相互通信的途徑,不需要有共享變量的介入扬舒。
IPC機(jī)制有2個(gè)最基本的進(jìn)程操作:
- send(message)
- receive(message)
變種:
- send(P,message)— 直接發(fā)給進(jìn)程P
- receive(Q阐肤,message)— 直接接受來自進(jìn)程Q的消息。
變種:Indirect Communication
- send(A,message)讲坎,A是郵件服務(wù)器孕惜。
- receive (A,message)。
★★同步通信VS異步通信
同步通信:
- 發(fā)送操作send:發(fā)送進(jìn)程等待晨炕,直至接受進(jìn)程確認(rèn)收到消息衫画。
- 接受操作receive:接受進(jìn)程等待,直至有個(gè)消息到達(dá)瓮栗。
異步通信:
- 發(fā)送操作send:發(fā)送進(jìn)程發(fā)出消息后立即返回碧磅,該干什么干什么,不理會(huì)消息是否送達(dá)遵馆。
- 接受操作receive:接受進(jìn)程執(zhí)行一次接受動(dòng)作,要么收到一條有效信息丰榴,要么收到空消息货邓。
舉例:TCP/IP
- TCP一個(gè)數(shù)據(jù)包發(fā)送以后必須等待接受進(jìn)程確認(rèn)收到消息,因此它較為可靠四濒。
- IP包發(fā)出去后换况,立即返回。因此其通信性能好盗蟆,速度快戈二。
進(jìn)程之間相互通信表明這些進(jìn)程為協(xié)同進(jìn)程。