操作系統(tǒng)第五組-進(jìn)程管理_第1頁
操作系統(tǒng)第五組-進(jìn)程管理_第2頁
操作系統(tǒng)第五組-進(jìn)程管理_第3頁
操作系統(tǒng)第五組-進(jìn)程管理_第4頁
操作系統(tǒng)第五組-進(jìn)程管理_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、操作系統(tǒng)進(jìn)程管理(linux、unix)高慶波張昊明周佳琪周 森王正爽第五組:進(jìn)程控制塊(PCB)進(jìn)程屬性的動態(tài)描述(PCB在Linux中對應(yīng)task_struct,也稱為PD;PCB在Unix中對應(yīng)于proc和user結(jié)構(gòu))基本信息組成:進(jìn)程標(biāo)識(PID、父進(jìn)程ID、家族關(guān)系、用戶ID)處理器狀態(tài)及現(xiàn)場(寄存器狀態(tài)、堆棧等)進(jìn)程控制信息(狀態(tài)、優(yōu)先權(quán)、資源情況等)PCB的內(nèi)容及用途UNIX:Proc結(jié)構(gòu)(1)標(biāo)識進(jìn)程的狀態(tài)用的狀態(tài)位。UNIX System 共有9 個狀態(tài)編碼。(2)若干用戶標(biāo)識號,簡稱UID 或用戶ID。這些用戶標(biāo)識號指出該進(jìn)程屬于哪一組用戶,具有何種特權(quán),例如是否可以互相

2、發(fā)送軟中斷等等。(3)若干進(jìn)程標(biāo)識號,簡稱PID 或進(jìn)程ID,說明進(jìn)程相互間的關(guān)系。(4)存儲區(qū)位置和長度,指明進(jìn)程在內(nèi)存或在外存中的位置及大小。這些信息在進(jìn)程換入換出,以及狀態(tài)轉(zhuǎn)換等時用到。(5)調(diào)度參數(shù),包括優(yōu)先數(shù)等。核心用它們決定進(jìn)程轉(zhuǎn)換到核心態(tài)和用戶態(tài)的次序以及占有處理機(jī)的次序。PCB的內(nèi)容及用途(6)軟中斷信號項(xiàng),記錄發(fā)向一個進(jìn)程的所有未處理的軟中斷信號。(7)各種計(jì)時項(xiàng),給出進(jìn)程執(zhí)行時間和系統(tǒng)資源的利用情況。這些信息用來為進(jìn)程計(jì)賬、計(jì)算調(diào)度優(yōu)先權(quán),以及發(fā)送計(jì)時信號等。(8)user結(jié)構(gòu)的起始地址項(xiàng)。(9)進(jìn)程頁表指針,用于CPU 訪問內(nèi)存時的地址變換。UNIX:Proc結(jié)構(gòu)PCB的

3、內(nèi)容及用途(1)指向proc結(jié)構(gòu)的指針,標(biāo)識出對應(yīng)于該user結(jié)構(gòu)的proc結(jié)構(gòu)。(2)一個含有系統(tǒng)調(diào)用結(jié)果的返回值項(xiàng),當(dāng)系統(tǒng)調(diào)用執(zhí)行結(jié)束之后,所得結(jié)果存放該項(xiàng)中以便用戶程序可以使用。(3)與用戶標(biāo)識有關(guān)的若干項(xiàng),它們決定進(jìn)程的各種權(quán)限,如存取權(quán)限等。UNIX:user結(jié)構(gòu)PCB的內(nèi)容及用途(4)文件結(jié)構(gòu)有關(guān)的若干項(xiàng),它們描述文件的當(dāng)前目錄和當(dāng)前根,以及進(jìn)程的文件系統(tǒng)環(huán)境。(5)與文件讀寫有關(guān)的若干項(xiàng),描述所要傳送的數(shù)據(jù)量,在用戶空間的源(或目的)數(shù)據(jù)的數(shù)組地址、讀寫的文件字節(jié)數(shù)、讀寫方式、緩沖區(qū)長度與地址等。UNIX:user結(jié)構(gòu)PCB的內(nèi)容及用途1、進(jìn)程狀態(tài)(State) 2、進(jìn)程調(diào)度信息

4、(Scheduling Information)3、各種標(biāo)識符(Identifiers)4、進(jìn)程通信有關(guān)信息(IPC:Inter_Process Communication)5、時間和定時器信息(Times and Timers)6、進(jìn)程鏈接信息(Links)7、文件系統(tǒng)信息(File System)8、虛擬內(nèi)存信息(Virtual Memory)9、頁面管理信息(page)10、對稱多處理器(SMP)信息11、和處理器相關(guān)的環(huán)境(上下文)信息(Processor Specific Context)12、其它信息 LINUX:task_struct進(jìn)程狀態(tài)UNIXUNIX System 中進(jìn)程

