每個(gè)進(jìn)程都可以通過(guò)系統(tǒng)調(diào)用fork來(lái)創(chuàng)建子進(jìn)程召夹,子進(jìn)程復(fù)制父進(jìn)程的數(shù)據(jù)段滥嘴、堆动羽、棧和代碼段句喷。全盤復(fù)制父進(jìn)程的數(shù)據(jù)會(huì)很低效镣典,Linux內(nèi)核采用一種寫時(shí)復(fù)制(Cpoy On Write)的機(jī)制來(lái)提高創(chuàng)建進(jìn)程的效率。
子進(jìn)程也可以通過(guò)系統(tǒng)調(diào)用exec來(lái)加載一個(gè)新程序唾琼,覆蓋原先從父進(jìn)程復(fù)制的數(shù)據(jù)段兄春、代碼段、堆和棧等锡溯。
進(jìn)程的屬性
進(jìn)程描述符保存了進(jìn)程相關(guān)的屬性赶舆,包括優(yōu)先級(jí)、狀態(tài)祭饭、虛擬地址范圍以及各種訪問(wèn)權(quán)限芜茵。進(jìn)程描述符其實(shí)就是一種數(shù)據(jù)結(jié)構(gòu),在Linux系統(tǒng)中倡蝙,每個(gè)進(jìn)程都有一個(gè)唯一標(biāo)識(shí)(也會(huì)保存在進(jìn)程描述符中)九串,就是進(jìn)程ID,即PID寺鸥,還有父進(jìn)程ID猪钮,即PPID。
進(jìn)程狀態(tài)
進(jìn)程的空間
用戶進(jìn)程存在于用戶空間中胆建,無(wú)法與硬件進(jìn)行交互烤低;內(nèi)核進(jìn)程存在于內(nèi)核空間中,可以直接與硬件交互笆载;
用戶空間和內(nèi)核空間都是操作系統(tǒng)對(duì)內(nèi)存范圍的劃分扑馁,這里說(shuō)的內(nèi)存其實(shí)是虛擬內(nèi)存,并不等同于物理內(nèi)存凉驻。
用戶進(jìn)程只能通過(guò)內(nèi)核提供的系統(tǒng)調(diào)用腻要,來(lái)操作內(nèi)核,達(dá)到和硬件交互的效果沿侈。
系統(tǒng)調(diào)用使用上跟普通的函數(shù)調(diào)用是一樣的闯第,但其實(shí)是兩種東西市栗,CPU在執(zhí)行進(jìn)程的時(shí)候缀拭,會(huì)有狀態(tài)的概念-內(nèi)核態(tài)和用戶態(tài),比如在執(zhí)行用戶進(jìn)程的時(shí)候填帽,CPU是沒(méi)有權(quán)限訪問(wèn)內(nèi)核空間的蛛淋。因此,在進(jìn)行系統(tǒng)調(diào)用的時(shí)候篡腌,還伴隨著CPU狀態(tài)的變換褐荷。
進(jìn)程切換意味著需要做上下文的切換(其實(shí)就是CPU運(yùn)行過(guò)程中寄存器狀態(tài)的保存和切換),線程切換也會(huì)有這部分開銷嘹悼。
IPC-進(jìn)程間通信
上述描述的是多進(jìn)程不斷的切換叛甫,獲得CPU調(diào)度层宫,相互獨(dú)立的執(zhí)行。
但其實(shí)大多數(shù)常見(jiàn)其监,都是需要多進(jìn)程協(xié)同完成某些任務(wù)的萌腿,這就需要IPC的支持。
資源共享
多進(jìn)程(或者是多線程抖苦、多協(xié)程等)訪問(wèn)統(tǒng)一資源毁菱,難免會(huì)相互干擾,這個(gè)干擾就成為競(jìng)態(tài)條件锌历。
資源共享還引入了兩個(gè)概念:
- 原子操作:執(zhí)行過(guò)程中不能被中斷的操作成為原子操作贮庞。
- 臨界區(qū):需要串行訪問(wèn)的資源或者代碼段,成為臨界區(qū)究西。
管道
管道是一種單向的通信方式窗慎。
信號(hào)
一種異步的通信方式,用軟件來(lái)模擬硬件的中斷機(jī)制卤材,通知某個(gè)進(jìn)程某個(gè)事件發(fā)生了捉邢。每個(gè)信號(hào)都是以“SIG”前綴的名字,本質(zhì)上其實(shí)是正整數(shù)商膊。
Linux支持62種信號(hào)伏伐,分為標(biāo)準(zhǔn)信號(hào)(131)和實(shí)時(shí)信號(hào)(3464)。
- 標(biāo)準(zhǔn)信號(hào):同一個(gè)進(jìn)程晕拆,每種標(biāo)準(zhǔn)信號(hào)只會(huì)被記錄和處理一次藐翎。
- 實(shí)時(shí)信號(hào):多個(gè)同種類的信號(hào)都可以被記錄,并且按順序被處理实幕。
socket
實(shí)現(xiàn)分布式通信