歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> Linux核心--5.Linux進程

Linux核心--5.Linux進程

日期:2017/2/27 14:31:43   编辑:更多Linux
  原著: David A Rusling   翻譯: Banyan & FIFA     第四章 進程管理     本章重點討論Linux內核如何在系統中創建、管理以及刪除進程。      進程在操作系統中執行特定的任務。而程序是存儲在磁盤上包含可執行機器指令和數據的靜態實體。進程或者任務是處於活動狀態的計算機程序。  進程是一個隨執行過程不斷變化的實體。和程序要包含指令和數據一樣,進程也包含程序計數器和所有CPU寄存器的值,同時它的堆棧中存儲著如子程序參數、返回地址以及變量之類的臨時數據。當前的執行程序,或者說進程,包含著當前處理器中的活動狀態。Linux是一個多處理操作系統。進程具有獨立的權限與職責。如果系統中某個進程崩潰,它不會影響到其余的進程。每個進程運行在其各自的虛擬地址空間中,通過核心控制下可靠的通訊機制,它們之間才能發生聯系。      進程在生命期內將使用系統中的資源。它利用系統中的CPU來執行指令,在物理內存來放置指令和數據。使用文件系統提供的功能打開並使用文件,同時直接或者間接的使用物理設備。Linux必須跟蹤系統中每個進程以及資源,以便在進程間實現資源的公平分配。如果系統有一個進程獨占了大部分物理內存或者CPU的使用時間,這種情況對系統中的其它進程是不公平的。      系統中最寶貴的資源是CPU,通常系統中只有一個CPU。Linux是一個多處理操作系統,它最終的目的是:任何時刻系統中的每個CPU上都有任務執行,從而提高CPU的利用率。如果進程個數多於CPU的個數,則有些進程必須等待到CPU空閒時才可以運行。多處理是的思路很簡單;當進程需要某個系統資源時它將停止執行並等待到資源可用時才繼續運行。單處理系統中,如DOS,此時CPU將處於空等狀態,這個時間將被浪費掉。在多處理系統中,因為可以同時存在多個進程,所以當某個進程開始等待時,操作系統將把CPU控制權拿過來並交給其它可以運行的進程。調度器負責選擇適當的進程來運行,Linux使用一些調度策略以保證CPU分配的公平性。      Linux支持多種類型的可執行文件格式,如ELF,Java等。由於這些進程必須使用系統共享庫,所以對它們的管理要具有透明性。    4.1  Linux進程   為了讓Linux來管理系統中的進程,每個進程用一個task_strUCt數據結構來表示(任務與進程在Linux中可以混用)。數組task包含指向系統中所有task_struct結構的指針。      這意味著系統中的最大進程數目受task數組大小的限制,缺省值一般為512。創建新進程時,Linux將從系統內存中分配一個task_struct結構並將其加入task數組。當前運行進程的結構用current指針來指示。      Linux還支持實時進程。這些進程必須對外部時間作出快速反應(這就是“實時”的意思),系統將區分對待這些進程和其他進程。雖然task_struct數據結構龐大而復雜,但它可以分成一些功能組成部分: State    進程在執行過程中會根據環境來改變state。Linux進程有以下狀態:    Running    進程處於運行(它是系統的當前進程)或者准備運行狀態(它在等待系統將CPU分配給它)。    Waiting    進程在等待一個事件或者資源。Linux將等待進程分成兩類;可中斷與不可中斷。可中斷等待進程可以被信號中斷;不可中斷等待進程直接在硬件條件等待,並且任何情況下都不可中斷。    Stopped    進程被停止,通常是通過接收一個信號。正在被調試的進程可能處於停止狀態。    Zombie    這是由於某些原因被終止的進程,但是在task數據中仍然保留task_struct結構。 它象一個已經死亡的進程。    Scheduling Information    調度器需要這些信息以便判定系統中哪個進程最迫切需要運行。    Identifiers    系統中每個進程都有進程標志。進程標志並不是task數組的索引,它僅僅是個數字。每個進程還有一個用戶與組標志,它們用來控制進程對系統中文件和設備的存取權限。    Inter-Process Communication   Linux支持經典的Unix IPC機制,如信號、管道和信號燈以及系統V中IPC機制,包括共享內存、信號燈和消息隊列。我們將在IPC一章中詳細討論Linux中IPC機制。      Links    Linux系統中所有進程都是相互聯系的。除了初始化進程外,所有進程都有一個父進程。新進程不是被創建,而是被復制,或者從以前的進程克隆而來。每個進程對應的task_struct結構中包含有指向其父進程和兄弟進程(具有相同父進程的進程)以及子進程的指針。我們可以使用pstree 命令來觀察Linux系統中運行進程間的關系:      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)   另外,系統中所有進程都用一個雙向鏈表連接起來,而它們的根是init進程的task_struct數據結構。這 個鏈表被Linux核心用來尋找系統中所有進程,它對ps或者kill命令提供了支持。    Times and Timers    核心需要記錄進程的創建時間以及在其生命期中消耗的CPU時間。時鐘每跳動一次,核心就要更新保存在jiffies變量中,記錄進程在系統和用戶模式下消耗的時間量。Linux支持與進程相關的interval定時器,進程可以通過系統調用來設定定時器以便在定時器到時後向它發送信號。這些定時器可以是一次性的或者周期性的。    File system    進程可以自由地打開或關閉文件,進程的task_struct結構中包含一個指向每個打開文件描敘符的指針以及指向兩個VFS inode的指針。每個VFS inode唯一地標記文件中的一個目錄或者文件,同時還對底層文件系統提供統一的接口。Linux對文件系統的支持將在filesystem一章中詳細描敘。這兩個指針,一個指向進程的根目錄,另一個指向其當前或者pwd目錄。pwd從Unix命令pwd中派生出來, 用來顯示當前工作目錄。這兩個VFS inode包含一個count域,當多個進程引用它們時,它的值將增加。這就是為什麼你不能刪除進程當前目錄,或者其子目錄的原因。    Virtual memory    多數進程都有一些虛擬內存(核心線程和後台進程沒有),Linux核心必須跟蹤虛擬內存與系統物理內存的映射關系。    Processor Specific Context    進程可以認為是系統當前狀態的總和。進程運行時,它將使用處理器的寄存器以及堆棧等等。進程被掛起時,進程的上下文-所有的CPU相關的狀態必須保存在它的task_struct結構中。當調度器重新調度該進程時,所有上下文被重新設定。      4.2  Identifiers   和其他Unix一樣,Linux使用用戶和組標志符來檢查對系統中文件和可執行映象的訪問權限。Linux系統中所有的文件都有所有者和允許的權限,這些權限描敘了系統使用者對文件或者目錄的使用權。基本的權限是讀、寫和可執行,這些權限被分配給三類用戶:文件的所有者,屬於相同組的進程以及系統中所有進程。每類用戶具有不同的權限,例如一個文件允許其擁有者讀寫,但是同組的只能讀而其他進程不允許訪問。      Linux使用組將文件和目錄的訪問特權授予一組用戶,而不是單個用戶或者系統中所有進程。如可以為某個軟件項目中的所有用戶創建一個組,並將其權限設置成只有他們才允許讀寫項目中的源代碼。一個進程可以同時屬於多個組(最多為32個),這些組都被放在進程的task_struct中的group數組中。只要某組進程可以存取某個文件,則由此組派生出的進程對這個文件有相應的組訪問權限。   task_struct結構中有四對進程和組標志符:    uid, gid    表示運行進程的用戶標志符和組標志符。    effective uid and gid    有些程序可以在執行過程中將執行進程的uid和gid改成其程序自身的uid和gid(保存在描敘可執行映象的VFS inode屬性中)。這些程序被稱為setuid程序,常在嚴格控制對某些服務的訪問時使用,特別是那些為別的進程而運行的進程,例如網絡後台進程。有效uid和gid是那些setuid執行過程在執行時變化出的uid 和gid。當進程試圖訪問特權數據或代碼時,核心將檢查進程的有效gid和uid。    file system uid and gid    它們和有效uid和gid相似但用來檢驗進程的文件系統訪問權限。如運行在用戶模式下的NFS服務器存取文件時,NFS文件系統將使用這些標志符。此例中只有文件系統uid和gid發生了改變(而非有效uid和gid)。這樣可以避免惡意用戶向NFS服務器發送KILL信號。    saved uid and gid    POSIX標准中要求實現這兩個標志符,它們被那些通過系統調用改變進程uid和gid的程序使用。當進程的原始uid和gid變化時,它們被用來保存真正的uid和gid。      4.3  調度   所有進程部分時間運行於用戶模式,部分時間運行於系統模式。如何支持這些模式,底層硬件的實現各不相同,但是存在一種安全機制可以使它們在用戶模式和系統模式之間來回切換。用戶模式的權限比系統模式下的小得多。進程通過系統調用切換到系統模式繼續執行。此時核心為進程而執




Copyright © Linux教程網 All Rights Reserved