5、共有9 個狀態(tài):進(jìn)程在用戶態(tài)下的執(zhí)行態(tài)。(2) 進(jìn)程在核心態(tài)下的執(zhí)行態(tài)。進(jìn)程是在用戶態(tài)下還是在核心態(tài)下執(zhí)行主要由處理機(jī)狀態(tài)字PSW 來區(qū)別。(3) 進(jìn)程處于就緒態(tài),只要核心程序調(diào)度到它,就可投入執(zhí)行。(4) 進(jìn)程處于就緒態(tài),但交換程序已將其換出內(nèi)存。只有等待交換程序把它換入內(nèi)存之后,核心才能調(diào)度它去執(zhí)行。進(jìn)程狀態(tài)UNIX(5) 進(jìn)程正在睡眠,且駐留在內(nèi)存中的狀態(tài)。(6) 進(jìn)程正在睡眠,但交換程序已將其換出內(nèi)存的狀態(tài)。(7) 進(jìn)程正從核心態(tài)返回用戶態(tài)。但核心搶先于它作了進(jìn)程上下文切換,以調(diào)度別的進(jìn)程執(zhí)行。最后,當(dāng)該進(jìn)程再次被調(diào)度到時返回用戶態(tài)。(8) 進(jìn)程剛被創(chuàng)建時,由于正在進(jìn)行資源分配,因此,

6、既不是就緒態(tài),也不是睡眠態(tài)。這個狀態(tài)可被認(rèn)為是進(jìn)程的初始狀態(tài)。(9) 進(jìn)程執(zhí)行了系統(tǒng)調(diào)用exit后,進(jìn)入僵死狀態(tài)。進(jìn)程狀態(tài)UNIX進(jìn)程狀態(tài)LINUX可運(yùn)行狀態(tài)進(jìn)程正在運(yùn)行(運(yùn)行態(tài))、或者正準(zhǔn)備運(yùn)行(就緒態(tài))。正在運(yùn)行的進(jìn)程就是當(dāng)前進(jìn)程。準(zhǔn)備運(yùn)行的進(jìn)程只要得到CPU就可以立即投入運(yùn)行,CPU是這些進(jìn)程唯一等待的系統(tǒng)資源??芍袛嗟却龖B(tài)、不可中斷等待態(tài)進(jìn)程正等待某個事件(event)或某個資源。一定處于系統(tǒng)中的某個等待隊(duì)列(wait_queue)中。兩種等待態(tài)的差異:可中斷等待態(tài):可被信號喚醒,被喚醒后進(jìn)入可運(yùn)行態(tài),等待被調(diào)度;不可中斷等待態(tài):因等待硬件資源,如某個通道、端口等,在任何情況下都不能被

7、打斷,直到資源滿足。資源滿足后只能用特定的方式來喚醒它,例如喚醒函數(shù)wake_up()等 。進(jìn)程狀態(tài)LINUX暫停狀態(tài)進(jìn)程暫時停止運(yùn)行以接受某種特殊處理。通常當(dāng)進(jìn)程接收到SIGSTOP、SIGTSTP、SIGTTIN或 SIGTTOU信號后就處于這種狀態(tài)。例如,正接受調(diào)試的進(jìn)程就處于這種狀態(tài)。僵死狀態(tài)進(jìn)程執(zhí)行了exit()函數(shù)后進(jìn)入該狀態(tài),即進(jìn)程被終止。此狀態(tài)將由父進(jìn)程執(zhí)行wait()系統(tǒng)調(diào)用而“喚醒”,真正終止該進(jìn)程,并回收其資源。處于該狀態(tài)的進(jìn)程是死進(jìn)程,屬于系統(tǒng)中的垃圾,必須進(jìn)行相應(yīng)處理以釋放其占用的資源。 死亡狀態(tài)僵死進(jìn)程被父進(jìn)程回收后的狀態(tài)。進(jìn)程狀態(tài)LINUX用戶態(tài)運(yùn)行僵死態(tài)zomb

