- Linux使用和管理指南:從云原生到可觀測(cè)性
- (奧)邁克爾·豪森布拉斯
- 1041字
- 2024-07-25 15:55:51
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.h(https://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)存。
- Modern Web Testing with TestCafe
- 阿里云數(shù)字新基建系列:云原生操作系統(tǒng)Kubernetes
- 精通Linux內(nèi)核開(kāi)發(fā)
- Extending Puppet
- Windows Phone 8 Application Development Essentials
- Learning Bootstrap
- 從零開(kāi)始學(xué)安裝與重裝系統(tǒng)
- 從實(shí)踐中學(xué)習(xí)Windows滲透測(cè)試
- Raspberry Pi入門(mén)指南
- 每天5分鐘玩轉(zhuǎn)Docker容器技術(shù)
- OpenSolaris紅寶書(shū)
- Website Development with PyroCMS
- Getting Started with Citrix XenApp 6.5
- SAP后勤模塊實(shí)施攻略:SAP在生產(chǎn)、采購(gòu)、銷(xiāo)售、物流中的應(yīng)用
- 物聯(lián)網(wǎng)操作系統(tǒng)AliOS Things探索與實(shí)踐