進程:
傳統上,Linux操作系統下運行的應用程序,服務器和其他程序都稱為進程。當然進程不僅僅表示一段處於執行期的可執行代碼,還包括其他資源,例如打開的文件,掛起的信號和內核內部數據等。其實還有個概念叫,線程或者說輕量級進程,不過在Linux中線程和進程其實是類似的。可以把線程看做和其他進程共享某些數據和資源的進程。
進程的表示:
通常進程是由一個叫task_struct的結構表示的,或者叫進程描述符(process descriptor)。它包含了內核管理進程的所有信息。task_struct的很多成員並非簡單的類型變量,而是指向其他數據結構的指針。其實task_struct中有很多成員,將進程和各個子系統連接起來。由於數量是在太龐大,想立刻搞清楚的話,那基本就在細節裡徹底迷失自己啦。但是可以把它們分成很多部分,每個部分表示了進程的一個特定方面。下面就來看看它們吧。
1.狀態和執行信息:進程ID(PID),到父進程及其他有關進程的指針等等。
2.有關已經分配的虛擬內存的信息。
3.進程身份憑據:用戶ID,組ID和權限等等
4.使用的文件的信息
5.線程信息記錄該進程特定於CPU的運行時間數據(沒看懂是啥意思....)
6.進程間通信的有關信息
7.該進程所用的信號處理程序,用來響應到來的信號
其中進程標示符,即PID,是內核對進程的唯一標識。當有一個新的進程創建的時候,系統就會給它分配唯一的一個PID進行標示。
進程的狀態:
在task_struct中的state域描述了進程當前的狀態。每個進程必然處於下列的五種狀態中的一種。
1.TASK_RUNNING:即進程正在執行或者在運行隊列中等待執行
2.TASK_INTERRUPTIBLE:進程處於睡眠狀態,正在等待某事件或資源,一旦收到內核發出的事件已發生的信號,狀態即變為TASK_RUNNING
3.TASK_UNINTERRUPTIBLE:內核指示而停用的睡眠進程,不能被外部信號喚醒,只能由內核親自喚醒
4.TASK_STOPPED:進程停止執行。如調試期間接收到任何信號都會使進程進入這種狀態
5.TASK_TRACED:被其他進程跟蹤的進程
還有一種所謂的僵屍狀態,即EXIT_ZOMBIE。這種程序已經死亡了,因為它的資源,例如內存,和外設的連接等都已經被釋放了,但是它們在進程表中仍然存在,所以它們並沒有真正死亡,具體為啥嘛...以後再說
進程家族樹:
在Linux中樹形結構是普遍存在的,例如文件系統以及現在要說的進程。其中init進程是整個進程樹的根,所有進程都直接或間接來自於該進程。而每個進程幾乎都有自己的孩子進程和父進程。進程具體是怎麼創建以及撤銷的,那也是後面的事啦。總之進程樹和文件樹類似,init就是根目錄,而一個進程創建子進程就相當於在一個目錄下創建新的目錄,撤銷當然是類似的。
好啦,關於進程的最基本的知識差不多就是這些啦!更復雜的事情等到以後再說吧!
注:本篇文章的內容(包括以後的類似文章)主要參考Love的《Linux內核設計與實現》 PDF下載見 http://www.linuxidc.com/Linux/2014-02/96174.htm 以及WolfganglMauerer的《深入Linux內核架構》 PDF下載見 http://www.linuxidc.com/Linux/2012-06/62984.htm 。由於自己在閱讀學習的過程中感覺各本書的側重點以及深入程度都不一樣,給初學者帶來不小麻煩。所以在這裡把自己所學的總結一下,盡量給出內核知識比較精簡的知識結構,以便於更好的從宏觀上把握,確保不會迷失於繁瑣的細節。總的說來,主要是幫助自己梳理了知識,加深了理解吧。如果有幫助到大家,那是最令我開心的事情了!
怎樣在 Ubuntu 上安裝 Linux 3.11 內核 http://www.linuxidc.com/Linux/2013-09/89674.htm
Ubuntu 13.10 (Saucy Salamander) 內核已升級至 Linux Kernel 3.10 RC5 http://www.linuxidc.com/Linux/2013-06/86110.htm
Linux Kernel 3.4.62 LTS 現已經提供下載 http://www.linuxidc.com/Linux/2013-09/90368.htm
如何在Ubuntu 13.10上安裝Linux內核 3.12 http://www.linuxidc.com/Linux/2013-11/92930.htm
Linux Kernel 的詳細介紹:請點這裡
Linux Kernel 的下載地址:請點這裡