Linux進程含義知多少

Linux進程含義知多少

  理想情況下,您應該明白在您的系統中運行的每一個進程。要獲得所有進程的列表,可以執行命令 ps -ef(POSIX 風格)或 ps ax(BSD 風格)。進程名有方括號的是內核級的進程,執行輔助功能(比如將緩存寫入到磁盤);所有其他進程都是使用者進程。您會注意到,就算是在您新安裝的(最小化的)系統中,也會有很多進程在運行。熟悉它們,並把它們記錄到文檔中。

 

kswapd0,kjournald,pdflushkblocked

1.kswapd0


Linux uses kswapd for virtual memorymanagement such that pages that have been recently accessed are kept in memoryand less active pages are paged out to disk.
(what is a page?)
…Linux uses manages memory in units called pages.
So,the kswapd
 process regularly decreases the ages ofunreferenced pages…and at the end they are paged out(moved out) to disk

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

2.kjournald

EXT3文件系統的日誌進程,具有3種模式:

journal – logs all filesystem data and metadata changes. The slowest of thethree ext3 journaling modes, this journaling mode minimizes the chance oflosing the changes you have made to any file in an ext3 filesystem.(記錄所有文件系統上的元數據改變,最慢的一種模式,)

ordered – only logs changes to filesystem metadata, but flushes file dataupdates to disk before making changes to associated filesystem metadata. Thisis the default ext3 journaling mode.(默認使用的模式,只記錄文件系統改變的元數據,並在改變之前記錄日誌)

writeback – only logs changes to filesystem metadata but relies on the standardfilesystem write process to write file data changes to disk. This is thefastest ext3 journaling mode.(最快的一種模式,同樣只記錄修改過的元數據,依賴標準文件系統寫進程將數據寫到硬盤)

修改模式EXT3的工作模式;

vim /etc/fstab

/dev/hda5     /opt           ext3      data=writeback        1 0
詳細介紹:http://www.linuxplanet.com/linuxplanet/reports/4136/5/


3
、pdflush


pdflush
用於將內存中的內容和文件系統進行同步,比如說,當一個文件在內存中進行修改,pdflush負責將它寫回硬盤.每當內存中的垃圾頁(dirty page)超過10%的時候,pdflush就會將這些頁面備份回硬盤.這個比率是可調節的,通過/etc/sysctl.conf中的 vm.dirty_background_ratio項 默認值爲10 也可以

cat /proc/sys/vm/dirty_background_ratio 查看當前的值

4、kblockd —-塊讀寫子系統

5Migration 進程遷移

什麼是進程遷移?
進程遷移就是將一個進程從當前位置移動到指定的處理器上。它的基本思想是在進程執行過程中移動它,使得它在另一個計算機上繼續存取它的所有資源並繼續運行,而且不必知道運行進程或任何與其它相互作用的進程的知識就可以啓動進程遷移操作,這意味着遷移是透明的。
進程遷移的好處
進程遷移是支持負載平衡和高容錯性的一種非常有效的手段。對一系列的負載平衡策略的研究表明進程遷移是實現負載平衡的基礎,進程遷移在很多方面具有適用性:

動態負載平衡:將進程遷移到負載輕或空閒的節點上,充分利用可用資源,通過減少節點間負載的差異來全面提高性能。 
容錯性和高可用性:某節點出現故障時,通過將進程遷移到其它節點繼續恢復運行,這將極大的提高系統的可靠性和可用性。在某些關鍵性應用中,這一點尤爲重要。 
並行文件IO:將進程遷移到文件服務器上進行IO,而不是通過傳統的從文件服務器通過網絡將數據傳輸給進程。對於那些需向文件服務器請求大量數據的進程,這將有效的減少了通訊量,極大的提高效率。

 
充分利用特殊資源:進程可以通過遷移來利用某節點上獨特的硬件或軟件能力。

 
內存導引(Memory Ushering)機制:當一個節點耗盡它的主存時,Memory Ushering機制將允許進程遷移到其它擁有空閒內存的節點,而不是讓該節點頻繁地進行分頁或和外存進行交換。這種方式適合於負載較爲均衡,但內存使用存在差異或內存物理配置存在差異的系統。 
進程遷移的實現角度
進程遷移的實現複雜性及對OS的依賴性阻礙了進程遷移的廣泛使用 ,尤其是對透明的進程遷移實現。根據應用的級別,進程遷移可以作爲OS的一部分、用戶空間、系統環境的一部分或者成爲應用程序的一部分。

