官术网_书友最值得收藏!

2.3.1 進(jìn)程管理

內(nèi)核中有許多與進(jìn)程管理相關(guān)的部分。其中一些處理特定于CPU架構(gòu)的事情(比如中斷),而另一些則專(zhuān)注于程序的啟動(dòng)和調(diào)度。

在我們了解Linux細(xì)節(jié)之前,我們要注意,進(jìn)程通常是基于可執(zhí)行程序(或二進(jìn)制文件)的面向用戶的單元。另外,線程是進(jìn)程上下文中的執(zhí)行單元。你可能遇到過(guò)術(shù)語(yǔ)“多線程”,這意味著一個(gè)進(jìn)程有許多并行執(zhí)行,可能運(yùn)行在不同的CPU上。

有了這個(gè)一般的觀點(diǎn),讓我們看看Linux是如何做到的。從最細(xì)粒度到最小單元,Linux有以下內(nèi)容:

會(huì)話

包含一個(gè)或多個(gè)進(jìn)程組,并表示帶有可選tty附加的面向用戶的高級(jí)單元。內(nèi)核通過(guò)一個(gè)稱(chēng)為會(huì)話ID(SID)的數(shù)字來(lái)標(biāo)識(shí)會(huì)話。

進(jìn)程組

包含一個(gè)或多個(gè)進(jìn)程,一個(gè)會(huì)話中最多有一個(gè)進(jìn)程組作為前臺(tái)進(jìn)程組。內(nèi)核通過(guò)一個(gè)稱(chēng)為進(jìn)程組ID(PGID)的數(shù)字來(lái)標(biāo)識(shí)進(jìn)程組。

進(jìn)程

對(duì)多個(gè)資源(地址空間、一個(gè)或多個(gè)線程、套接字等)進(jìn)行分組的抽象,內(nèi)核通過(guò)/proc/self為當(dāng)前進(jìn)程向你公開(kāi)這些資源。內(nèi)核通過(guò)一個(gè)叫作進(jìn)程ID(PID)的數(shù)字來(lái)標(biāo)識(shí)一個(gè)進(jìn)程。

線程

由內(nèi)核以進(jìn)程的形式實(shí)現(xiàn)。也就是說(shuō),沒(méi)有專(zhuān)門(mén)的數(shù)據(jù)結(jié)構(gòu)來(lái)表示線程。相反,線程是與其他進(jìn)程共享某些資源(如內(nèi)存或信號(hào)處理程序)的進(jìn)程。內(nèi)核通過(guò)線程ID(TID)和線程組ID(TGID)來(lái)標(biāo)識(shí)一個(gè)線程,共享的TGID值意味著一個(gè)多線程進(jìn)程(在用戶空間,還有內(nèi)核線程,但這超出了本書(shū)討論的范圍)。

任務(wù)

在內(nèi)核中,有一個(gè)名為task_struct的數(shù)據(jù)結(jié)構(gòu)—在sched.hhttps://oreil.ly/nIgz8)中定義—它構(gòu)成了實(shí)現(xiàn)進(jìn)程和線程的基礎(chǔ)。該數(shù)據(jù)結(jié)構(gòu)捕獲與調(diào)度相關(guān)的信息、標(biāo)識(shí)符(如PID和TGID)、信號(hào)處理程序以及其他信息(例如與性能和安全性相關(guān)的信息)。簡(jiǎn)而言之,前面提到的所有單元都派生或錨定在任務(wù)中,但是,任務(wù)不會(huì)在內(nèi)核之外公開(kāi)。

我們將在第6章看到會(huì)話、進(jìn)程組和進(jìn)程的作用,并學(xué)習(xí)如何管理它們,它們將在第9章再次出現(xiàn)在容器的上下文中。

讓我們來(lái)看看這些概念的實(shí)際應(yīng)用:

?bash shell進(jìn)程的PID、PGID和SID為6756。從ls -al /proc/6756/task/6756/中,我們可以收集任務(wù)級(jí)別的信息。

?ps進(jìn)程的PID/PGID 6790和shell的SID相同。

我們?cè)谇懊嫣岬竭^(guò),在Linux中,任務(wù)數(shù)據(jù)結(jié)構(gòu)有一些與調(diào)度相關(guān)的信息。這意味著在任何給定的時(shí)間,進(jìn)程都處于某種狀態(tài),如圖2-2所示。

圖2-2:Linux進(jìn)程狀態(tài)

嚴(yán)格地說(shuō),進(jìn)程狀態(tài)稍微復(fù)雜一些。例如,Linux區(qū)分了可中斷睡眠和不可中斷睡眠,還有僵尸態(tài)(在這種狀態(tài)下,它失去了父進(jìn)程)。如果你對(duì)細(xì)節(jié)感興趣,請(qǐng)查看文章“Process States in Linux”(https://oreil.ly/XBXbU)。

不同的事件會(huì)導(dǎo)致?tīng)顟B(tài)轉(zhuǎn)換。例如,一個(gè)正在運(yùn)行的進(jìn)程在執(zhí)行一些I/O操作(比如從文件中讀取)時(shí)可能會(huì)轉(zhuǎn)換到等待態(tài),并且無(wú)法繼續(xù)執(zhí)行(離開(kāi)C P U)。

在快速了解了進(jìn)程管理之后,讓我們研究一個(gè)相關(guān)的主題:內(nèi)存。

主站蜘蛛池模板: 彰武县| 拉孜县| 镇巴县| 呼图壁县| 始兴县| 深圳市| 高青县| 尚义县| 南川市| 化德县| 高陵县| 临沂市| 佛坪县| 富裕县| 新和县| 柘荣县| 正镶白旗| 玛沁县| 科技| 泰州市| 涟源市| 邯郸市| 鸡泽县| 曲麻莱县| 太谷县| 出国| 乌兰浩特市| 新丰县| 田东县| 高台县| 文安县| 开鲁县| 黄骅市| 克拉玛依市| 建平县| 黄骅市| 阿坝县| 卢湾区| 太保市| 元谋县| 南川市|