




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、本章的要求第7章、進程控制 u掌握進程相關的基本概念 u掌握Linux下的進程結構 u掌握Linux下進程創建及進程管理 u掌握Linux下進程創建相關的系統調用 u掌握守護進程的概念 u掌握守護進程的啟動方法 u掌握守護進程的輸出及建立方法 u學會編寫多進程程序 學會編寫守護進程 本章的主要內容7.1 Linux進程概述 7.2 Linux進程控制編程 7.3 Linux守護進程7.4 實驗 7.1 Linux進程概述進程的定義 進程的概念首先是在60年代初期由MIT的Multic
2、s系統和IBM的TSS/360系統引入的。在40多年的發展中,人們對進程有過各種各樣的定義?,F列舉較為著名的幾種。l進程是一個獨立的可調度的活動(E. Cohen,D. Jofferson)l進程是一個抽象實體,當它執行某個任務時,要分配和釋放各種資源(P. Denning)l進程是可以并行執行的計算單位。(S. E. Madnick,J. T. Donovan)以上進程的概念都不相同,但其本質是一樣的。它指出了進程是一個程序的一次執行的過程,同時也是資源分配的最小單元。它和程序是有本質區別的,程序是靜態的,它是一些保存在磁盤上的指令的有序集合,沒有任何執行的概念;而進程是一個動態的概念,它是
3、程序執行的過程,包括了動態創建、調度和消亡的整個過程。它是程序執行和資源管理的最小單位。進程控制塊和標識符 進程是Linux系統的基本調度和管理資源的單位,它是通過進程控制塊來描述的。進程控制塊包含了進程的描述信息、控制信息以及資源信息,它是進程的一個靜態描述。在Linux中,進程控制塊中的每一項都是一個task_struct結構。 在Linux中最主要的進程標識有進程號(PID,Process Idenity Number)和它的父進程號(PPID,parent process ID)。其中PID惟一地標識一個進程。PID和PPID都是非零的正整數。在Linux中
4、獲得當前進程的PID和PPID的系統調用函數為getpid()和getppid(),通常程序獲得當前進程的PID和PPID之后,可以將其寫入日志文件以做備份。 另外,進程標識還有用戶和用戶組標識、進程時間、資源利用情況等 進程的狀態進程是程序的執行過程,根據它的生命周期可以劃分成3種狀態。 執行態:該進程正在運行,即進程正在占用CPU。 就緒態:進程已經具備執行的一切條件,正在等待分配CPU的處理時間片。 等待態:進程不能使用CPU,若等待事件發生(等待的資源分配到)則可將其喚醒。 Linux下進程地址空間(1)Linux系統是一個多進程
5、的系統,它的進程之間具有并行性、互不干擾等特點。也就是說,每個進程都是一個獨立的運行單位,擁有各自的權利和責任。其中,各個進程都運行在獨立的虛擬地址空間,因此,即使一個進程發生異常,它也不會影響到系統中的其他進程。Linux中的進程包含3個段,分別為“數據段”、“代碼段”和“堆棧段”。 “數據段”存放的是全局變量、常數以及動態數據分配的數據空間,根據存放的數據,數據段又可以分成普通數據段(包括可讀可寫/只讀數據段,存放靜態初始化的全局變量或常量)、BSS數據段(存放未初始化的全局變量)以及堆(存放動態分配的數據)。 “代碼段”存放的是程序代碼的數據。 “堆棧段”存放的是子程序的返回地址、子程序
6、的參數以及程序的局部變量等。 Linux下進程地址空間、用戶態和內核態堆棧堆數據段(可讀/只讀)數據段代碼段存放傳遞參數及環境變量BSS數據段 低地址高地址用戶進程內核進程用戶態內核態中斷或系統調用 Linux下的進程管理 啟動進程 l手工啟動 l調度啟動 進程相關命令 7.2 Linux進程控制編程創建進程(1)在Linux中創建一個新進程的方法是使用fork()函數。 fork()函數用于從已存在的進程中創建一個新進程。新進程稱為子進程,而原進程稱為父進程。使用fork()函數得
7、到的子進程是父進程的一個復制品,它從父進程處繼承了整個進程的地址空間,包括進程上下文、代碼段、進程堆棧、內存信息、打開的文件描述符、信號控制設定、進程優先級、進程組號、當前工作目錄、根目錄、資源限制和控制終端等,而子進程所獨有的只有它的進程號、資源使用和計時器等。因為子進程幾乎是父進程的完全復制,所以父子兩個進程會運行同一個程序。因此需要用一種方式來區分它們,并使它們照此運行,否則,這兩個進程不可能做不同的事。創建進程(2)實際上是在父進程中執行fork()函數時,父進程會復制出一個子進程,而且父子進程的代碼從fork()函數的返回開始分別在兩個地址空間中同時運行。
8、從而兩個進程分別獲得其所屬fork()的返回值,其中在父進程中的返回值是子進程的進程號,而在子進程中返回0。因此,可以通過返回值來判定該進程是父進程還是子進程。同時可以看出,使用fork()函數的代價是很大的,它復制了父進程中的代碼段、數據段和堆棧段里的大部分內容,使得fork()函數的系統開銷比較大,而且執行速度也不是很快。示例閱讀并運行示例7-2-1exec函數族(1)exec函數族就提供了一個在進程中啟動另一個程序執行的方法。它可以根據指定的文件名或目錄名找到可執行文件,并用它來取代原調用進程的數據段、代碼段和堆棧段,在執行完之后,
9、原調用進程的內容除了進程號外,其他全部被新的進程替換了。另外,這里的可執行文件既可以是二進制文件,也可以是Linux下任何可執行的腳本文件。使用exec函數族主要有兩種情況 當進程認為自己不能再為系統和用戶做出任何貢獻時,就可以調用exec函數族中的任意一個函數讓自己重生; 如果一個進程想執行另一個程序,那么它就可以調用fork()函數新建一個進程,然后調用exec函數族中的任意一個函數,這樣看起來就像通過執行應用程序而產生了一個新進程(這種情況非常普遍)。 exec函數族(2)exec函數族對應位的含義示例閱讀并運行示例7-2-2-1閱
10、讀并運行示例7-2-2-2閱讀并運行示例7-2-2-3閱讀并運行示例7-2-2-4exit()和_exit() (1)exit()和_exit()函數都是用來終止進程的。 _exit()函數的作用是:直接使進程停止運行,清除其使用的內存空間,并清除其在內核中的各種數據結構;exit()函數則在這些基礎上做了一些包裝,在執行退出之前加了若干道工序。exit()函數與_exit()函數最大的區別就在于exit()函數在調用exit系統之前要檢查文件的打開情況,把文件緩沖區中的內容寫回文件,就是圖中的“清理I/O緩沖”一項。由于在Linux的標準函數庫中,有一種被稱作“緩
11、沖I/O(buffered I/O)”操作,其特征就是對應每一個打開的文件,在內存中都有一片緩沖區。每次讀文件時,會連續讀出若干條記錄,這樣在下次讀文件時就可以直接從內存的緩沖區中讀??;同樣,每次寫文件的時候,也僅僅是寫入內存中的緩沖區,等滿足了一定的條件(如達到一定數量或遇到特定字符等),再將緩沖區中的內容一次性寫入文件。exit()和_exit() (2)進程運行進程終止運行調用exit系統調用調用退出處理函數清理I/O緩沖 exit() _exit()這種技術大大增加了文件讀寫的速度,但也為編程帶來了一些麻煩。比如有些數據,認為已經被寫入到文件中,實際上因為沒
12、有滿足特定的條件,它們還只是被保存在緩沖區內,這時用_exit()函數直接將進程關閉,緩沖區中的數據就會丟失。因此,若想保證數據的完整性,就一定要使用exit()函數。 示例閱讀并運行示例7-2-3wait()和waitpid() (1) wait()函數是用于使父進程(也就是調用wait()的進程)阻塞,直到一個子進程結束或者該進程接到了一個指定的信號為止。如果該父進程沒有子進程或者他的子進程已經結束,則wait()就會立即返回。waitpid()的作用和wait()一樣,但它并不一定要等待第一個終止的子進程,它還有若干選項,如可提供一
13、個非阻塞版本的wait()功能,也能支持作業控制。實際上wait()函數只是waitpid()函數的一個特例,在Linux內部實現wait()函數時直接調用的就是waitpid()函數。 wait()和waitpid() (2)示例閱讀并執行示例7-2-4Linux守護進程 守護進程就是后臺服務進程,它是一個生存期較長的進程,通常獨立于控制終端并且周期性地執行某種任務或等待處理某些發生的事件。守護進程常常在系統引導載入時啟動,在系統關閉時終止。Linux有很多系統服務,大多數服務都是通過守護進程實現的,守護進程
14、還能完成許多系統任務,例如,作業規劃進程crond、打印進程lqd等(這里的結尾字母d就是Daemon的意思)。由于在Linux中,每一個系統與用戶進行交流的界面稱為終端,每一個從此終端開始運行的進程都會依附于這個終端,這個終端就稱為這些進程的控制終端,當控制終端被關閉時,相應的進程都會自動關閉。但是守護進程卻能夠突破這種限制,它從被執行開始運轉,直到整個系統關閉時才會退出。如果想讓某個進程不因為用戶、終端或者其他的變化而受到影響,那么就必須把這個進程變成一個守護進程??梢?,守護進程是非常重要的。 守護進程 的編寫流程會話期 進程組1進程組2登錄shell進程1進程
15、2示例閱讀并運行示例7-3-2守護進程的出錯處理 讀者在前面編寫守護進程的具體調試過程中會發現,由于守護進程完全脫離了控制終端,因此,不能像其他普通進程一樣將錯誤信息輸出到控制終端來通知程序員。守護進程的一種通用的辦法是使用syslog服務,將程序中的出錯信息輸入到系統日志文件中,從而可以直觀地看到程序的問題所在。 syslog是Linux中的系統日志管理服務,通過守護進程syslogd來維護。該守護進程在啟動時會讀一個配置文件“/etc/syslog.conf”。該文件決定了不同種類的消息會發送向何處。例如,緊急消息可被送向系統管理員并
16、在控制臺上顯示,而警告消息則可被記錄到一個文件中。 openlog()函數用于打開系統日志服務的一個連接;syslog()函數是用于向日志文件中寫入消息,在這里可以規定消息的優先級、消息輸出格式等;closelog()函數是用于關閉系統日志服務的連接。 閱讀并運行示例7-3-37.4 實驗 實驗1 多進程程序(1)1實驗目的通過編寫多進程程序,使讀者熟練掌握fork()、exec()、wait()和waitpid()等函數的使用,進一步理解在Linux中多進程編程的步驟。2實驗內容 該實驗有3個進程,其中一個為
17、父進程,其余兩個是該父進程創建的子進程,其中一個子進程運行“ls -l”指令,另一個子進程在暫停5s之后異常退出,父進程先用阻塞方式等待第一個子進程的結束,然后用非阻塞方式等待另一個子進程的退出,待收集到第二個子進程結束的信息,父進程就返回。 實驗1 多進程程序(2)實驗2 守護進程(1)1實驗目的通過編寫一個完整的守護進程,使讀者掌握守護進程編寫和調試的方法,并且進一步熟悉如何編寫多進程程序。2實驗內容在該實驗中,讀者首先建立起一個守護進程,然后在該守護進程中新建一個子進程,該子進程暫停10s,然后自動退出,并由守護進程收集子進程退出的消息
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 麻醉吸入性肺炎的護理
- 電子競技賽事商業贊助策略研究報告:2025年品牌合作案例深度解讀
- 2025年罕見病藥物研發激勵政策與罕見病藥物價格監管政策研究報告
- 2025年航空貨運市場結構優化與發展策略深度研究報告
- 物聯網技術概論 教學大綱和授課計劃
- 2025年房地產中介行業規范發展與服務質量提升實證分析報告
- 當前社會熱點難點分析
- 下周工作計劃模板范文(10篇)
- 公司財務及報銷管理制度
- 員工摩托車停放管理制度
- 2025年瀘州市中考數學試卷真題(含答案解析)
- 2025年四川省自貢市中考數學真題含答案
- 2025年安徽省醫師考核管理試題
- 胃管護理操作規范與管理要點
- 堆肥技術課件視頻
- 工廠計件考勤管理制度
- 人文關懷在護理工作中的意義
- 2024北京初三一模英語匯編:材料作文
- T/CCMA 0137-2022防撞緩沖車
- GB/T 20854-2025金屬和合金的腐蝕循環暴露在鹽霧、“干”和“濕”條件下的加速試驗
- 麻風病知識講座課件
評論
0/150
提交評論