操作系統(tǒng)組隊討論linux和unix的進程管理_第1頁
操作系統(tǒng)組隊討論linux和unix的進程管理_第2頁
操作系統(tǒng)組隊討論linux和unix的進程管理_第3頁
操作系統(tǒng)組隊討論linux和unix的進程管理_第4頁
操作系統(tǒng)組隊討論linux和unix的進程管理_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、進 程 管理 第四組LINUXUNIX 成員黃景禧方永樂張善達周海橋肖琪成尹翔吳繼超進程控制塊(PCB)進程屬性的動態(tài)描述(PCB在Linux中對應task_struct,也稱為PD;PCB在Unix中對應于proc和user結構)基本信息組成進程標識(PID、父進程ID、家族關系、用戶ID)處理器狀態(tài)及現(xiàn)場(寄存器狀態(tài)、堆棧等)進程控制信息(狀態(tài)、優(yōu)先權、資源情況等)Linux PCB(1)的內(nèi)容及用途Linux系統(tǒng)中的PCB在Linux中,任務和進程是同一概念Linux中的PCB即任務數(shù)據(jù)結構:task_strcut,也稱為進程描述符PD (Processor Descriptor)定義在

2、include/linux/sched.h中Linux PCB(2)的內(nèi)容及用途Linux PCB(task_struct)包含進程所有信息task_struct數(shù)據(jù)結構很龐大,但并不復雜,按功能將所有域劃分:1、進程狀態(tài)(State) 2、進程調度信息(Scheduling Information)3、各種標識符(Identifiers)4、進程通信有關信息(IPC:Inter_Process Communication)5、時間和定時器信息(Times and Timers)6、進程鏈接信息(Links)7、文件系統(tǒng)信息(File System)8、虛擬內(nèi)存信息(Virtual Memor

3、y)9、頁面管理信息(page)10、對稱多處理器(SMP)信息11、和處理器相關的環(huán)境(上下文)信息(Processor Specific Context)12、其它信息 Linux PCB(3)進程狀態(tài)的設置、含義及轉換情況進程狀態(tài)state在Linux中任何進程,都處于6種狀態(tài)之一進程狀態(tài):1、運行態(tài)或就緒態(tài)(可運行態(tài)),TASK_RUNNING(0)等待態(tài)2、可中斷等待態(tài),TASK_INTERRUPTIBLE(1)3、不可中斷等待態(tài),TASK_UNINTERRUPTIBLE (2)4、僵死態(tài),TASK_STOPPED (4)5、暫停態(tài),TASK_ZOMBIE (8)6、死亡態(tài),TASK

4、_DEAD (16)取值與Unix系統(tǒng)有差異!Linux PCB(4)可運行狀態(tài)進程正在運行(運行態(tài))、或者正準備運行(就緒態(tài))正在運行的進程就是當前進程準備運行的進程只要得到CPU就可以立即投入運行,CPU是這些進程唯一等待的系統(tǒng)資源可中斷等待態(tài)、不可中斷等待態(tài)進程正等待某個事件(event)或某個資源一定處于系統(tǒng)中的某個等待隊列(wait_queue)中兩種等待態(tài)的差異:可中斷等待態(tài):可被信號喚醒,被喚醒后進入可運行態(tài),等待被調度;不可中斷等待態(tài):因等待硬件資源,如某個通道、端口等,在任何情況下都不能被打斷,直到資源滿足。資源滿足后只能用特定的方式來喚醒它,例如喚醒函數(shù)wake_up()等

5、 Linux PCB(5)暫停狀態(tài)進程暫時停止運行以接受某種特殊處理通常當進程接收到SIGSTOP、SIGTSTP、SIGTTIN或 SIGTTOU信號后就處于這種狀態(tài)(關于信號,將在第4章講)例如,正接受調試的進程就處于這種狀態(tài) 僵死狀態(tài)進程執(zhí)行了exit()函數(shù)后進入該狀態(tài),即進程被終止此狀態(tài)將由父進程執(zhí)行wait()系統(tǒng)調用而“喚醒”,真正終止該進程,并回收其資源處于該狀態(tài)的進程是死進程,屬于系統(tǒng)中的垃圾,必須進行相應處理以釋放其占用的資源 死亡狀態(tài):僵死進程被父進程回收后的狀態(tài)Linux的進程狀態(tài)之間的轉換情況linux優(yōu)先級的設置方法linux案例撤銷進程(1)撤銷進程的主要事務釋放

6、占用資源,占用CPU時間累計到父進程刪除進程表中的該進程,釋放PCB轉進程調度被撤銷的進程,不可能轉任何進程狀態(tài)被撤銷的進程生命周期結束進程撤銷的系統(tǒng)調用【exit(status)】不返回值Linux中的進程撤銷exit()函數(shù)將進程設置為“僵死”狀態(tài)釋放其所占用的資源向父進程發(fā)進程“死”信號status無返回值,父進程用wait()回收其占用CPU時間linux案例撤銷進程(2)子進程終止,OS需做的工作關閉軟中斷回收資源(文件、內(nèi)存、結構、i結點等)記錄相關數(shù)據(jù)(如占用CPU時間)置該進程為“僵死”狀態(tài),并向父進程發(fā)軟中斷信號轉進程調度Linux中的進程撤銷(終止)函數(shù)exit()定義在k

