1. 程式人生 > >Linux的系統進程

Linux的系統進程

常見 總結 shadow 就會 自動 執行過程 chkconfig red 隊列

linux進程管理
在linux系統中,觸發任何一個事件,系統都會將它定義為一個進程,並且給予這個進程一個ID,稱為PID。同時依據觸發這個進程的用戶與相關屬性的關系,給予這 個PID一組有效的權限設置。

進程基本概念
一、進程和程序
程序
程序是一組有序的靜態指令,是一種靜態的概念。
通常為二進制程序放置在存儲媒介中(如硬盤、光盤等),以物理文件的形式存在,如:/etc/init.d/httpd本身是一個軟件代碼;

進程
進程是程序的一次運行活動,屬於一種動態的概念。
程序被觸發執行後,執行者的權限和屬性、程序的程序代碼與所需的數據等都會被加載到內存中,操作系統會給予這個內存內的單元一個PID,如:如果啟動/etc/init.d/httpd會產生相對應的進程;

註意
程序和進程無一一對應關系,一個程序可以由多個進程共用,一個進程在活動中可順序地執行若幹個程序;

二、進程和線程
我們以一個案例來理解這2個名詞:
人:線程;桌子:進程;開一張桌子:進程開銷

這裏寫圖片描述

進程是資源調度的最小單位,線程是CPU調度的最小單位;

三、子進程和父進程
在linux系統中,系統調用fork創建進程,子進程是由一個進程產生的進程,產生這個子進程的進程為父進程

我們來看一個實驗
這裏寫圖片描述
由上例可以看到,後一個進程的父進程為前一個進程

正常情況下,父進程終止子進程終止,特別的:

  • 孤兒進程:父進程終止,子進程未終止,則子進程變為孤兒進程,其父進程會自動指向init進程;
  • 僵屍進程:爸爸不知道我的傻兒子已經掛掉了,所以兒子就變成為了僵屍(進程);
    我們可以用ps -Z來找到僵屍進程,再用kill -s SINGNAL pid來殺死他,註意這個pid為父進程的id(僵屍進程本身已經死掉了,你不能殺死死人~~)
  • 死鎖:若幹個進程/線程在執行過程中,因爭奪資源而造成互信等待的現象;

四、前臺進程和後臺進程
前臺進程
在shell提示出打入命令後,創建一個子進程,運行命令,shell等待命令退出,然後返回到對用戶給出提示符,這個命令與shell異步運行,即在前臺運行,用戶在它完成前不能執行另一個命令。

後臺進程
在shell提示出打入命令後,後隨一個&,運行命令,shell創建的子進程運行此命令,但不等待命令退出,直接返回到對用戶給出提示符,這個命令與shell同步運行,即後臺運行。

五、進程的幾種狀態
進程和程序的主要區別是動態性,動態的產生和終止,從產生進程到終止進程可以具有的基本狀態為就緒態、運行態、阻塞態

就緒狀態:當進程已經分配到除CPU以外的必要資源,只要再獲得CPU,便可立即執行,這時的狀態稱為就緒狀態;
運行狀態:進程已獲得CPU,其程序正在執行;
等待狀態:進程的執行受到阻塞,比如:請求I/O、申請緩沖空間等等,把這種暫停狀態稱為阻塞狀態,又稱阻塞狀態。
#通常將相同狀態的進程排成一個或者多個隊列,如:就緒隊列、阻塞隊列等;

進程的階段?
進程的一生中主要有3個階段:等待、運行、停止(成功執行後或者收到殺死進程信號後);
特別地,殺死的進程仍然留在進程表中則是僵屍;
六、進程調度
當你運行一個程序時,系統產生一個父進程以及調用fork方式復制若幹個子進程,然後暫停進程以exec的方式加載實際要執行的程序,當子進程終止的時候,會返回一個exit信號,父進程會調用wait命令讀取子進程狀態為死亡,然後把子進程從進程表中移除;

fork
系統先以fork的方式復制一個和父進程相同的中間緩存子進程
唯一區別就是PID不同,且這個暫存進程還會多一個PPID的參數

這裏寫圖片描述子進程如何實現繼承?
fork復制的內容包括父進程的數據和堆棧段以及父進程的進程環境,使得子進程實現了繼承

exec
然後暫存進程開始以exec的方式加載實際要執行的程序,新的進程名為daidai,最終子進程的程序代碼就為daidai

同步
同步機制
臨界區:在任何時刻只允許 一個線程對共享資源進程訪問,適用於進程內部
互斥量:擁有互斥對象權限才能訪問資源,該對象只有一個;
信號量:允許多個線程在同一時刻訪問同一資源;(類似操作系統的PV,P申請操作,V釋放操作)
事件:通過通知操作的方式保持線程同步

