linux 學習之 進程

        關於volatile 關鍵字:告訴編譯程序不必優化,直接從內存讀取數據而不是寄存器,以確保狀態的變化能及時反映出來。

一個定義爲volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器裏的備份。

關於進程:Linux在啓動的時候創建進程init,顧名思義這是起始進程,init進程是唯一一個沒有父進程的進程。 init進程爲每一個終端(tty)創建一個新的管理進程,這些進程在終端等待用戶的登錄,一旦用戶登錄成功則爲用戶創建一個shell進程,由shell進程等待並接受用戶輸入的命令信息。

 此外init進程還負責接收孤兒進程,所謂孤兒進程即創建該進程的父進程結束了,而子進程還活着,則該子進程成爲孤兒進程,init進程負責收養該進程。

進程的狀態:

(1)TASK_RUNNING(運行):進程是可執行的,或者正在運行或正在就緒隊列等待運行

(2)TASK_INTERRUPYIBLE(可中斷):進程正在睡眠,也就是被阻塞,等待某些條件的達成。一但該條件達成,內核就將該進程設置成運行態,處於該狀態的進程也會因爲收到信號而被喚醒並投入運行。

(3)TASK_UNINTERRUPTIBLE(不可中斷)出了不會因爲接收到信號而被喚醒從而進入運行態,別的都和可中斷的相同。這個狀態通常在進程必須在等待時不受干擾或等待時間很快就發生時出現。因爲該狀態不對任何信號做反應,所以用的比較少。

(4)TASK_ZOMBIE(僵死):該進程已經結束,但是父進程還沒有調用wait()調用接收該子進程的結束信息。爲了使父進程獲得該進程的結束信息,該進程還保留着進程描述符,等待父進程調用wait調用來結束。

(5)TASK_STOPPED(暫停)進程暫停執行,比如當進程收到以下信號後,進入暫停狀態。

  SIGSTOP    :停止進程執行

SIGTSTP:從終端發來信號停止進程

SIGTTIN:來自鍵盤的中斷

SIGTTOUT:後臺進程請求輸出



ps命令查看進程信息   https://linux.cn/article-4743-1.html

pstree可以將所有進程顯示成樹狀

使用cat命令查看文件內容  cat 文件路徑

進程標識符(PID):

進程上下文和中斷上下文詳解

用戶空間的應用程序,通過系統調用,進入內核空間。這個時候用戶空間的進程要傳遞 很多變量、參數的值給內核,內核態運行的時候也要保存用戶進程的一些寄存 器值、變量等。所謂的“進程上下文”,可以看作是用戶進程傳遞給內核的這些參數以及內核要保存的那一整套的變量和寄存器值和當時的環境等。

硬件通過觸發信號,導致內核調用中斷處理程序,進入內核空間。這個過程中,硬件的 一些變量和參數也要傳遞給內核,內核通過這些參數進行中斷處理。所謂的“ 中斷上下文”,其實也可以看作就是硬件傳遞過來的這些參數和內核需要保存的一些其他環境(主要是當前被打斷執行的進程環境)。

LINUX完全註釋中的一段話:

當一個進程在執行時,CPU的所有寄存器中的值、進程的狀態以及堆棧中的內容被稱 爲該進程的上下文。當內核需要切換到另一個進程時,它需要保存當前進程的 所有狀態,即保存當前進程的上下文,以便在再次執行該進程時,能夠必得到切換時的狀態執行下去。在LINUX中,當前進程上下文均保存在進程的任務數據結 構中。在發生中斷時,內核就在被中斷進程的上下文中,在內核態下執行中斷服務例程。但同時會保留所有需要用到的資源,以便中繼服務結束時能恢復被中斷進程 的執行。

進程上下文是一種內核所處的操作模式,此時內核代表進程執行--例如執行系統調用或運行內核線程。
上下文context: 上下文簡單說來就是一個環境,相對於進程而言,就是進程執行時的環境。具體來說就是各個變量和數據,包括所有的寄存器變量、進程打開的文件、內存信息等。



一、父進程fork出子進程,然而並不知道子進程什麼時候才能結束,調用wait()函數得到子進程的結束信息,

#include<sys/wait.h>

pid_t wait(int *statloc); 

調用wait()的進程會阻塞,知道該進程的任意一個子進程結束。wait()會取得結束的子進程的信息,並且返回該子進程的進程ID


pid_t waitpid(pid_t pid,int *statloc,int options) 該函數等待一個指定的子進程結束。

二、

孤兒進程:一個父進程退出,而它的一個或多個子進程還在運行,那麼那些子進程將成爲孤兒進程。孤兒進程將被init進程(進程號爲1)所收養,並由init進程對它們完成狀態收集工作。


殭屍進程:一個進程使用fork創建子進程,如果子進程退出,而父進程並沒有調用wait或waitpid獲取子進程的狀態信息,那麼子進程的進程描述符仍然保存在系統中。這種進程稱之爲僵死進程。


http://www.cnblogs.com/Anker/p/3271773.html

關於殭屍進程和守護進程的信息可以看該網站

發佈了41 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章