Linux進程的相關知識介紹

對于Linux系統管理員來說 , 對Linux進程的相關知識需要有一定的了解 , 進程和線程很容易被混淆 , 只有充分了解了Linux進程才不會弄錯 , 下面小編就給大家詳細介紹下Linux進程吧 。
計算機實際上可以做的事情實質上非常簡單 , 比如計算兩個數的和 , 再比如在內存中尋找到某個地址等等 。這些最基礎的計算機動作被稱為指令 (instruction) 。所謂的程序(program) , 就是這樣一系列指令的所構成的集合 。通過程序 , 我們可以讓計算機完成復雜的操作 。程序大多數時候被存儲為可執行的文件 。這樣一個可執行文件就像是一個菜譜 , 計算機可以按照菜譜作出可口的飯菜 。
那么 , 程序和進程(process)的區別又是什么呢?
進程是程序的一個具體實現 。只有食譜沒什么用 , 我們總要按照食譜的指點真正一步步實行 , 才能做出菜肴 。進程是執行程序的過程 , 類似于按照食譜 , 真正去做菜的過程 。同一個程序可以執行多次 , 每次都可以在內存中開辟獨立的空間來裝載 , 從而產生多個進程 。不同的進程還可以擁有各自獨立的IO接口 。
操作系統的一個重要功能就是為進程提供方便 , 比如說為進程分配內存空間 , 管理進程的相關信息等等 , 就好像是為我們準備好了一個精美的廚房 。
看一眼進程
首先 , 我們可以使用$ps命令來查詢正在運行的進程 , 比如$ps -eo pid , comm , cmd , 下圖為執行結果:
(-e表示列出全部進程 , -o pid , comm , cmd表示我們需要PID , COMMAND , CMD信息)

Linux進程的相關知識介紹


【Linux進程的相關知識介紹】 每一行代表了一個進程 。每一行又分為三列 。第一列PID(process IDentity)是一個整數 , 每一個進程都有一個唯一的PID來代表自己的身份 , 進程也可以根據PID來識別其他的進程 。第二列COMMAND是這個進程的簡稱 。第三列CMD是進程所對應的程序以及運行時所帶的參數 。
(第三列有一些由中括號[]括起來的 。它們是kernel的一部分功能 , 被打扮成進程的樣子以方便操作系統管理 。我們不必考慮它們 。)
我們看第一行 , PID為1 , 名字為init 。這個進程是執行/bin/init這一文件(程序)生成的 。當Linux啟動的時候 , init是系統創建的第一個進程 , 這一進程會一直存在 , 直到我們關閉計算機 。這一進程有特殊的重要性 , 我們會不斷提到它 。
如何創建一個進程
實際上 , 當計算機開機的時候 , 內核(kernel)只建立了一個init進程 。Linux kernel并不提供直接建立新進程的系統調用 。剩下的所有進程都是init進程通過fork機制建立的 。新的進程要通過老的進程復制自身得到 , 這就是fork 。fork是一個系統調用 。進程存活于內存中 。每個進程都在內存中分配有屬于自己的一片空間 (address space) 。當進程fork的時候 , Linux在內存中開辟出一片新的內存空間給新的進程 , 并將老的進程空間中的內容復制到新的空間中 , 此后兩個進程同時運行 。
老進程成為新進程的父進程(parent process) , 而相應的 , 新進程就是老的進程的子進程(child process) 。一個進程除了有一個PID之外 , 還會有一個PPID(parent PID)來存儲的父進程PID 。如果我們循著PPID不斷向上追溯的話 , 總會發現其源頭是init進程 。所以說 , 所有的進程也構成一個以init為根的樹狀結構 。

推薦閱讀