8、ie暫停態(tài)stopped內(nèi)核態(tài)運(yùn)行就緒態(tài)可中斷睡眠態(tài)interruptible不可中斷睡眠態(tài)uninterruptible繼續(xù)暫停中斷、中斷返回返回系統(tǒng)調(diào)用或中斷可中斷睡眠終止exit()喚醒wake_up()調(diào)度schedle()信號或喚醒不可中斷睡眠LINUX進(jìn)程調(diào)度方法Linux內(nèi)核的三種調(diào)度方法:1、SCHED_OTHER 分?jǐn)?shù)調(diào)度策略;2、SCHED_FIFO 實(shí)時調(diào)度策略,先到先服務(wù);3、SCHED_RR 實(shí)時調(diào)度策略,時間片輪轉(zhuǎn)。實(shí)時進(jìn)程將得到優(yōu)先調(diào)用,實(shí)時進(jìn)程根據(jù)實(shí)時優(yōu)先級決定調(diào)度權(quán)值、分時進(jìn)程則通過nice和counter值決定權(quán)值,nice越小、counter越大,被調(diào)度的

9、概率越大,也就是曾經(jīng)使用了cpu最少的進(jìn)程將會得到優(yōu)先調(diào)度。LINUX進(jìn)程調(diào)度方法SCHED_RR和SCHED_FIFO相同點(diǎn):RR和FIFO都只用于實(shí)時任務(wù)。創(chuàng)建時優(yōu)先級大于0(199)。按照可搶占優(yōu)先級調(diào)度算法進(jìn)行。就緒態(tài)的實(shí)時任務(wù)立即搶占非實(shí)時任務(wù)。SCHED_RR和SCHED_FIFO不同點(diǎn):當(dāng)采用SCHED_RR策略的進(jìn)程的時間片用完,系統(tǒng)將重新分配時間片,并置于就緒隊(duì)列尾。放在隊(duì)列尾保證了所有具有相同優(yōu)先級的RR任務(wù)的調(diào)度公平。SCHED_FIFO一旦占用cpu則一直運(yùn)行。一直運(yùn)行到有更高優(yōu)先級任務(wù)到達(dá)或自己放棄。如果有相同優(yōu)先級的實(shí)時進(jìn)程(根據(jù)優(yōu)先級計(jì)算的調(diào)度權(quán)值是一樣的)已經(jīng)準(zhǔn)

10、備好,F(xiàn)IFO時必須等待該進(jìn)程主動放棄才可以運(yùn)行這個優(yōu)先級相同的任務(wù)。而RR可以讓每個任務(wù)都執(zhí)行一段時間。系統(tǒng)中既有分時調(diào)度,又有時間片輪轉(zhuǎn)調(diào)度和先進(jìn)先出調(diào)度:1、RR調(diào)度和FIFO調(diào)度的進(jìn)程屬于實(shí)時進(jìn)程, 以分時調(diào)度的進(jìn)程是非實(shí)時進(jìn)程。2、當(dāng)實(shí)時進(jìn)程準(zhǔn)備就緒后,如果當(dāng)前cpu正在運(yùn)行非實(shí)時進(jìn)程, 則實(shí)時進(jìn)程立即搶占非實(shí)時進(jìn)程。3、RR進(jìn)程和FIFO進(jìn)程都采用實(shí)時優(yōu)先級作為調(diào)度的權(quán)值標(biāo)準(zhǔn),RR是FIFO的一個延伸。FIFO時,如果兩個進(jìn)程的優(yōu)先級一樣,則這兩個優(yōu)先級一樣的進(jìn)程具體執(zhí)行那一個室友其在隊(duì)列的位置決定的,這樣導(dǎo)致一些不公正性,如果將兩個優(yōu)先級一樣的任務(wù)的調(diào)度策略都設(shè)為RR,則保證了這

11、兩個任務(wù)都可以循環(huán)執(zhí)行, 保證了公平。LINUX進(jìn)程調(diào)度方法 Linux案例分析進(jìn)程撤銷將進(jìn)程設(shè)置為“僵死”狀態(tài)釋放其所占用的資源 _exit_mm(tsk): /釋放存儲空間 sem_exit(); /釋放用戶空間的“信號量” _exit_files(tsk); /釋放已經(jīng)打開的文件 _exit_fs(tsk); /釋放用于表示工作目錄等結(jié)構(gòu) exit_sighand(tsk);/釋放信號處理表 向父進(jìn)程發(fā)進(jìn)程“死”信號status無返回值,父進(jìn)程用wait()回收其占用CPU時間 exit_notify(); /通知父進(jìn)程該“退出”消息,父進(jìn)程將負(fù)責(zé)回收這個進(jìn)程描述符 schedule()

