Process
Execution state
Address space
Context switch
Process control block(PCB)
進程的定義
進程是操作系統(tǒng)對執(zhí)行的抽象
- 是執(zhí)行的基本單元
- 是一個程序動態(tài)執(zhí)行的上下文
進程有的時候被稱為一個job或者task
- 進程之間是相互獨立的
- 進程可以被其他進程創(chuàng)建溅话,也可以創(chuàng)建其他進程宵膨。
進程的狀態(tài)
進程狀態(tài)表示進程當前在做什么:
-
Running
:線程正在CPU上執(zhí)行指令(它控制著CPU沐批,最多有多少進程可以同時處于running狀態(tài)呢蛉拙?—— 等于CPU個數(shù)) -
Ready
:等待被調(diào)度上CPU(準備執(zhí)行皱碘,但另外一個線程正在執(zhí)行) -
Waiting
:等待一個事件(如I/O)(直到等待的事件發(fā)生之前進程都不能被調(diào)度上CPU)
狀態(tài)轉(zhuǎn)化圖
進程內(nèi)有什么?
- 進程狀態(tài)
- new鸯乃,ready派阱,running,waiting揩环,halted
- 程序計數(shù)器
- 進程要執(zhí)行的下一條指令的地址
- CPU寄存器
- 棧指針搔弄,基本的寄存器,變址寄存器
- CPU進行調(diào)度需要的信息
- 進程優(yōu)先級丰滑,指向進程的指針
- 內(nèi)存管理的信息
- 基本的信息顾犹,虛擬地址空間到物理地址的映射
- 統(tǒng)計信息
- 進程的ID,owner,時間限制
- I/O狀態(tài)信息
- 分配給當前進程的I/O設(shè)備的列表
一個例子:
程序:
int myval;
int main(int argc, char *argv[]) {
myval = atoi(argv[1]);
while(1)
printf("myval is %d, loc 0x%lx\n", myval, (long)&myval);
}
然后在兩個terminals里面輸入
Myval 5
Myval 6
結(jié)果為:
- myval的數(shù)值是不一樣的
- myval的地址是一樣的
與之相關(guān)的知識:
- 進程的地址空間是相互獨立蹦渣,互不干涉的哄芜,所以值是一樣的
- 輸出的myval的地址是這個變量的在其所屬進程中的邏輯地址。 所以可以有相同的地址柬唯。
- 其地址相同是因為认臊,它們對應(yīng)的進程內(nèi)容除了myval的具體值之外基本完全相同。當然锄奢,如果采用其他的內(nèi)容分配策略(比如隨機)失晴,則地址也是可以不一樣的。
進程的地址空間一般是:
- 用戶空間在低地址
- 內(nèi)核在較高的地址 (從0xffffffff開始)
進程的用戶地址空間所含內(nèi)容如下:
用戶地址空間
進程控制塊(PCB)
在內(nèi)核中拘央,操作系統(tǒng)用PCB描述一個進程涂屁。
- PCB包括了進程的所有的信息
- 在進程不運行的時候,其運行的上下文就被存儲在PCB中灰伟。
PCB的一些內(nèi)容
PCB中存儲了進程所在的隊列
操作系統(tǒng)通過一些隊列來記錄進程的狀態(tài)