4:抽象概念:進(jìn)程(Process)
進(jìn)程簡(jiǎn)單概念:運(yùn)行的程序。
** 核心問(wèn)題:如何制造無(wú)窮多CPU的假象?**
分時(shí)復(fù)用。
機(jī)制和策略的概念:
- 機(jī)制是達(dá)到某種功能的底層方法或協(xié)議
- 策略是在OS中做決定的某種算法
4.1 進(jìn)程抽象
在OS中執(zhí)行的某種程序我們稱(chēng)為進(jìn)程。
進(jìn)程的機(jī)器狀態(tài):
- 內(nèi)存,進(jìn)程能尋址的地址空間
- 寄存器、通用以及特殊寄存器(PC、SP、FP)
- IO信息
4.2 進(jìn)程API概述
- 創(chuàng)造函數(shù)
- 摧毀函數(shù)
- 等待
- 其他控制函數(shù)
- 狀態(tài)查詢(xún)函數(shù)
4.3 進(jìn)程創(chuàng)造:一點(diǎn)點(diǎn)細(xì)節(jié)
進(jìn)程是如何創(chuàng)造的?
- 首先將它的代碼段和數(shù)據(jù)段加載到內(nèi)存(進(jìn)程的地址空間)中
- 早期OS:eagerly
- 現(xiàn)代OS:lazily(paging, swapping)
- 分配棧空間
- 分配堆空間
- 運(yùn)行初始化程序,例如IO初始化
- OS將控制權(quán)轉(zhuǎn)給進(jìn)程的main函數(shù)
4.4 進(jìn)程狀態(tài)
- 運(yùn)行中(Running)
- 準(zhǔn)備中(Ready)
- 停止(Blocked)
4.5 數(shù)據(jù)結(jié)構(gòu)
OS保存在各個(gè)狀態(tài)中的進(jìn)程的進(jìn)程表單,便于在適當(dāng)時(shí)候做上下午轉(zhuǎn)換。(PCB)
有些系統(tǒng)保存有各進(jìn)程的初始化狀態(tài)。
有些系統(tǒng)保存各個(gè)進(jìn)程的最終狀態(tài),返回碼。
4.6 小結(jié)(略)
5 Unix進(jìn)程API
5.1 fork()
int rc = fork()
if(rc < 0)
... // fork failed
else if(rc == 0){
... // in child process
} else {
... // in parent process
}
子進(jìn)程不是完全母進(jìn)程的copy,兩者從fork的返回值開(kāi)始,返回值不同。
getpid()
5.2 wait()
- waitpid()
- 返回打斷本進(jìn)程的pid
5.3 exec()
- exec()/execl()/execle()/execlp()/execv()/execvp()
- 將新代碼和數(shù)據(jù)覆蓋當(dāng)前代碼段和數(shù)據(jù)段,重新初始化堆棧
- 并不創(chuàng)造一個(gè)新進(jìn)程,而是將當(dāng)前進(jìn)程變成了一個(gè)不同的進(jìn)程
- 成功執(zhí)行的exec不會(huì)退出
5.4 為什么這樣設(shè)計(jì)?
可以支持很多靈活的系統(tǒng)設(shè)計(jì)。
shell:fork->exec->wait,各種混合
Unix pipe利用了pipe()系統(tǒng)函數(shù)
grep -o foo file | wc -l
5.5 其他API
例如kill()