進程管理分析報告_第1頁
進程管理分析報告_第2頁
進程管理分析報告_第3頁
進程管理分析報告_第4頁
進程管理分析報告_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

成績(2011-2012學年秋季學期)論文題目:進程管理分析報告課程名稱:操作系統(tǒng)課設(shè)任課教師:班級:學號:姓名:目錄TOC\o"1-3"\h\u22353進程管理分析報告 216137一、概念理解 213371.1什么是進程 2235081.2狀態(tài)轉(zhuǎn)換圖 3145731.3模式轉(zhuǎn)換 3106431.4軟中斷的實現(xiàn)機理和作用 3327071.5進程調(diào)度的基本思想 31276二、進程的創(chuàng)建與結(jié)束分析 475242.1進程的創(chuàng)建:TASK_RUNNING 4239682.1.1FORK.C注釋分析 4152382.2進程的結(jié)束:終止current進程 521813三、進程調(diào)度與切換分析 61153.1進程的調(diào)度schedule() 678183.2進程的切換 727553.2.1進程在TASK_RUNNING以及TASK_UNINTERRUPTIBLE、TASK_INTERRUPTIBLE之間轉(zhuǎn)換 7165913.2.2進程在TASK_RUNNING->TASK_STOPPED的轉(zhuǎn)換 81013四、鎖機制分析 8190224.1鎖機制 818641五、心得體會 95585六、參考文獻 9進程管理分析報告一、概念理解1.1什么是進程進程執(zhí)行操作系統(tǒng)的任務(wù)。程序是存放在磁盤上的包括一系列機器代碼指令和數(shù)據(jù)的可執(zhí)行的映像,因此是一個被動的實體。進程可以看作是一個執(zhí)行中的計算機程序。它是動態(tài)的實體,在處理機執(zhí)行機器代碼時不斷改變。進程包括處理程序的指令和數(shù)據(jù),以及程序計數(shù)器、其他CPU的寄存器和包括臨時數(shù)據(jù)(例如:例程參數(shù)、返回地址和保存的變量)的堆棧。當前執(zhí)行的程序,或者說進程,包括微處理器中所有的當前活動。進程是操作系統(tǒng)的最小調(diào)度單位。1.2狀態(tài)轉(zhuǎn)換圖1.3模式轉(zhuǎn)換當對處理機進行切換時,會發(fā)生兩對上下文切換操作。在第一對上下文切換時,操作系統(tǒng)將保存當前進程的上下文,而裝入分派程序的上下文,以便分派程序運行;在第二對上下文切換時,將移出分派程序,而把新選進程的CPU現(xiàn)場信息裝入到處理機的各個相應(yīng)寄存器中。1.4軟中斷的實現(xiàn)機理和作用軟中斷是通訊進程之間用來模擬硬中斷的一種信號通訊方式。

中斷源發(fā)中斷請求或軟中斷信號后,CPU或接收進程在適當?shù)臅r機自動進行中斷處理或完成軟中斷信號對應(yīng)的功能

軟中斷是軟件實現(xiàn)的中斷,也就是程序運行時其他程序?qū)λ闹袛啵欢仓袛嗍怯布崿F(xiàn)的中斷,是程序運行時設(shè)備對它的中斷。

作用有3如下。1.軟中斷發(fā)生的時間是由程序控制的,而硬中斷發(fā)生的時間是隨機的

2.軟中斷是由程序調(diào)用發(fā)生的,而硬中斷是由外設(shè)引發(fā)的