用戶級遷移:用戶級實現較爲簡單,軟件開發和維護也較爲容易,因此,現有的很多系統都是採用用戶級實現,如Condor和Utopia。但由於在用戶級無法獲得Kernel的所有狀態,因此,對於某類進程,無法進行遷移。另外,由於Kernel空間和User空間之間存在着壁壘,打破這個邊界獲得 Kernel提供的服務需要巨大的開銷。因此,用戶級實現效率遠遠低於內核級實現。 
應用級遷移:應用級遷移實現較爲簡單,可移植性好,但是需要了解應用程序語義並可能需對應用程序進行修改或重編譯,透明性較差,這方面的系統有Freedman、Skordos等。 
內核級遷移:基於內核的實現可以充分利用OS提供的功能,全面的獲取進程和OS狀態,因此實現效率較高,能夠爲用戶提供很好的透明性。但是由於需要對OS進行修改,實現較爲複雜。這方面的典型系統有MOSIX和 Sprite系統。

進程狀態
進程遷移的主要工作就在於提取進程狀態,然後在目的節點根據進程狀態再生該進程。在現實中,一個進程擁有很多狀態,並且隨着操作系統的演化,進程狀態也越來越多樣。一般來說,一個進程的狀態可以分爲以下幾類:

進程執行狀態(Execution State):表示當前運行進程的處理器狀態,和機器高度相關。包括內核在上下文切換時保存和恢復的信息,如通用和浮點寄存器值、棧指針、條件碼等。 
進程控制(Process Control):操作系統系統用來控制進程的所有信,一般包括進程優先級、進程標識,父進程標識等。一旦系統編排了進程控制信息,進程遷移系統必須凍結該進程的運行。 
進程Memory狀態和進程地址空間:包括進程的所有虛存信息,進程數據和進程的堆棧信息等,是進程狀態的最主要的一部分。 
進程的消息(Message)狀態:包括進程緩衝的消息和連接(Link)的控制信息。進程遷移中通訊連接的保持以及遷移後連接的恢復是進程遷移中一項較有挑戰意義的問題。 
文件狀態:進程的文件狀態包括文件描述符和文件緩衝快。保持文件的Cache一致性和進程間文件同步訪問也是進程遷移機制需要着重考慮的。 
由於在同構的環境下(相同或兼容的機器體系結構和指令集以及操作系統)提取和恢復進程狀態相對容易,現有的工作大多是以同構環境爲前提的。不過,越來越多的人開始研究異構環境下的進程遷移機制,如TUI 系統。

 

 

#ps  相關進程  k開頭的基本上都是內核驅動,不建議殺掉)

