歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> linux bible 第四章 進程管理

linux bible 第四章 進程管理

日期:2017/2/27 9:46:40   编辑:更多Linux
  第四章 進程管理 本章重點討論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標准中要求實現這兩個標志符,它們被那些通過系統調



可以避免惡意用戶向NFS服務器發送KILL信號。 saved uid and gid POSIX標准中要求實現這兩個標志符,它們被那些通過系統調



Copyright © Linux教程網 All Rights Reserved