同步通信

系統級的內核進程都是會用中括號括起來的,它們會執行一些系統的輔助功能(如將緩存寫入磁盤);無括號的進程都是用戶們執行的進程(如php、nginx等)。
技術分享圖片
10個比較常見的系統進程:

kswapd0
kjournald
pdflush
kthreadd
migration
watchdog
events
kblockd
aio
rpciod

1、kswapd0
系統每過一定時間就會喚醒kswapd,看看內存是否緊張,如果不緊張,則睡眠,在kswapd中,有2個閥值,pages_hige和pages_low,當空閑內存頁的數量低於pages_low的時候,kswapd進程就會掃描內存並且每次釋放出32個free pages,直到free page的數量到達pages_high。

2、kjournald
journal:記錄所有文件系統上的元數據改變,最慢的一種模式。
ordered:默認使用的模式,只記錄文件系統改變的元數據,並在改變之前記錄日誌。
writeback :最快的一種模式,同樣只記錄修改過的元數據,依賴標準文件系統寫進程將數據寫到硬盤。

3、pdflush
pdflush用於將內存中的內容和文件系統進行同步。

4、kthreadd
這種內核線程只有一個,它的作用是管理調度其它的內核線程。

5、migration

這種內核線程共有32個,從migration/0到migration/31,每個處理器核對應一個migration內核線程,主要作用是作為相應CPU核的遷移進程,用來執行進程遷移操作,內核中的函數是migration_thread()

屬於2.6內核的負載平衡系統,該進程在系統啟動時自動加載(每個 cpu 一個),並將自己設為 SCHED_FIFO 的實時進程,然後檢查 runqueue::migration_queue 中是否有請求等待處理,如果沒有,就在 TASK_INTERRUPTIBLE 中休眠,直至被喚醒後再次檢查。migration_thread() 僅僅是一個 CPU 綁定以及 CPU 電源管理等功能的一個接口。這個線程是調度系統的重要組成部分。

6、watchdog

這種內核線程共有32個,從watchdog/0到watchdog/31, 每個處理器核對應一個watchdog 內核線程,watchdog用於監視系統的運行,在系統出現故障時自動重新啟動系統,包括一個內核 watchdog module 和一個用戶空間的 watchdog 程序。

在Linux 內核下,watchdog的基本工作原理是:當watchdog啟動後(即/dev/watchdog設備被打開後),如果在某一設定的時間間隔(1分鐘)內/dev/watchdog沒有被執行寫操作,硬件watchdog電路或軟件定時器就會重新啟動系統,每次寫操作會導致重新設定定時器。

7、events

這種內核線程共有32個,從events/0到events/31, 每個處理器核對應一個 events內核線程。用來處理內核事件很多軟硬件事件(比如斷電,文件變更)被轉換為events,並分發給對相應事件感興趣的線程進行響應。

8、kblockd

這種內核線程共有32個,從kblockd/0到kblockd/31,每個處理器核對應一個 kblockd 內核線程。用於管理系統的塊設備,它會周期地激活系統內的塊設備驅動。如果擁有塊設備,那麽這些線程就不能被去掉。

9、aio

這種內核線程共有32個,從aio/0到aio/31, 每個處理器核對應一個 aio 內核線程, 代替用戶進程管理I/O,用以支持用戶態的AIO(異步I/O),不應該被關閉。

10、rpciod

這種內核線程共有32個,從rpciod/0到rpciod/31, 每個處理器核對應一個rpciod內核線程,主要作用是作為遠過程調用服務的守護進程,用於從客戶端啟動I/O服務,通常啟動NFS服務時要用到它。

總結

進程是操作系統上非常重要的概念,所有系統上面跑的數據都會以進程的類型存在。在 Linux 系統當中:觸發任何一個事件時,系統都會將它定義成為一個進程,所以,進程是Linux程序的唯一的實現方式。

ps命令用於查看系統中的進程狀態,格式為:“ps [參數]”,
常見的ps命令參數包括有:
-a 顯示所有的進程(包括其他用戶的)
-u 用戶以及其他詳細信息
-x 顯示沒有控制終端的進程

Linux系統中進程最常見的5種不同的狀態是運行、中斷、不可中斷、僵死與停止
R(運行):正在運行或在運行隊列中等待。
S(中斷):休眠中, 在等待某個條件的形成或接收到信號。
D(不可中斷):收到信號不喚醒和不可運行, 進程必須等待直到有中斷發生。
Z:(僵死):進程已終止, 但進程描述符存在, 直到父進程調用wait4()系統調用後釋放。
T:(停止):進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號後停止運行。

如何關閉linux系統下不需要的進程:
首先 chkconifig --list 查看你要關的進程名字 然後chkconfig 服務名字 off

Linux的系統進程