首先我們弄清楚,進(jìn)程在linux中的含義:
程序本身并不是進(jìn)程,進(jìn)程是處于執(zhí)行期的程序以及相關(guān)資源的總稱(chēng)。注意,有兩點(diǎn):
- 執(zhí)行期的程序
- 相關(guān)資源
補(bǔ)充一點(diǎn):在Linux中,進(jìn)程的另一個(gè)名字就是叫做task,任務(wù)。
那么進(jìn)程在如何存放的?
- Linux將進(jìn)程放置在任務(wù)隊(duì)列中,并且用進(jìn)程描述符進(jìn)行表示,描述符中包含了進(jìn)程相關(guān)的所有信息。
進(jìn)程如何區(qū)分?
- 通過(guò)PID給每個(gè)進(jìn)程編號(hào),以此來(lái)區(qū)分進(jìn)程。
進(jìn)程有哪些狀態(tài)?
進(jìn)程描述符中state中存儲(chǔ)著進(jìn)程的狀態(tài)信息,系統(tǒng)中的進(jìn)程必然處于下列五種狀態(tài)中:
- task_running(運(yùn)行)
- task_interruptible(可中斷)--睡眠(阻塞)
- task_uninterruptible(不可中斷)--除了收到信號(hào)不會(huì)被中斷或者準(zhǔn)備投入運(yùn)行,其它與上面一樣
- task_traced(被跟蹤進(jìn)程)
- task_stop(停止)
有時(shí)候我們?cè)趫?zhí)行ps(1)命令時(shí),會(huì)有被標(biāo)記為D狀態(tài)而又不能被殺死的進(jìn)程的原因就是這個(gè)進(jìn)程的狀態(tài)為: 不可中斷狀態(tài)。
Linux進(jìn)程家族樹(shù)?
- 延續(xù)UNIX風(fēng)格,所有進(jìn)程都是PID為1的進(jìn)程的后代。
進(jìn)程最終會(huì)結(jié)束,那么結(jié)束之后就要進(jìn)行一系列的操作,主要操作有以下幾步:
1.設(shè)置task_struct為PF_EXITING
2.釋放進(jìn)程內(nèi)資源
3.重新為子進(jìn)程尋找父類(lèi)(防止孤兒進(jìn)程出現(xiàn))
4.刪除進(jìn)程描述符
這一章我們了解到進(jìn)程的一些基本信息及生存周期里面的一些動(dòng)作。下一章為進(jìn)程調(diào)度,講解內(nèi)核以某種機(jī)制來(lái)控制進(jìn)程的運(yùn)行順序。