3.硬件中斷處理程序要確保它能快速地完成它的任務(wù),這樣程序執(zhí)行時才不會等待較長時間1.5進程調(diào)度的基本思想有三種情況會進行進程調(diào)度。1時間片到,即每個進程所分配的時間片用完后,要跳轉(zhuǎn)到調(diào)度程序;2占用CPU的當前運行進程提出I/O操作,發(fā)起對內(nèi)核的系統(tǒng)調(diào)用時,在系統(tǒng)調(diào)用結(jié)束后,跳轉(zhuǎn)到調(diào)度程序;3當前運行進程對所有內(nèi)核系統(tǒng)調(diào)用的結(jié)束時都要跳轉(zhuǎn)到調(diào)度程序,根據(jù)當前的調(diào)度信息來決定下一個可以占用CPU的進程.。進程的創(chuàng)建與結(jié)束分析2.1進程的創(chuàng)建:TASK_RUNNING第一個進程在系統(tǒng)啟動時創(chuàng)建,當系統(tǒng)啟動的時候它運行在核心態(tài),這時,只有一個進程:初始化進程。和所有其他進程一樣,初始進程有一組用堆棧、寄存器等等表示的機器狀態(tài)。當系統(tǒng)中的其他進程創(chuàng)建和運行的時候這些信息存在初始進程的task_struct數(shù)據(jù)結(jié)構(gòu)中。進程由do_fork()函數(shù)創(chuàng)建,先申請空間,申請核心堆棧;然后在Task向量表中找到空閑位置;在進行正式初始化以前,將新創(chuàng)建的進程的狀態(tài)都置為TASK_UNINTERRUPTIBLE,以免初始化過程被打斷;開始初始化工作,如初始化進程時鐘、信號、時間等數(shù)據(jù);繼承父進程的資源,如文件、信號量、內(nèi)存等;完成進程初始化后,由父進程調(diào)用wake_up_process()函數(shù)將其喚醒,狀態(tài)變?yōu)門ASK_RUNNING,掛到就緒隊列runqueue,返回子進程的pid。2.1.1FORK.C注釋分析intdo_fork(unsignedlongclone_flags,unsignedlongusp,structpt_regs*regs){ 為新進程申請PCB空間; if(申請不到) 返回錯誤,退出; 為新進程申請核心堆棧; if(核心堆棧申請不到) 返回錯誤,退出; 為新進程在Task向量表中找到空閑位置;/*復(fù)制父進程currentPCB中的信息,繼承current的資源*/;p=current; 在進行正式初始化以前,將新創(chuàng)建的進程的狀態(tài)都置為TASK_UNINTERRUPTIBLE,以免初始化過程被打斷,并置一些標志位./*為防止信號、定時中斷誤喚醒未創(chuàng)建完畢的進程,將子進程的狀態(tài)設(shè)成不可中斷的*/ p->state=TASK_UNINTERRUPTIBLE;/*跟蹤狀態(tài)和超級用戶特權(quán)是沒有繼承性的,因為在root用戶為普通用戶創(chuàng)建進程時,出于安全考慮這個普通用戶的進程不允許擁有超級用戶特權(quán)。*/ p->flags&=~(PF_PTRACED|PF_TRACESYS|PF_SUPERPRIV);/*將進程標志設(shè)成初建,在進程第一次獲得CPU時,內(nèi)核將根據(jù)此標志進行一定操作*/ p->flags|=PF_FORKNOEXEC;開始Task_struct的初始化工作,如初始化進程時鐘、信號、時間等數(shù)據(jù);繼承父進程所有資源: 拷貝父進程當前打開的文件; 拷貝父進程在VFS的位置; 拷貝父進程的信號量; 拷貝父進程運行的內(nèi)存; 拷貝父進程的線程; 初始化工作結(jié)束,父進程將其將其喚醒,掛入running隊列中,返回子進程的pid;}2.2進程的結(jié)束:終止current進程進程終止由可終止進程的系統(tǒng)調(diào)用通過調(diào)用do_exit()實現(xiàn),do_exit()終止current進程,首先為current進程做上PF_EXITING的標記,釋放current進程的存儲管理信息、文件系統(tǒng)、文件信息、信號響應(yīng)函數(shù)指針數(shù)組,將狀態(tài)置成TASK_ZOMBIE,通知current的父進程,最后進行重新調(diào)度。do_exit()帶一個參數(shù)code,用于傳遞終止進程的原因。2.2.1do_exit(longcode)流程(1)如果進程在中斷服務(wù)程序中調(diào)用do_exit(),則打印提示信息 (2)記錄進程的記帳信息(3)進程標志置為PF_EXITING(4)釋放定時器鏈表 (5)釋放臨界區(qū)數(shù)據(jù) (6)將消息隊列中和current進程有關(guān)項刪除 (7)釋放進程的存儲管理信息 (8)釋放進程已打開文件的信息 (9)釋放進程的文件系統(tǒng) (10)釋放進程的信號響應(yīng)函數(shù)指針數(shù)組等管理信息 (11)釋放進程的LDT (12)進程狀態(tài)置為TASK_ZOMBIE (13)置上退出信息,通知所有進程親戚,它要退出了# (14)exec_domain結(jié)構(gòu)共享計數(shù)減1,binfmt結(jié)構(gòu)共享計數(shù)減1(15)重新調(diào)度,將current進程從run-queue中刪除,交出CPUexit_notify()函數(shù)向所有和current進程有關(guān)的進程發(fā)相應(yīng)的消息,以便它們開展工作,exit_notify()還判斷cueernt進程所在組是否會因current進程的退出而懸空,如果懸空并且組內(nèi)有stopped狀態(tài)的進程則發(fā)信號;同時進行一系列的指針調(diào)整,調(diào)整因current進程的死亡引起的進程關(guān)系轉(zhuǎn)變。exit_notify()流程:將所有原始進程為current的進程變成init進程的孫子。如果父進程和current進程不在同一組,但在同一session內(nèi)并且current進程組內(nèi)所有進程的父進程和它在同一組,也就是說,current進程所在組會因current的退出而懸掛,同時current進程所在組內(nèi)有stopped進程,就向整個組發(fā)SIGHUP和SIGCONT信號。通知父進程進程死了。調(diào)整所有current進程的子進程的父進程指針,將它們掛到它們的原始進程下,將以往的跟蹤被跟蹤歷史清除,調(diào)整它和新的兄弟的關(guān)系;檢查每一個current進程的子進程所在的組是否會懸掛,如果子進程和current進程不在同一組,并且這個組已懸掛,組內(nèi)有stopped的進程,就向組員發(fā)SIGHUP和SIGCONT信號。 (5)如果current進程是session的主管,就和它所控制的tty脫離,向current進程顯示終端所在的組發(fā)SIGHUP和SIGCONT信號。進程直接或間接地調(diào)用do_exit()后,進程進入ZOMBIE狀態(tài),還有一塊PCB未釋放。PCB的釋放必須由它的父進程執(zhí)行,當父進程調(diào)用sys_wait4()時釋放進入ZOMBIE狀態(tài)的子進程的PCB。進程調(diào)度與切換分析3.1進程的調(diào)度schedule()處于TASK_RUNNING狀態(tài)的進程移到runqueue,會由schedule()按CPU調(diào)度算法在合適的時候選中,分配給CPU。新創(chuàng)建的進程都是處于TASK_RUNNING狀態(tài),而且被掛到runqueue的隊首。進程調(diào)度采用變形的輪轉(zhuǎn)法(roundrobin)。當時間片到時(10ms的整數(shù)倍),由時鐘中斷引起新一輪調(diào)度,把當前進程掛到runqueue隊尾。需要調(diào)度程序選擇系統(tǒng)中所有可以運行的進程中最值得的進程。一個可以運行的進程是一個只等待CPU的進程。Linux使用合理而簡單的基于優(yōu)先級的調(diào)度算法在系統(tǒng)當前的進程中進行選擇。當它選擇了準備運行的新進程,它就保存當前進程的狀態(tài)、和處理器相關(guān)的寄存器和其他需要保存的上下文信息到進程的task_struct數(shù)據(jù)結(jié)構(gòu)中。然后恢復(fù)要運行的新的進程的狀態(tài)(又和處理器相關(guān)),把系統(tǒng)的控制交給這個進程。為了公平地在系統(tǒng)中所有可以運行(runnable)的進程之間分配CPU時間,調(diào)度程序在每一個進程的task_struct結(jié)構(gòu)中保存了信息。policy進程的調(diào)度策略:Linux有兩種類型的進程:普通和實時。實時進程比所有其它進程的優(yōu)先級高。如果有一個實時的進程準備運行,那么它總是先被運行。實時進程有兩種策略:環(huán)或先進先出(roundrobinandfirstinfirstout)。在環(huán)的調(diào)度策略下,每一個實時進程依次運行,而在先進先出的策略下,每一個可以運行的進程按照它在調(diào)度隊列中的順序運行,這個順序不會改變。Priority進程的調(diào)度優(yōu)先級。也是它允許運行的時候可以使用的時間量(jiffies)。你可以通過系統(tǒng)調(diào)用或者renice命令來改變一個進程的優(yōu)先級。Rt_priorityLinux支持實時進程。這些進程比系統(tǒng)中其他非實時的進程擁有更高的優(yōu)先級。這個域允許調(diào)度程序賦予每一個實時進程一個相對的優(yōu)先級。實時進程的優(yōu)先級可以用系統(tǒng)調(diào)用來修改Coutner這時進程可以運行的時間量(jiffies)。進程啟動的時候等于優(yōu)先級(priority),每一次時鐘周期遞減。調(diào)度程序schedule()從核心的多個地方運行。它可以在把當前進程放到等待隊列之后運行,也可以在系統(tǒng)調(diào)用之后進程從系統(tǒng)態(tài)返回進程態(tài)之前運行。需要運行調(diào)度程序的另一個原因是系統(tǒng)時鐘剛好把當前進程的計數(shù)器(counter)置成了0。每一次調(diào)度程序運行它做以下工作:(1)kernelwork調(diào)度程序運行bottomhalfhandler并處理系統(tǒng)的調(diào)度任務(wù)隊列。(2)Currentpocess在選擇另一個進程之前必須處理當前進程。(3)如果當前進程的調(diào)度策略是環(huán)則它放到運行隊列的最后。(4)如果任務(wù)狀態(tài)是TASK_INTERRUPTIBLE的而且它上次調(diào)度的時候收到過一個信號,它的狀態(tài)變?yōu)門ASK_RUNNING;如果當前進程超時,它的狀態(tài)成為RUNNING;如果當前進程的狀態(tài)為RUNNING則保持此狀態(tài);不是RUNNING或者INTERRUPTIBLE的進程被從運行隊列中刪除。這意味著當調(diào)度程序查找最值得運行的進程時不會考慮這樣的進程。(5)ProcessSelection調(diào)度程序查看運行隊列中的進程,查找最值得運行的進程。如果有實時的進程(具有實時調(diào)度策略),就會比普通進程更重一些。普通進程的重量是它的counter,但是對于實時進程則是counter加1000。這意味著如果系統(tǒng)中存在可運行的實時進程,就總是在任何普通可運行的進程之前運行。當前的進程,因為用掉了一些時間片(它的counter減少了),所以如果系統(tǒng)中由其他同等優(yōu)先級的進程,就會處于不利的位置:這也是應(yīng)該的。如果幾個進程又同樣的優(yōu)先級,最接近運行隊列前段的那個就被選中。當前進程被放到運行隊列的后面。如果一個平衡的系統(tǒng),擁有大量相同優(yōu)先級的進程,那么回按照順序執(zhí)行這些進程。這叫做環(huán)型調(diào)度策略。不過,因為進程需要等待資源,它們的運行順序可能會變化。(6)SwapProcesses如果最值得運行的進程不是當前進程,當前進程必須被掛起,運行新的進程。當一個進程運行的時候它使用了CPU和系統(tǒng)的寄存器和物理內(nèi)存。每一次它調(diào)用例程都通過寄存器或者堆棧傳遞參數(shù)、保存數(shù)值比如調(diào)用例程的返回地址等。因此,當調(diào)度程序運行的時候它在當前進程的上下文運行。它可能是特權(quán)模式:核心態(tài),但是它仍舊是當前運行的進程。當這個進程要掛起時,它的所有機器狀態(tài),包括程序計數(shù)器(PC)和所有的處理器寄存器,必須存到進程的task_struct數(shù)據(jù)結(jié)構(gòu)中。然后,必須加載新進程的所有機器狀態(tài)。這種操作依賴于系統(tǒng),不同的CPU不會完全相同地實現(xiàn),不過經(jīng)常都是通過一些硬件的幫助。(7)交換出去進程的上下文發(fā)生在調(diào)度的最后。前一個進程存儲的上下文,就是當這個進程在調(diào)度結(jié)束的時候系統(tǒng)的硬件上下文的快照。相同的,當加載新的進程的上下文時,仍舊是調(diào)度結(jié)束時的快照,包括進程的程序計數(shù)器和寄存器的內(nèi)容。(8)如果前一個進程或者新的當前進程使用虛擬內(nèi)存,則系統(tǒng)的頁表需要更新。同樣,這個動作適合體系結(jié)構(gòu)相關(guān)。AlphaAXP處理器,使用TLT(TranslationLook-asideTable)或者緩存的頁表條目,必須清除屬于前一個進程的緩存的頁表條目。3.2進程的切換3.2.1進程在TASK_RUNNING以及TASK_UNINTERRUPTIBLE、TASK_INTERRUPTIBLE之間轉(zhuǎn)換獲得CPU而正在運行的進程會由于某些原因,比如:申請不到某個資源,其狀態(tài)會從TASK_RUNNING變?yōu)門ASK_INTERRUPTIBLE或TASK_UNINTERRUPTIBLE的等待狀態(tài)。同樣在經(jīng)歷了某些情況,處于等待狀態(tài)的進程會被重新喚醒,等待分配給CPU。3.2.2進程在TASK_RUNNING->TASK_STOPPED的轉(zhuǎn)換TASK_STOPPED狀態(tài)是一種暫停狀態(tài),和TASK_STOPPED狀態(tài)配合工作的標志為PF_PTRACED和PF_TRACESYS,分別表示被跟蹤和正在跟蹤系統(tǒng)調(diào)用,一個是被動的,一個是主動的。進程可通過兩種途徑進入TASK_STOPPED狀態(tài):1).受其它進程的syscall_trace()系統(tǒng)調(diào)用的控制而暫時將CPU交給控制進程。2).收到要求它暫停的信號鎖機制分析4.1鎖機制lock_…();unlock_…();wait_on_…():TASK_RUNNING->TASK_UNINTERRUPTIBLE;進程在RUNNING,WAITING狀態(tài)間轉(zhuǎn)換時,鎖機制也是Linux中解決進程之間共享資源的一個方法。鎖就是在資源的結(jié)構(gòu)定義中加入一個鎖成員,或為一個標志位,它的取值可以由多個進程檢驗和設(shè)置。鎖可以用于實現(xiàn)對資源的共享競爭。具體來說當一個進程占用一個資源時,先對其上鎖,然后再進行相關(guān)的操作,如果這時別的進程也要用這個資源,則必須等待這個鎖被解開后,才可以進行下去。但是,鎖僅在某些數(shù)據(jù)結(jié)構(gòu)和資源申請中才會用到,進程在申請某種特定資源時,會調(diào)用相應(yīng)的__wait_on_…函數(shù)來判斷是否該資源已經(jīng)被上鎖,如果未上鎖或已被解鎖,則分配資源給進程,否則進程加入到等待隊列中去。這種類型的申請有:__wait_on_dquot、__wait_on_buffer、__wait_on_inode、__wait_on_page、__wait_on_super等。以buffer_head的加鎖和解鎖操作為例來解釋一下通過鎖機制進行的狀態(tài)轉(zhuǎn)換,在這里要申請buffer_head資源,先要申請到鎖,buffer_head的加鎖和解鎖就是通過置位和復(fù)位bh->b_state來實現(xiàn)的://申請資源時將該緩沖區(qū)上鎖,置鎖位,如果申請不到,睡眠在等待隊列上,等待該鎖的釋放。externinlinevoidlock_buffer(structbuffer_head*bh){}//資源釋放時,清該緩沖區(qū)鎖位,并喚醒等待隊列上的進程,參與競爭資源。voidunlock_buffer(structbuffer_head*bh){ }//檢驗該鎖位是否已經(jīng)置位staticinlineintbuffer_locked(structbuffer_head*bh){}五、心得體會以上是我總結(jié)的在Linux系統(tǒng)中進程從創(chuàng)建到死亡的整個生命周期中,有可能經(jīng)歷的狀態(tài)轉(zhuǎn)換,分析了這些狀態(tài)轉(zhuǎn)換發(fā)生的條件、原因、方式。Linux中對進程狀態(tài)的管理通過將進程分成六種狀態(tài):TASK_RUNNING、TASK_INTERRUPTIBLE、TASK_UNINTERRUPTIBLE 、TASK_ZOMBIE、TAS

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論