PID TTY      STAT   TIME COMMAND
1    ?       Ss     0:00 init[3]                 (
引導用戶空間服務,管理孤兒線程,不能殺)     
2    ?       S      0:00 [migration/0]
3    ?       SN     0:00 [ksoftirqd/0]           (
內核調度/管理第0CPU軟中斷的守護進程,不能殺)
4    ?       S      0:00 [watchdog/0]            (
系統監控應用,能夠在系統出現故障時自動重新啓動系統。不能殺)
5    ?       S      0:00[migration/1]           (
管理多核心(包括HypterThreading衍生的那個不大管用的、線程在各核心的遷移,不能殺)
6    ?       SN     0:00[ksoftirqd/1]            (
內核調度/管理第1CPU軟中斷的守護進程,不能殺)
7    ?       S      0:00 [watchdog/1]            (
系統監控應用,能夠在系統出現故障時自動重新啓動系統。不能殺)
8    ?       S<     0:00 [events/0]              (
處理內核事件守護進程,不能殺)
9    ?       S<     0:00 [events/1]              (
處理內核事件守護進程,不能殺)
10   ?       S<     0:00[khelper]               (
沒查出來,感覺不能殺)

11  ?        S<     0:00[kthread]               (父內核線程,不能殺)   
15   ?       S<     0:00  \_[kblockd/0]          (
管理磁盤塊讀寫,不能殺)
16   ?       S<     0:00  \_[kblockd/1]          (
管理磁盤塊讀寫,不能殺)
17   ?       S<     0:00  \_[kacpid]            (
內核電源管理,不能殺)
120  ?       S<     0:00  \_[cqueue/0]           (
隊列數據結構,不能殺)
121  ?       S<     0:00  \_[cqueue/1]           (
隊列數據結構,不能殺)
124  ?       S<     0:00  \_[khubd]             (
內核的usb hub,不能殺)
126  ?       S<     0:00  \_ [kseriod]            
內核線程
193  ?       S      0:00  \_[pdflush]           (pdflush
內核線程池是Linux爲了回寫文件系統數據而創建的進程,不能殺)
194  ?       S      0:00  \_[pdflush]           (pdflush
內核線程池是Linux爲了回寫文件系統數據而創建的進程,不能殺)

195  ?       S<     0:00  \_[kswapd0]            (內存回收,確保系統空閒物理內存的數量在一個合適的範圍,不能殺)
196  ?       S<     0:00  \_[aio/0]             (
代替用戶進程管理io,不能殺)
197  ?       S<     0:00  \_[aio/1]             (
代替用戶進程管理io,不能殺)
354  ?       S<     0:00  \_[kpsmoused]          (
內核鼠標支持,可以殺掉)   
387  ?       S<     0:00  \_[ata/0]             (ata
硬盤驅動,不能殺)
388  ?       S<     0:00  \_[ata/1]             (ata
硬盤驅動,不能殺)
389  ?       S<     0:00  \_[ata_aux]           (ata
硬盤驅動,不能殺)
393  ?       S<     0:00  \_[scsi_eh_0]          (scsi
設備,不建議殺)
394  ?       S<     0:00  \_ [scsi_eh_1]         (scsi
設備,不建議殺)
395  ?       S<     0:00  \_[scsi_eh_2]          (scsi
設備,不建議殺)
396  ?       S<     0:00  \_[scsi_eh_3]          (scsi
設備,不建議殺)

432  ?       S<     0:00  \_[kauditd]            (內核審覈守護進程,不能殺)
1160 ?        S<    0:00  \_ [hda_codec]
1418 ?        S<    0:00  \_[kmirrord]           (
內核守護進程控制和監視鏡像模塊,不能殺)
400  ?       S<     0:00  \_ [kjournald]
1442 ?        S<    0:00  \_ [kjournald]
1444 ?        S<    0:00  \_ [kjournald]
1446 ?        S<    0:00  \_ [kjournald]         (kjournald Ext3
文件系統的日誌管理,通常每個mount_ Ext3分區會有一個 kjournald看管,各分區的日誌
是獨立的,不能殺)
466  ?        S<s   0:00 /sbin/udevd-d           (udevd
支持用戶態設備操作,不能殺)
1825 ?        Ss    0:00 syslogd -m0             (syslogd
系統日誌進程,不能殺)
1828 ?        Ss    0:00 klogd -x                (klogd
從內核信息緩衝區獲取打印信息,不能殺)
1844 ?        Ss    0:00irqbalance               (
多個CPU之間均衡分配硬件中斷,可以關閉,但不建議)

1864 ?       Ss     0:00/usr/sbin/sshd           (sshd守護進程,不能殺)
1881 ?        Ss    0:00 crond                   (
執行定時任務,不能殺)
1888 tty1     Ss+    0:00 /sbin/mingettytty1      (mingetty
等待用戶從tty登錄,可以殺)
1892 tty2     Ss+    0:00 /sbin/mingettytty2      (mingetty
等待用戶從tty登錄,可以殺)
1893 tty3     Ss+    0:00 /sbin/mingettytty3      (mingetty
等待用戶從tty登錄,可以殺)

 

 

剛剛開機之後,使用ps查看系統內的內核線程,主要情況如下:   

共發現有232個內核線程存在,它們分別是:

   1kthreadd:這種內核線程只有一個,它的作用是管理調度其它的內核線程。它在內核初始化的時候被創建,會循環運行一個叫做kthreadd的函數,該函數的作用是運行kthread_create_list全局鏈表中維護的kthread。可以調用kthread_create創建一個kthread,它會被加入到kthread_create_list鏈表中,同時kthread_createweak up kthreadd_taskkthreadd在執行kthread會調用老的接口——kernel_thread運行一個名叫“kthread”的內核線程去運行創建的kthread,被執行過的kthread會從kthread_create_list鏈表中刪除,並且kthreadd會不斷調用scheduler 讓出CPU。這個線程不能關閉。

   2migration:這種內核線程共有32個,從migration/0migration/31,每個處理器覈對應一個migration內核線程,主要作用是作爲相應CPU核的遷移進程,用來執行進程遷移操作,內核中的函數是migration_thread()。屬於2.6內核的負載平衡系統,該進程在系統啓動時自動加載(每個 cpu 一個),並將自己設爲 SCHED_FIFO 的實時進程,然後檢查 runqueue::migration_queue 中是否有請求等待處理,如果沒有,就在 TASK_INTERRUPTIBLE 中休眠,直至被喚醒後再次檢查。migration_queue僅在set_cpu_allowed() 中添加,當進程(比如通過 APM 關閉某 CPU 時)調用set_cpu_allowed()改變當前可用 cpu,從而使某進程不適於繼續在當前 cpu 上運行時,就會構造一個遷移請求數據結構 migration_req_t,將其植入進程所在 cpu 就緒隊列的migration_queue 中,然後喚醒該就緒隊列的遷移 daemon(記錄在runqueue::migration_thread 屬性中),將該進程遷移到合適的cpu上去在目前的實現中,目的 cpu 的選擇和負載無關,而是"any_online_cpu(req->task->cpus_allowed)",也就是按 CPU 編號順序的第一個 allowed CPU。所以,和 load_balance() 與調度器、負載平衡策略密切相關不同,migration_thread() 應該說僅僅是一個 CPU 綁定以及 CPU 電源管理等功能的一個接口。這個線程是調度系統的重要組成部分,也不能被關閉。

      3watchdog:這種內核線程共有32個,從watchdog/0watchdog/31, 每個處理器覈對應一個watchdog 內核線程,watchdog用於監視系統的運行,在系統出現故障時自動重新啓動系統,包括一個內核 watchdogmodule 和一個用戶空間的 watchdog 程序。在Linux 內核下, watchdog的基本工作原理是:當watchdog啓動後(/dev/watchdog設備被打開後),如果在某一設定的時間間隔(1分鐘)內/dev/watchdog沒有被執行寫操作硬件watchdog電路或軟件定時器就會重新啓動系統,每次寫操作會導致重新設定定時器。/dev/watchdog是一個主設備號爲10從設備號130的字符設備節點。 Linux內核不僅爲各種不同類型的watchdog硬件電路提供了驅動,還提供了一個基於定時器的純軟件watchdog驅動。如果不需要這種故障處理機制,或者有相應的替代方案,可以在menuconfig

   DeviceDrivers —>

      WatchdogTimer Support

處取消watchdog功能。

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

   5khelper:這種內核線程只有一個,主要作用是指定用戶空間的程序路徑和環境變量最終運行指定的user space的程序,屬於關鍵線程,不能關閉

   6kblockd:這種內核線程共有32個,從kblockd/0kblockd/31, 每個處理器覈對應一個 kblockd 內核線程。用於管理系統的塊設備,它會週期地激活系統內的塊設備驅動。如果擁有塊設備,那麼這些線程就不能被去掉,要是想去掉,需要在.config中直接將CONFIG_BLOCK設成n,同時在menuconfig中取消

    DeviceDrivers   —>

           Blockdevices

   7kseriod:這種內核線程只有一個,主要作用是管理Serio總線上的設備的各種事件,Serio是一種虛擬總線,是Serial I/O的輸寫,表示串行的輸入輸出設備。對應內核中的serio_thread函數,流程大致是這樣的:調用serio_get_event()從鏈表中取出structserio_event元素,然後對這個元素的事件類型做不同的時候,處理完了之後,調用serio_remove_duplicate_events()在鏈表中刪除相同請求的event。例如:如果要註冊新的serio設備,它產生的事件類型是SERIO_REGISTER_PORT,然後流程會轉入serio_add_port()。使用Serio總線的主要是標準AT鍵盤、PS/2鼠標、串口鼠標、Sun鍵盤,以及一些遊戲手柄,不過由於I2C依賴於Serio,所以不關閉I2C就無法關閉SeriomenuconfigSerialI/O的開關位於

DeviceDriver  —>

      Inputdevicesupport

       HardwareI/Oports

           SerialI/Osupport

   8pdflush:這種內核線程共有兩個,線程名都是pdflush,主要作用是回寫內存中的髒頁,回收髒頁佔據的空間。由於頁高速緩存的緩存作用,寫操作實際上會被延遲。當頁高速緩存中的數據比後臺存儲的數據更新時,那麼該數據就被稱做髒數據。在內存中累積起來的髒頁最終必須被寫回。在以下兩種情況發生時,髒頁被寫回:

1.當空閒內存低於一個特定的閾值時,內核必須將髒頁寫回磁盤,以便釋放內存。

2.當髒頁在內存中駐留時間超過一個特定的閾值時,內核必須將超時的髒頁寫回磁盤,以確保髒頁不會無限期地駐留在內存中。

對於第一個目標,pdflush線程在系統中的空閒內存低於一個特定的閾值時,將髒頁刷新回磁盤。該後臺回寫例程的目的在於在可用物理 內存過低時,釋放髒頁以重新獲得內存。特定的內存閾值可以通過dirty_background_ratiosysctl系統調用設置。當空閒內存比閾值:dirty_ background_ratio還低時,內核便會調用函數wakeup_bdflush()喚醒一個pdflush線程,隨後pdflush線程進一步調用函數background_writeout()開始將髒頁寫回磁盤。函數background_ writeout()需要一個長整型參數,該參數指定試圖寫回的頁面數目。函數background_writeout()會連續地寫出數據,直到滿足以下兩個條件:

1. 已經有指定的最小數目的頁被寫出到磁盤。

2. 空閒內存數已經回升,超過了閾值dirty_background_ratio

上述條件確保了pdflush操作可以減輕系統中內存不足的壓力。回寫操作不會在達到這兩個條件前停止,除非pdflush寫回了所有的髒頁,沒有剩下的髒頁可再被寫回了。

對於第二個目標,pdflush後臺例程會被週期性喚醒(和空閒內存是否過低無關),將那些在內存中駐留時間過長的髒頁寫出,確保內存中不會有長期存在的髒頁。如果系統發生崩潰,由於內存處於混亂之中,所以那些在內存中還沒來得及寫回磁盤的髒頁就會丟失,所以週期性同步頁高速緩存和磁盤非常重要。在系統啓動時,內核初始化一個定時器,讓它週期地喚醒pdflush線程,隨後使其運行函數 wb_kupdate()。該函數將把所有駐留時間超過百分之dirty_expire_centisecs秒的髒頁寫回。然後定時器將再次被初始化爲百分之dirty_expire_centisecs秒後喚醒pdflush線程。總而言之,pdflush線程週期地被喚醒並且把超過特定期限的髒頁寫回磁盤。

系統管理員可以在/proc/sys/vm中設置回寫相關的參數,也可以通過sysctl系統調用設置它們

        屬於核心的內存管理線程,這個線程也不能被關閉

9kswapd0:這種內核線程只有一個,主要作用是用來回收內存。在kswapd中,有2個閥值,pages_higepages_low。當空閒內存頁的數量低於pages_low的時候,kswapd進程就會掃描內存並且每次釋放出32 free pages,直到freepage的數量到達pages_high。具體回收內存有如下原則:

      1. 如果頁未經更改就將該頁放入空閒隊列;

      2. 如果頁已經更改並且是可備份迴文件系統的,就理解將內存頁的內容寫回磁盤;

      3. 如果頁已經更改但是沒有任何磁盤上的備份,就將其寫入swap分區。

        同樣,屬於核心的內存管理線程,這個線程也不能被關閉  

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

 11unionfs_siod這種內核線程共有32個,但是名稱都是 unionfs_siod/,每個處理器覈對應一個 unionfs_siod 內核線程

   12nfsiod:這種內核線程只有一個,主要作用是爲nfs提供高效的緩衝機制,從而改善nfs文件系統的性能,如果不需nfs,可以取消這一線程,取消這一線程的方法爲menuconfig中取消

     Filesystems  —>

          NetworkFile Systems

   13rpciod:這種內核線程共有32個,從rpciod/0rpciod/31, 每個處理器覈對應一個rpciod內核線程,主要作用是作爲遠過程調用服務的守護進程,用於從客戶端啓動I/O服務,通常啓動NFS服務時要用到它,想要關閉它,需要在.config中把CONFIG_SUNRPC CONFIG_SUNRPC_GSS CONFIG_SUNRPC_XPRT_RDMA的值設成n

   14kpsmoused:這種內核線程只有一個,主要作用是支持ps/2接口的鼠標驅動。如要沒有鼠標,可以取消,取消方法是menuconfig中取消

DeviceDrivers   —>

      Inputdevice support

       Mice

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章