7、ernel/exit.c中:int sys_exit(int error_code)do_exit(error_code&0 xff)8);參考源碼exit.c中的do_exit()定義進程執(zhí)行程序do_ execve執(zhí)行流程進程執(zhí)行程序(即do_execve()實現(xiàn)過程)int do_execve(char * filename, char * argv, char * envp, struct pt_regs * regs) /* 參數(shù)filename,argv,envp分別代表著要執(zhí)行文件的文件名,命令行參數(shù),環(huán)境串 */struct linux_binprm bprm; /* 將運行可

8、執(zhí)行文件時所需的信息組織到一起 */struct file *file;int retval;int i;file = open_exec(filename); /* 找到并打開給定的可執(zhí)行程序文件,open_exec()返回file結構指針,代表著讀入可執(zhí)行文件的上下文 */retval = PTR_ERR(file); /* 強制轉換,此內(nèi)容查詢“文件名到索引節(jié)點的查找”案例分析 */if (IS_ERR(file) /* open_exec()返回的是無效指針 */return retval; /* 返回無效的指針 */ /* 填充linux_binprm結構 */bprm.p = PA

9、GE_SIZE*MAX_ARG_PAGES-sizeof(void *); /* 將當前頁最高地址設置成所有頁面總和減去一個指針的大小*/memset(bprm.page, 0, MAX_ARG_PAGES*sizeof(bprm.page0); /* 將page指針數(shù)組初始化成全0 */bprm.file = file; /* 要執(zhí)行的文件 */bprm.filename = filename; /* 要執(zhí)行的文件的名字 */bprm.sh_bang = 0; /* 假定為二進制文件 */bprm.loader = 0; bprm.exec = 0; /* 暫設0 */if (bprm.ar

10、gc = count(argv, bprm.p / sizeof(void *) 0) /* 命令行參數(shù)個數(shù)進行統(tǒng)計 */allow_write_access(file); /* 若count()失敗,調用allow_write_access()防止其他進程在讀入可執(zhí)行文件期間通過內(nèi)存映射改變它的內(nèi)容 */fput(file); /* 遞減file文件中的共享計數(shù) */return bprm.argc; /* 返回 */if (bprm.envc = count(envp, bprm.p / sizeof(void *) 0) /* 環(huán)境變量個數(shù)進行統(tǒng)計 */allow_write_acces

11、s(file); /* 若count()失敗,調用allow_write_access()防止其他進程在讀入可執(zhí)行文件期間通過內(nèi)存映射改變它的內(nèi)容 */fput(file); /* 遞減file文件中的共享計數(shù) */return bprm.envc; /* 返回 */retval = prepare_binprm(&bprm); /* 從可執(zhí)行文件中讀入開頭的128個字節(jié)到linux_binprm結構brmp中的緩沖區(qū) */if (retval 0) /* */goto out; retval = copy_strings_kernel(1, &bprm.filename, &bprm); /

12、* 將文件名拷貝到新分配的頁面中 */if (retval 0) goto out; /* 若出錯 */bprm.exec = bprm.p;retval = copy_strings(bprm.envc, envp, &bprm); /* 將環(huán)境變量拷貝到新分配的頁面中 */if (retval 0) goto out; /* 若出錯 */retval = copy_strings(bprm.argc, argv, &bprm); /* 將命令行參數(shù)拷貝到新分配的頁面中 */if (retval = 0)return retval;/* 運行成功 *out:/* 發(fā)生錯誤,返回inode,并

13、釋放資源 */allow_write_access(bprm.file);/* 調用allow_write_access()防止其他進程在讀入可執(zhí)行文件期間通過內(nèi)存映射改變它的內(nèi)容 */if (bprm.file)fput(bprm.file); /* 遞減file文件中的共享計數(shù) */for (i = 0 ; i active_mm);/current進程的active_mm為空,出錯 need_reshced_back; prev=current;/變量初始化 this_cpu = prev-processor; (unlikely(in_interrupt() printk(Schedu

14、ling in interruptn); BUG(); /不能再中斷程序中執(zhí)行schedule(),否則會出錯 release_kernel_lock(prev, this_cpu); sched_data = & aligned_datathis_cpu.schedule_data; spin_lock_irq(&runqueue_lock);/釋放內(nèi)核鎖,開this_cpu中斷,并鎖住runqueue隊列 if (unlikely(prev-policy = SCHED_RR)/是否為輪轉調度 if (!prev-counter) prev-counter = NICE_TO_TICKS(

15、prev-nice); move_last_runqueue(prev); /prev-counter為逐漸減少的進程時間配額,當為0時就從當前位置到runqueue的末尾。NICE_TO_TICKS將優(yōu)/先級別換算為時間配額,即恢復開始的時間配額 switch (prev-state) case TASK_INTERRUPTIBLE: if(signal_pending(prev) prev-state = TASK_RUNNING; break; /查看當前狀態(tài),如果處于TASK_INTERRUPTIBLE且有信號等待處理,內(nèi)核將狀態(tài)設置為TASK_RUNNING,/讓其處理完 defau

16、lt: del_from_runqueue(prev); case TASK_RUNNING:; prev-need_resched = 0;/如果沒有信號等待,從等待隊列撤出;如果處在TASK_RUNNING繼續(xù)進行 repeat_schedule: next = idle_task(this_cpu);/指向最佳候選 c = -1000;/進程的綜合權值 list_for_each(tmp, &runqueue_head) p = list_entry(tmp, struct task_struct, run_list); if (can_schedule(p, this_cpu) int

17、 weight = goodness(p, this_cpu, prev-active_mm); if (weight c)/比較權值 c = weight, next = p; /調度之前將要調度的進程默認為0號,權值為-1000。0號進程即不會睡眠,也不會死亡。內(nèi)核遍歷可執(zhí)行隊列runqueue的每個進程,用godness計算權值,然后進行比較if (unlikely(!c) structtask_struct *p; spin_unlock_irq(&runqueue_lock);/鎖住runqueue read_lock(&tasklist_lock);/鎖住進程的tasklist f

18、or_each_task(p)/對每個進程執(zhí)行操作 p-counter = (p-counter 1) + NICE_TO_TICKS(p-nice); read_unlock(&tasklist_lock); spin_lock_irq(&runqueue_lock); goto repeat_schedule; /若c為0,說明運行隊列中的所有權值都為0,要重新分配 sched_data-curr = next; task_set_cpu(next, this_cpu); spin_unlock_irq(&runqueue_lock);/對隊列解鎖,開中斷 if (unlikely(pre

19、v = next) prev-policy &= SCHED_YIELD; goto same_process; /如果選中是原來進程,則另外執(zhí)行操作 #ifdef CONFIG_SMP sched_data-last_schedule = get_cycles(); #endif /* CONFIG_SMP */ kstat.context_swtch+; prepare_to_switch(); struct mm_struct *mm = next-mm; struct mm_struct *oldmm = prev-active_mm; if (!mm) BUG_ON(next-act

20、ive_mm); next-active_mm = oldmm; atomic_inc(&oldmm-mm_count); enter_lazy_tlb(oldmm, next, this_cpu); else BUG_ON(next-active_mm != mm); switch_mm(oldmm, mm, next, this_cpu); /開始進程切換,如果是內(nèi)核線程,借用prev的地址空間,如果是一般進程,切換到next的用戶空間 if (!prev-mm) prev-active_mm = NULL; mmdrop(oldmm); /如果是內(nèi)核線程,則釋放地址空間,將mm_stru

21、ct的共享計數(shù)減一。 switch_to(prev, next, prev); _schedule_tail(prev); same_process: reacquire_kernel_lock(current); if (!prev-mm) prev-active_mm = NULL; mmdrop(oldmm); /如果是內(nèi)核線程,則釋放地址空間,將mm_struct的共享計數(shù)減一。 switch_to(prev, next, prev); _schedule_tail(prev); same_process: reacquire_kernel_lock(current); linux案例

22、進程喚醒call signal_wake_up () 函數(shù)去喚醒 目標進程: static int deliver_signal(int sig, struct siginfo *info, struct task_struct*t)/遞送信號int retval = send_signal(sig, info, &t-pending);/add the sigqueue into the pending queue , set the reponding bit 1 /diliver signal success and not blocked this signal if (!retval

23、 & !sigismember(&t-blocked, sig) /the processhavent be masked signal_wake_up(t);/if the process is TASK_INTERRUPTIBLE , wake up it return retval;linux案例進程喚醒static inline void signal_wake_up(struct task_struct *t)t-sigpending = 1;/this process has signal to handle/略去了對SMP的處理if (t-state & TASK_INTERRU

24、PTIBLE) /可以被signal喚醒的進程狀態(tài)wake_up_process(t);return;UNIXUnix PCB的內(nèi)容及用途Unix的PCB分兩部分(proc + user)Proc結構標識進程的狀態(tài)用的狀態(tài)位。UNIX System 共有9 個狀態(tài)編碼。(2) 若干用戶標識號,簡稱UID 或用戶ID。這些用戶標識號指出該進程屬于哪一組用戶,具有何種特權,例如是否可以互相發(fā)送軟中斷等等。(3) 若干進程標識號,簡稱PID 或進程ID,說明進程相互間的關系。(4) 存儲區(qū)位置和長度,指明進程在內(nèi)存或在外存中的位置及大小。這些信息在進程換入換出,以及狀態(tài)轉換等時用到。(5) 調度參數(shù),包括優(yōu)先數(shù)等。核心用它們決定進程轉換到核心態(tài)和用戶態(tài)的次序以及占有處理機的次序。Unix PCB的內(nèi)容及用途(6) 軟中斷信號項,記錄發(fā)向一個進程的所有未處理的軟中斷信號。(7) 各種計時項,給出進程執(zhí)行時間和系統(tǒng)資源的利用情況。這些信息用來為進程計賬、計算調度優(yōu)先權,以及發(fā)

溫馨提示

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

評論

0/150

提交評論