我們來自五湖四海,不為別的,只因有共同的愛好,為中國互聯網發展出一分力!

Processes(進程)相關介紹

2013年04月28日03:40 閱讀: 1561 次

      本章描述進程是什么以及Linux如何創建、管理和刪除系統中的進程。

     

    進程執行操作系統中的任務。程序是存放在磁盤上的包括一系列機器代碼指令和數據的可執行的映像,因此,是一個被動的實體。進程可以看作是一個執行中的計算機程序。它是動態的實體,在處理器執行機器代碼指令時不斷改變。處理程序的指令和數據,進程也包括程序計數器和其他CPU的寄存器以及包括臨時數據(例如例程參數、返回地址和保存的變量)的堆棧。當前執行的程序,或者說進程,包括微處理器中所有的當前的活動。Linux是一個多進程的操作系統。進程是分離的任務,擁有各自的權利和責任。如果一個進程崩潰,它不應該讓系統中的另一個進程崩潰。每一個獨立的進程運行在自己的虛擬地址空間,除了通過安全的核心管理的機制之外無法影響其他的進程。

     

    在一個進程的生命周期中它會使用許多系統資源。它會用系統的CPU執行它的指令,用系統的物理內存來存儲它和它的數據。它會打開和使用文件系統中的文件,會直接或者間接使用系統的物理設備。Linux必須跟蹤進程本身和它使用的系統資源以便管理公平地管理該進程和系統中的其他進程。如果一個進程獨占了系統的大部分物理內存和CPU,對于其他進程就是不公平的。

     

    系統中最寶貴的資源就是CPU。通常系統只有一個。Linux是一個多進程的操作系統。它的目標是讓進程一直在系統的每一個CPU上運行,充分利用CPU。如果進程數多于CPU(多數是這樣),其余的進程必須等到CPU被釋放才能運行。多進程是一個簡單的思想:一個進程一直運行,直到它必須等待,通常是等待一些系統資源,等擁有了資源,它才可以繼續運行。在一個單進程的系統,比如DOS,CPU被簡單地設為空閑,這樣等待的時間就會被浪費。在一個多進程的系統中,同一時刻許多進程在內存中。當一個進程必須等待時操作系統將CPU從這個進程拿走,并將它交給另一個更需要的進程。是調度程序選擇了

    下一次最合適的進程。Linux使用了一系列的調度方案來保證公平。

     

    Linux支持許多不同的可執行文件格式,ELF是其中之一,Java是另一個。Linux必須透明地管理這些文件,因為進程使用系統的共享的庫。

     

    4.1 Linux Processes(Linux的進程)

     

    Linux中,每一個進程用一個task_strUCt(在Linux中task和process互用)的數據結構來表示,用來管理系統中的進程。Task向量表是指向系統中每一個task_struct數據結構的指針的數組。這意味著系統中最大進程數受task向量表的限制,缺省是512。當新的進程創建的時候,從系統內存中分配一個新的task_struct,并增加到task向量表中。為了更容易查找,用current指針指向當前運行的進程。


    參見include/linux/sched.h

     

    除了普通進程,Linux也支持實時進程。這些進程必須對于外界事件迅速反應(因此叫做“實時”),調度程序必須和普通用戶進程區分對待。雖然task_struct數據結構十分巨大、復雜,但是它的域可以分為以下的功能:

     

    State 進程執行時它根據情況改變狀態(state)。Linux進程使用以下狀態:(這里漏掉了SWAPPING,因為看來沒用到)

    Running 進程在運行(是系統的當前進程)或者準備運行(等待被安排到系統的一個CPU上)

    Waiting 進程在等待一個事件或資源。Linux區分兩種類型的等待進程:可中斷和不可中斷的(interruptible and uninterruptible)。可中斷的等待進程可以被信號中斷,而不可中斷的等待進程直接等待硬件條件,不能被任何情況中斷。

    Stopped 進程停止了,通常是接收到了一個信號。正在調試的進程可以在停止狀態。

    Zombie 終止的進程,因為某種原因,在task 向量表重任舊有一個task_struct數據結構的條目。就想聽起來一樣,是一個死亡的進程。

     

    Scheduling Information 調度者需要這個信息用于公平地決定系統中的進程哪一個更應該運行。

    Identifiers 系統中的每一個進程都有一個進程標識符。進程標識符不是task向量表中的索引,而只是一個數字。每一個進程也都有用戶和組(user and group)的標識符。用來控制進程對于系統中文件和設備的訪問。

    Inter-Process Communication Linux支持傳統的UNIX-IPC機制,即信號,管道和信號燈(semaphores),也支持系統V的IPC機制,即共享內存、信號燈和消息隊列。關于Linux支持的IPC機制在第5章中描述。

    Links 在Linux系統中,沒有一個進程是和其他進程完全無關的。系統中的每一個進程,除了初始的進程之外,都有一個父進程。新進程不是創建的,而是拷貝,或者說從前一個進程克隆的(cloned)。每一個進程的task_struct中都有指向它的父進程和兄弟進程(擁有相同的父進程的進程)以及它的子進程的的指針。在Linux系統中你可以用pstree命令看到正在運行的進程的家庭關系。

     

    init(1)-+-crond(98)

    -emacs(387)

    -gpm(146)

    -inetd(110)

    -kerneld(18)

    -kflushd(2)

    -klogd(87)

    -kswapd(3)

    -login(160)---bash(192)---emacs(225)

    -lpd(121)

    -mingetty(161)

    -mingetty(162)

    -mingetty(163)

    -mingetty(164)

    -login(403)---bash(404)---pstree(594)

    -sendmail(134)

    -syslogd(78)

    `-update(166)

     

    另外系統中的所有的進程信息還存放在一個task_struct數據結構的雙向鏈表中,根是init進程。這個表讓Linux可以查到系統中的所有的進程。它需要這個表以提供對于ps或者kill等命令的支持。


 

[1] [2] 下一頁

分享到: 更多
藍客門戶
©2001-2019 中國藍客聯盟 版權所有.
關于藍客聯盟歷史宗旨章程技術服務聯系我們藍客社區

女校剑道部闯关