Linux系統(tǒng)進程深入理解

1. 什么是進程
進程是處于執(zhí)行期的程序以及它所包含的所有資源的總稱,包括虛擬處理器,虛擬空間,寄存器,堆棧,全局數(shù)據(jù)段等。
在Linux中,每個進程在創(chuàng)建時都會被分配一個數(shù)據(jù)結構,稱為進程控制塊(Process Control Block,簡稱PCB)。PCB中包含了很多重要的信息,供系統(tǒng)調度和進程本身執(zhí)行使用。所有進程的PCB都存放在內核空間中。PCB中最重要的信息就是進程PID,內核通過這個PID來唯一標識一個進程。PID可以循環(huán)使用,最大值是32768。init進程的pid為1,其他進程都是init進程的后代。
除了進程控制塊(PCB)以外,每個進程都有獨立的內核堆棧(8k),一個進程描述符結構,這些數(shù)據(jù)都作為進程的控制信息儲存在內核空間中;而進程的用戶空間主要存儲代碼和數(shù)據(jù)。
2.進程的創(chuàng)建
進程是通過調用::fork(),::vfork()和::clone()系統(tǒng)調用創(chuàng)建新進程。在內核中,它們都是調用do_fork實現(xiàn)的。傳統(tǒng)的fork函數(shù)直接把父進程的所有資源復制給子進程。而Linux的::fork()使用寫時拷貝頁實現(xiàn),也就是說,父進程和子進程共享同一個資源拷貝,只有當數(shù)據(jù)發(fā)生改變時,數(shù)據(jù)才會發(fā)生復制。通常的情況,子進程創(chuàng)建后會立即調用exec(),這樣就避免復制父進程的全部資源。
三者的區(qū)別如下:
::fork():父進程的所有數(shù)據(jù)結構都會復制一份給子進程(寫時拷貝頁)。
::vfork():只復制task_struct和內核堆棧,所以生成的只是父進程的一個線程(無獨立的用戶空間)。
::clone():功能強大,帶了許多參數(shù)。::clone()可以讓你有選擇性的繼承父進程的資源,既可以選擇像::vfork()一樣和父進程共享一個虛擬空間,從而使創(chuàng)造的是線程,你也可以不和父進程共享,你甚至可以選擇創(chuàng)造出來的進程和父進程不再是父子關系,而是兄弟關系。
3. 進程的撤銷
進程通過調用exit()退出執(zhí)行,這個函數(shù)會終結進程并釋放所有的資源。父進程可以通過wait4()查詢子進程是否終結。進程退出執(zhí)行后處于僵死狀態(tài),直到它的父進程調用wait()或者waitpid()為止。父進程退出時,內核會指定線程組的其他進程或者init進程作為其子進程的新父進程。當進程接收到一個不能處理或忽視的信號時,或當在內核態(tài)產(chǎn)生一個不可恢復的CPU異常而內核此時正代表該進程在運行,內核可以強迫進程終止。
4. 進程管理
內核把進程信息存放在叫做任務隊列(task list)的雙向循環(huán)鏈表中(內核空間)。鏈表中的每一項都是類型為task_struct,稱為進程描述符結構(process descriptor),包含了一個具體進程的所有信息,包括打開的文件,進程的地址空間,掛起的信號,進程的狀態(tài)等。
Linux通過slab分配器分配task_struct,這樣能達到對象復用和緩存著色(通過預先分配和重復使用task_struct,可以避免動態(tài)分配和釋放所帶來的資源消耗)。
內核把所有處于TASK_RUNNING狀態(tài)的進程組織成一個可運行雙向循環(huán)隊列。調度函數(shù)通過掃描整個可運行隊列,取得最值得執(zhí)行的進程投入執(zhí)行。避免掃描所有進程,提高調度效率。
5. 進程的內核堆棧
Linux為每個進程分配一個8KB大小的內存區(qū)域,用于存放該進程兩個不同的數(shù)據(jù)結構:thread_info和進程的內核堆棧。
進程處于內核態(tài)時使用不同于用戶態(tài)堆棧,內核控制路徑所用的堆棧很少,因此對棧和描述符來說,8KB足夠了。
相關文章
Fedora Linux 42 穩(wěn)定版發(fā)布: 帶來大量新功能和軟件更新
Fedora 42昨日發(fā)布,這是 Red Hat 贊助開發(fā)的杰出前沿 Linux 發(fā)行版的最新版,包含大量新功能和軟件更新,使其成為 2025 年上半年發(fā)布的一款出色的 Linux 操作系統(tǒng)之一,內2025-04-16如何在Linux查看硬盤信息? 查看Linux硬盤大小類型和硬件信息的5種方法
使用Linux系統(tǒng)的過程中,查看和了解硬盤信息是非常重要的工作,尤其是對于系統(tǒng)管理員而言,那么在Linux系統(tǒng)中如何查看硬盤信息?以下是具體內容介紹2025-03-12如何在 Linux 中查看 CPU 詳細信息? 3招輕松查看CPU型號、核心數(shù)和溫度
在日常運維工作中,獲取 CPU 信息是系統(tǒng)運維管理員常見的工作內容,無論是為了性能調優(yōu)、硬件升級還是僅僅滿足好奇心2025-03-11什么是 Arch Linux? 獨樹一幟的Arch Linux發(fā)行版分析
Arch Linux是為簡化,優(yōu)化,現(xiàn)代化,實用主義,用戶中心和多功能性而創(chuàng)建Linux發(fā)行版,究竟是什么讓 Arch 與眾不同?下面我們就來簡要解讀2025-02-19如何在Linux環(huán)境下制作 Win11裝機U盤?
一直用的linux辦公,想要將筆記本電腦從 Linux 系統(tǒng)切換回 Windows 11,我們可以制作一個win11裝機u盤,詳細如下2025-02-17Rsnapshot怎么用? 基于Rsync的強大Linux備份工具使用指南
Rsnapshot 不僅可以備份本地文件,還能通過 SSH 備份遠程文件,接下來詳細介紹如何安裝、配置和使用 Rsnapshot,包括創(chuàng)建每小時、每天、每周和每月的本地備份,以及如何進2025-02-06Linux Kernel 6.13發(fā)布:附更新內容及新特性解讀
Linux 內核 6.13 正式發(fā)布,新版本引入了惰性搶占支持,簡化內核搶占邏輯,通過減少與調度器相關的調用次數(shù),讓內核在運行時表現(xiàn)更優(yōu),從而提高效率2025-01-23五大特性引領創(chuàng)新! 深度操作系統(tǒng) deepin 25 Preview預覽版發(fā)布
今日,深度操作系統(tǒng)正式推出deepin 25 Preview版本,該版本集成了五大核心特性:磐石系統(tǒng)、全新DDE、Treeland窗口合成器、AI For OS以及Distrobox子系統(tǒng)2025-01-18Linux Mint Xia 22.1重磅發(fā)布: 重要更新一覽
Beta 版 Linux Mint“Xia” 22.1 發(fā)布,新版本基于 Ubuntu 24.04,內核版本為 Linux 6.8,這次更新帶來了諸多優(yōu)化和改進,進一步鞏固了 Mint 在 Linux 桌面操作系統(tǒng)領域的2025-01-16LinuxMint怎么安裝? Linux Mint22下載安裝圖文教程
Linux Mint22發(fā)布以后,有很多新功能,很多朋友想要下載并安裝,該怎么操作呢?下面我們就來看看詳細安裝指南2025-01-16