12、; /切換到其他進(jìn)程 Linux案例分析進(jìn)程執(zhí)行調(diào)用open_exec()打開可執(zhí)行文件,返回文件管理結(jié)構(gòu)file調(diào)用count()計(jì)算傳遞的程序參數(shù)和環(huán)境參數(shù)數(shù)目調(diào)用prepare_binprm()初始化數(shù)據(jù)結(jié)構(gòu)linux_binprm(),讀取可執(zhí)行程序初始的128字節(jié) Linux案例分析進(jìn)程執(zhí)行調(diào)用copy_stringskernel()和copy_strings()把參數(shù)和環(huán)境變量復(fù)制到數(shù)據(jù)結(jié)構(gòu)linux_binprm內(nèi)調(diào)用search_binary_handler()將可執(zhí)行程序讀入用戶地址空間,在該函數(shù)內(nèi)根據(jù)可執(zhí)行程序初始128字節(jié)中關(guān)鍵字不同,調(diào)用不同的加載接口 Linux案例分

13、析do_execve函數(shù)淺析函數(shù)原型:int do_execve(char * filename, char * argv, char * envp, struct pt_regs * regs)/*參數(shù)filename,argv,envp分別代表著要執(zhí)行文件的文件名,命令行參數(shù),環(huán)境串pt_regs結(jié)構(gòu)體描述了在執(zhí)行系統(tǒng)調(diào)用時,用戶態(tài)下的CPU寄存器在核心態(tài)的棧中的保存情況。 通過這個參數(shù),sys_execve能獲得保存在用戶空間的以下信息:可執(zhí)行文件路徑的指針(regs.ebx中)、命令行參數(shù)的指針(regs.ecx中)和環(huán)境變量的指針(regs.edx中)。 */int do_execv

14、e(char * filename, char * argv, char * envp, struct pt_regs * regs)struct linux_binprm bprm; /* 存放文件執(zhí)行時所需的信息 */file = open_exec(filename); /*找到并打開對應(yīng)文件*/ /* 填充linux_binprm結(jié)構(gòu) */retval = prepare_binprm(&bprm); /* 從可執(zhí)行文件中讀入開頭的128個字節(jié)到linux_binprm結(jié)構(gòu)brmp中的緩沖區(qū) */*將信息拷貝到新分配的頁面*/* 所有準(zhǔn)備工作已經(jīng)完成,所有必要的信息都已經(jīng)搜集到了lin

15、ux_binprm結(jié)構(gòu)中的bprm中 */retval = search_binary_handler(&bprm,regs); /* 調(diào)用search_binary_handler()裝入并運(yùn)行目標(biāo)程序,根據(jù)讀入數(shù)據(jù)結(jié)構(gòu)linux_binprm內(nèi)的二進(jìn)制文件128字節(jié)頭中的關(guān)鍵字,決定調(diào)用哪種加載函數(shù) */*成功則返回成功標(biāo)記, 失敗則釋放資源并返回失敗標(biāo)記*/ Linux案例分析進(jìn)程調(diào)度進(jìn)程調(diào)度函數(shù)schedule()分析 一主要功能: 實(shí)現(xiàn)進(jìn)程的調(diào)度,從運(yùn)行隊(duì)列的鏈表中找到一個進(jìn)程,然后進(jìn)行分配??梢杂蓭讉€內(nèi)核控制路徑調(diào)用。 二調(diào)用方式: 1.當(dāng)前進(jìn)程不能獲得必要資源而被阻塞,可以直接調(diào)

16、用schedule()。將current進(jìn)程插入適當(dāng)?shù)牡却?duì)列,把狀態(tài)改為TASK_INTERRUPTABLE或TASK_UNINTERRUPTABLE,然后調(diào)用schedule()。一旦資源可用,就從等待隊(duì)列刪除current進(jìn)程。 2.把current進(jìn)程的TIF_NEED_RESCHED標(biāo)志設(shè)置為1,由于會在恢復(fù)前檢查這個標(biāo)志的值,所以schedule()將在之后某個時間被明確調(diào)用,以延遲方式調(diào)用調(diào)度程序。asmlinkage void schedule(void)/*定義變量*/need_resched:if (unlikely(preempt_get_count() & PREEMPT_ACTIVE) /表明當(dāng)前進(jìn)程是否可以搶占goto pick_next_task; /可搶占就去選擇最合適的進(jìn)程pick_next_task:/選擇一個最合適的進(jìn)程idx = sched_find_first_bit(array-bitmap); /找到第一個優(yōu)先級最高的那個indexqueue = array-queue + idx; /指向選中程序next = list_entry(queue-next, task_t, run_list); /取出選中程序switch_tasks:/進(jìn)程切換 Linux案例

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論