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