課件Linux操作系統(tǒng)分析.ppt_第1頁
課件Linux操作系統(tǒng)分析.ppt_第2頁
課件Linux操作系統(tǒng)分析.ppt_第3頁
課件Linux操作系統(tǒng)分析.ppt_第4頁
課件Linux操作系統(tǒng)分析.ppt_第5頁
已閱讀5頁,還剩80頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Linux操作系統(tǒng)分析,主講:陳香蘭 助教:賈永泉、毛熠璐 3606864-83(西區(qū)電三421) Autumn 2007,Linux的進(jìn)程,xlanchen2007.9.18,xlanchen2007.9.25,Linux Operating Systems Analysis,3,主要內(nèi)容,進(jìn)程描述符 進(jìn)程切換 進(jìn)程的創(chuàng)建和刪除 進(jìn)程調(diào)度,xlanchen2007.9.25,Linux Operating Systems Analysis,4,進(jìn)程的概念,進(jìn)程是執(zhí)行程序的一個實例 進(jìn)程和程序的區(qū)別 幾個進(jìn)程可以并發(fā)的執(zhí)行一個程序 一個進(jìn)程可以順序的執(zhí)行幾個程序,xlanchen2007.9.25,Linux Operating Systems Analysis,5,進(jìn)程描述符,為了管理進(jìn)程,內(nèi)核必須對每個進(jìn)程進(jìn)行清晰的描述。 進(jìn)程描述符提供了內(nèi)核所需了解的進(jìn)程信息 include/linux/sched.h struct task_struct 數(shù)據(jù)結(jié)構(gòu)很龐大 基本信息 管理信息 控制信息,xlanchen2007.9.25,Linux Operating Systems Analysis,6,xlanchen2007.9.25,Linux Operating Systems Analysis,7,Linux進(jìn)程的狀態(tài),可運行狀態(tài)(TASK_RUNNING) 可中斷的等待狀態(tài)(TASK_INTERRUPTIBLE) 不可中斷的等待狀態(tài)(TASK_UNINTERRUPTIBLE) 暫停狀態(tài)(TASK_STOPPED) 僵死狀態(tài)(TASK_ZOMBIE) 狀態(tài)值的改變通常是一個簡單的賦值 內(nèi)核也提供set_task_state 和set_current_state 宏,xlanchen2007.9.25,Linux Operating Systems Analysis,8,進(jìn)程狀態(tài)轉(zhuǎn)換圖,xlanchen2007.9.25,Linux Operating Systems Analysis,9,標(biāo)識一個進(jìn)程,使用進(jìn)程描述符地址 進(jìn)程和進(jìn)程描述符之間有非常嚴(yán)格的一一對應(yīng)關(guān)系,使得用32位進(jìn)程描述符地址標(biāo)識進(jìn)程非常方便 使用PID (Process ID,PID) 每個進(jìn)程的PID都存放在進(jìn)程描述符的pid域中 032767 新pid的產(chǎn)生:get_pid +1 循環(huán),xlanchen2007.9.25,Linux Operating Systems Analysis,10,獲得一個進(jìn)程的pid,系統(tǒng)調(diào)用getpidsys_getpid 關(guān)于進(jìn)程組 使用組鏈表 所有進(jìn)程共享組內(nèi)第一個進(jìn)程的pid 數(shù)據(jù):tgpid 單獨一個進(jìn)程可以看成只有一個進(jìn)程的組 getpid返回組pid,xlanchen2007.9.25,Linux Operating Systems Analysis,11,進(jìn)程描述符和進(jìn)程的內(nèi)核堆棧,Linux為每個進(jìn)程分配一個8KB大小的內(nèi)存區(qū)域,用于存放該進(jìn)程兩個不同的數(shù)據(jù)結(jié)構(gòu): 進(jìn)程描述符 進(jìn)程的內(nèi)核堆棧 進(jìn)程處于內(nèi)核態(tài)時使用, 不同于用戶態(tài)堆棧 內(nèi)核控制路徑所用的堆棧 很少,因此對棧和描述符 來說,8KB足夠了,xlanchen2007.9.25,Linux Operating Systems Analysis,12,Task_union,C語言允許用如下的一個union結(jié)構(gòu)來方便的表示這樣的一個混合體 進(jìn)程描述符的分配/回收/訪問 alloc_task_struct free_task_struct get_task_struct,=2048,xlanchen2007.9.25,Linux Operating Systems Analysis,13,current宏進(jìn)程描述符,從剛才看到的進(jìn)程描述符和內(nèi)核態(tài)堆棧之間的配對,內(nèi)核可以很容易的從esp寄存器的值獲得當(dāng)前在CPU上運行的進(jìn)程的描述符指針 因為這個內(nèi)存區(qū)是8KB=213大小,內(nèi)核必須做的就是讓esp有13位的有效位,以獲得進(jìn)程描述符的基地址 這個工作由current宏來完成,8191=8192-1=0x2000-1=0x1fff 取反:0xffffe000(最后13位為0),xlanchen2007.9.25,Linux Operating Systems Analysis,14,Current宏的使用,Current宏可以看成當(dāng)前進(jìn)程的進(jìn)程描述符指針,在內(nèi)核中直接使用 比如current-pid返回在CPU上正在執(zhí)行的進(jìn)程的PID,xlanchen2007.9.25,Linux Operating Systems Analysis,15,進(jìn)程鏈表,為了對給定類型的進(jìn)程(比如所有在可運行狀態(tài)下的進(jìn)程)進(jìn)行有效的搜索,內(nèi)核維護了幾個進(jìn)程鏈表 所有進(jìn)程鏈表,在進(jìn)程描述符中:,xlanchen2007.9.25,Linux Operating Systems Analysis,16,SET_LINKS和REMOVE_LINKS宏用來分別在進(jìn)程鏈表中插入和刪除一個進(jìn)程描述符。,xlanchen2007.9.25,Linux Operating Systems Analysis,17,for_each_task宏掃描整個進(jìn)程鏈表,xlanchen2007.9.25,Linux Operating Systems Analysis,18,TASK_RUNNING狀態(tài)的進(jìn)程鏈表,當(dāng)內(nèi)核調(diào)度程序?qū)ぶ芬粋€新的進(jìn)程在cpu上運行時,必須只考慮可運行進(jìn)程,因為掃描整個進(jìn)程鏈表效率很低 引入了可運行狀態(tài)的雙向循環(huán)鏈表,也叫運行隊列 進(jìn)程描述符使用 用來實現(xiàn)運行隊列,xlanchen2007.9.25,Linux Operating Systems Analysis,19,對可運行隊列的一些操作函數(shù),增加/刪除一個可運行進(jìn)程,可運行隊列的長度,可運行進(jìn)程的個數(shù),喚醒一個進(jìn)程,使一個進(jìn)程可運行,xlanchen2007.9.25,Linux Operating Systems Analysis,20,pidhash表及鏈接表,在一些情況下,內(nèi)核必須能從進(jìn)程的PID得出對應(yīng)的進(jìn)程描述符指針。例如kill系統(tǒng)調(diào)用 為了加速查找,引入了pidhash散列表 用pid_hashfn宏把PID轉(zhuǎn)換成表的索引,xlanchen2007.9.25,Linux Operating Systems Analysis,21,pidhash表及鏈接表,xlanchen2007.9.25,Linux Operating Systems Analysis,22,進(jìn)程之間的親屬關(guān)系,程序創(chuàng)建的進(jìn)程具有父子關(guān)系,在編程時往往需要引用這樣的父子關(guān)系。進(jìn)程描述符中有幾個域用來表示這樣的關(guān)系,xlanchen2007.9.25,Linux Operating Systems Analysis,23,等待隊列,當(dāng)要把除了TASK_RUNNING狀態(tài)之外的進(jìn)程組織在一起時,linux使用了等待隊列 TASK_STOPPED和TASK_ZOMBIE不在專門的鏈表中 TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE狀態(tài)的進(jìn)程再分成很多類,每一類對應(yīng)一個特定的事件。在這種情況下,進(jìn)程狀態(tài)提供的信息滿足不了快速檢索,因此,內(nèi)核引進(jìn)了另外的進(jìn)程鏈表,叫做等待隊列 等待隊列在內(nèi)核中有很多用途,尤其是對中斷處理、進(jìn)程同步和定時用處很大,xlanchen2007.9.25,Linux Operating Systems Analysis,24,等待隊列使得進(jìn)程可以在事件上的條件等待,并且當(dāng)?shù)却臈l件為真時,由內(nèi)核喚醒它們 等待隊列由循環(huán)鏈表實現(xiàn) 在等待隊列上內(nèi)核實現(xiàn)了一些操作函數(shù) Add_wait_queue remove_wait_queue,xlanchen2007.9.25,Linux Operating Systems Analysis,25,等待隊列的鏈表,xlanchen2007.9.25,Linux Operating Systems Analysis,26,進(jìn)程等待,等待一個特定事件的進(jìn)程能調(diào)用下面幾個函數(shù)中的任一個 sleep_on sleep_on_timeout interruptible_sleep_on interruptible_sleep_on_timeout 進(jìn)程等待由需要等待的進(jìn)程自己進(jìn)行(調(diào)用),xlanchen2007.9.25,Linux Operating Systems Analysis,27,sleep_on,xlanchen2007.9.25,Linux Operating Systems Analysis,28,進(jìn)程的喚醒,利用wake_up或者wake_up_interruptible等一系列的宏,都讓插入等待隊列中的進(jìn)程進(jìn)入TASK_RUNNING狀態(tài),xlanchen2007.9.25,Linux Operating Systems Analysis,29,進(jìn)程切換(process switching),為了控制進(jìn)程的執(zhí)行,內(nèi)核必須有能力掛起正在CPU上執(zhí)行的進(jìn)程,并恢復(fù)以前掛起的某個進(jìn)程的執(zhí)行,這叫做進(jìn)程切換,任務(wù)切換,上下文切換,xlanchen2007.9.25,Linux Operating Systems Analysis,30,進(jìn)程上下文,包含了進(jìn)程執(zhí)行需要的所有信息 用戶地址空間 包括程序代碼,數(shù)據(jù),用戶堆棧等 控制信息 進(jìn)程描述符,內(nèi)核堆棧等 硬件上下文,xlanchen2007.9.25,Linux Operating Systems Analysis,31,硬件上下文,盡管每個進(jìn)程可以有自己的地址空間,但所有的進(jìn)程只能共享CPU的寄存器。 因此,在恢復(fù)一個進(jìn)程執(zhí)行之前,內(nèi)核必須確保每個寄存器裝入了掛起進(jìn)程時的值。這樣才能正確的恢復(fù)一個進(jìn)程的執(zhí)行 硬件上下文: 進(jìn)程恢復(fù)執(zhí)行前必須裝入寄存器的一組數(shù)據(jù) 包括通用寄存器的值以及一些系統(tǒng)寄存器 通用寄存器如eax,ebx等 系統(tǒng)寄存器如eip,esp,cr3等等,xlanchen2007.9.25,Linux Operating Systems Analysis,32,在linux中 一個進(jìn)程的硬件上下文主要保存在thread_struct中 其他信息放在內(nèi)核態(tài)堆棧中,xlanchen2007.9.25,Linux Operating Systems Analysis,33,thread_struct,xlanchen2007.9.25,Linux Operating Systems Analysis,34,上下文切換,switch_to宏執(zhí)行進(jìn)程切換,schedule()函數(shù)調(diào)用這個宏一調(diào)度一個新的進(jìn)程在CPU上運行 在schedule()中找到調(diào)用switch_to宏的位置 switch_to利用了prev和next兩個參數(shù): prev:指向當(dāng)前進(jìn)程 next:指向被調(diào)度的進(jìn)程,xlanchen2007.9.25,Linux Operating Systems Analysis,35,當(dāng)前進(jìn)程仍然是prev 這個push操作針對的是 當(dāng)前進(jìn)程的堆棧,保存esi,edi,ebp,保存esp到%0中,嵌入式匯編中 用這種方法表 示輸入、輸出 參數(shù),可以從 0開始編號,%0是什么?,保存esp到當(dāng)前進(jìn)程的上下文中,從next的上下文中取出堆棧的位置,將其作為當(dāng)前堆棧,堆棧被切換,在prev進(jìn)程的上下文中設(shè)置返回地址,返回到下面標(biāo)號為1處,從next進(jìn)程的上下文中取得該進(jìn)程的返回地址,放入堆棧中,調(diào)用_switch_to函數(shù),xlanchen2007.9.25,Linux Operating Systems Analysis,36,進(jìn)程切換的關(guān)鍵語句,堆棧的切換 從此,內(nèi)核對next的內(nèi)核態(tài)堆棧操作,因此,這條指令執(zhí)行從prev到next真正的上下文切換,因為進(jìn)程描述符和內(nèi)核態(tài)堆棧緊密聯(lián)系在一起,改變內(nèi)核態(tài)堆棧就意味改變當(dāng)前進(jìn)程,xlanchen2007.9.25,Linux Operating Systems Analysis,37,什么時候next進(jìn)程真正開始執(zhí)行呢? call=保存返回地址+跳轉(zhuǎn)到target處執(zhí)行 ret=從堆棧上獲得返回地址,并跳轉(zhuǎn)到該返回地址處執(zhí)行 ?當(dāng)_switch_to正常返回時,發(fā)生了什么事情?,xlanchen2007.9.25,Linux Operating Systems Analysis,38,標(biāo)號為1的執(zhí)行代碼處,一個進(jìn)程被正常切換出時,保存的eip總是標(biāo)號為1的那個位置 當(dāng)這個進(jìn)程再次被調(diào)度運行時,恢復(fù)在堆棧上的返回地址總是這個1 1: popl %ebp popl %edi popl %esi,xlanchen2007.9.25,Linux Operating Systems Analysis,39,_switch_to,_switch_to用來處理其他上下文的切換 此時,使用的堆棧是next進(jìn)程的堆棧,這個堆棧上沒有_switch_to需要的參數(shù)prev和next 怎么傳參呢? 找到_switch_to的函數(shù)定義和函數(shù)聲明 找到FASTCALL的定義,xlanchen2007.9.25,Linux Operating Systems Analysis,40,_switch_to的關(guān)鍵操作,unlazy_fpu() 處理數(shù)學(xué)協(xié)處理器 保存和恢復(fù)fs、gs 等等,xlanchen2007.9.25,Linux Operating Systems Analysis,41,?哪里切換了進(jìn)程的地址空間,從執(zhí)行switch_to的位置往前找,xlanchen2007.9.25,Linux Operating Systems Analysis,42,Project:進(jìn)程的切換,對Linux中進(jìn)程的切換過程進(jìn)行分析,提交分析報告,xlanchen2007.9.25,Linux Operating Systems Analysis,43,進(jìn)程的創(chuàng)建,許多進(jìn)程可以并發(fā)的運行同一程序,這些進(jìn)程共享內(nèi)存中程序正文的單一副本,但每個進(jìn)程有自己的單獨的數(shù)據(jù)和堆棧區(qū) 一個進(jìn)程可以在任何時刻可以執(zhí)行新的程序,并且在它的生命周期中可以運行幾個程序 又如,只要用戶輸入一條命令,shell進(jìn)程就創(chuàng)建一個新進(jìn)程,xlanchen2007.9.25,Linux Operating Systems Analysis,44,傳統(tǒng)的UNIX操作系統(tǒng)采用統(tǒng)一的方式來創(chuàng)建進(jìn)程 子進(jìn)程復(fù)制父進(jìn)程所擁有的資源 缺點: 創(chuàng)建過程慢、效率低 事實上,子進(jìn)程復(fù)制的很多資源是不會使用到的 現(xiàn)代UNIX內(nèi)核通過引入三種不同的機制來解決這個問題,xlanchen2007.9.25,Linux Operating Systems Analysis,45,1、寫時復(fù)制技術(shù),Copy-On-Writing,COW 寫時復(fù)制技術(shù)允許父子進(jìn)程能讀相同的物理頁。 只要兩者有一個進(jìn)程試圖寫一個物理頁,內(nèi)核就把這個頁的內(nèi)容拷貝到一個新的物理頁,并把這個新的物理頁分配給正在寫的進(jìn)程,xlanchen2007.9.25,Linux Operating Systems Analysis,46,2、輕量級進(jìn)程允許父子進(jìn)程共享許多數(shù)據(jù)結(jié)構(gòu) 頁表 打開的文件列表 信號處理 3、vfork 使用vfork創(chuàng)建的新進(jìn)程能夠共享父進(jìn)程的內(nèi)存地址空間。父進(jìn)程在這個過程中被阻塞,直到子進(jìn)程退出或者執(zhí)行一個新的程序,xlanchen2007.9.25,Linux Operating Systems Analysis,47,Linux的進(jìn)程創(chuàng)建,Linux提供了幾個系統(tǒng)調(diào)用來創(chuàng)建和終止進(jìn)程,以及執(zhí)行新程序 Fork,vfork和clone系統(tǒng)調(diào)用創(chuàng)建新進(jìn)程 其中,clone創(chuàng)建輕量級進(jìn)程,必須指定要共享的資源 exec系統(tǒng)調(diào)用執(zhí)行一個新程序 exit系統(tǒng)調(diào)用終止進(jìn)程(進(jìn)程也可以因收到信號而終止),xlanchen2007.9.25,Linux Operating Systems Analysis,48,fork,fork系統(tǒng)調(diào)用創(chuàng)建一個新進(jìn)程 調(diào)用fork的進(jìn)程稱為父進(jìn)程 新進(jìn)程是子進(jìn)程 子進(jìn)程幾乎就是父進(jìn)程的完全復(fù)制。它的地址空間是父進(jìn)程的復(fù)制,一開始也是運行同一程序。 fork系統(tǒng)調(diào)用為父子進(jìn)程返回不同的值,xlanchen2007.9.25,Linux Operating Systems Analysis,49,exec,很多情況下,子進(jìn)程從fork返回后很多會調(diào)用exec來開始執(zhí)行新的程序 這種情況下,子進(jìn)程根本不需要讀或者修改父進(jìn)程擁有的所有資源。 所以fork中地址空間的復(fù)制依賴于Copy On Write技術(shù),降低fork的開銷,xlanchen2007.9.25,Linux Operating Systems Analysis,50,使用fork和exec的例子,If (result = fork() = 0) /* 子進(jìn)程代碼 */ if (execve(“new_program”,)0) perror(“execve failed”); exit(1); else if (result0) perror(“fork failed”) /* result=子進(jìn)程的pid,父進(jìn)程將會從這里繼續(xù)執(zhí)行*/ ,xlanchen2007.9.25,Linux Operating Systems Analysis,51,分開這兩個系統(tǒng)調(diào)用是有好處的 比如服務(wù)器可以fork許多進(jìn)程執(zhí)行同一個程序 有時程序只是簡單的exec,執(zhí)行一個新程序 在fork和exec之間,子進(jìn)程可以有選擇的執(zhí)行一系列操作以確保程序以所希望的狀態(tài)運行 重定向輸入輸出 關(guān)閉不需要的打開文件 改變UID或是進(jìn)程組 重置信號處理程序 若單一的系統(tǒng)調(diào)用試圖完成所有這些功能將是笨重而低效的 現(xiàn)有的fork-exec框架靈活性更強 清晰,模塊化強,xlanchen2007.9.25,Linux Operating Systems Analysis,52,do_fork,不論是fork,vfork還是clone,在內(nèi)核中最終都調(diào)用了do_fork,xlanchen2007.9.25,Linux Operating Systems Analysis,53,xlanchen2007.9.25,Linux Operating Systems Analysis,54,閱讀do_fork,了解大致程序流程 ?子進(jìn)程從哪里開始執(zhí)行,它的返回值是什么? 觀察子進(jìn)程的初始上下文是怎么設(shè)置的 內(nèi)核堆棧的內(nèi)容 Thread_struct的內(nèi)容,xlanchen2007.9.25,Linux Operating Systems Analysis,55,注意:childregs指針指向哪里,eax寄存器用作返回值,這里強制為0,在上下文中,設(shè)置用戶態(tài)堆棧指針,設(shè)置內(nèi)核態(tài)堆棧指針,被調(diào)度后,執(zhí)行入口 強制從ret_from_fork返 回用戶態(tài),此后,由于子進(jìn)程處于調(diào)度隊列上,因此在合適的時候會被調(diào)度, 調(diào)度時根據(jù)這里設(shè)置的上下文返回 用戶態(tài),xlanchen2007.9.25,Linux Operating Systems Analysis,56,子進(jìn)程的內(nèi)核態(tài)堆棧,進(jìn)程描述符,子進(jìn)程的8K union,esp,返回值eax被強制寫0,用戶態(tài)堆棧esp的值,用戶態(tài)下eip的值,子進(jìn)程恢復(fù)到用戶態(tài)時需要的上下文,eip,esp,子進(jìn)程的硬件上下文,ret_from_fork,低地址,高地址,xlanchen2007.9.25,Linux Operating Systems Analysis,57,子進(jìn)程的執(zhí)行,fork后,子進(jìn)程處于可運行狀態(tài),由調(diào)度器決定何時把CPU交給這個子進(jìn)程 進(jìn)程切換后因為eip指向ret_from_fork,所以CPU立刻跳轉(zhuǎn)到ret_from_fork()去執(zhí)行。 接著這個函數(shù)調(diào)用ret_from_sys_call(),此函數(shù)用存放在棧中的值裝載所有寄存器,并強迫CPU返回用戶態(tài),xlanchen2007.9.25,Linux Operating Systems Analysis,58,內(nèi)核線程,系統(tǒng)把一些重要的任務(wù)委托給周期性執(zhí)行的進(jìn)程 刷新磁盤高速緩存 交換出不用的頁框 維護網(wǎng)絡(luò)鏈接等待 內(nèi)核線程與普通進(jìn)程的差別 每個內(nèi)核線程執(zhí)行一個單獨指定的內(nèi)核函數(shù) 只運行在內(nèi)核態(tài) 只使用大于PAGE_OFFSET的線性地址空間,xlanchen2007.9.25,Linux Operating Systems Analysis,59,線程和進(jìn)程的比較,Linux內(nèi)核中沒有線程的概念 沒有針對所謂線程的調(diào)度策略 沒有數(shù)據(jù)結(jié)構(gòu)用來表示一個線程 一般線程的概念在linux中只是表現(xiàn)為一組共享資源的進(jìn)程(每個這樣的進(jìn)程都有自己的進(jìn)程描述符) 在其他系統(tǒng)中(比如windows) 線程是實實在在的一種運行抽象,提供了比進(jìn)程更輕更快的調(diào)度單元 在linux中“線程”僅僅是表示多個進(jìn)程共享資源的一種說法,xlanchen2007.9.25,Linux Operating Systems Analysis,60,創(chuàng)建內(nèi)核線程,Kerenl_thread()創(chuàng)建一個內(nèi)核線程,并且只能由另一個內(nèi)核線程來執(zhí)行這個調(diào)用,xlanchen2007.9.25,Linux Operating Systems Analysis,61,進(jìn)程樹,進(jìn)程0 進(jìn)程1 ,xlanchen2007.9.25,Linux Operating Systems Analysis,62,進(jìn)程0,所有進(jìn)程的祖先叫做進(jìn)程0 在系統(tǒng)初始化階段由start_kernel()函數(shù)從無到有手工創(chuàng)建的一個內(nèi)核線程 存放在init_task_union變量中的一個進(jìn)程描述符和一個內(nèi)核態(tài)堆棧(回憶一下啟動時,堆棧的初始化) 用INIT_MM, INIT_MMAP, INIT_FS, INIT_FILES, INIT_SIGNALS宏初始化進(jìn)程描述符的各個對應(yīng)域 頁全局目錄,swapper_pg_dir變量 進(jìn)程0最后的初始化工作創(chuàng)建init內(nèi)核線程,此后運行cpu_idle,成為idle進(jìn)程,xlanchen2007.9.25,Linux Operating Systems Analysis,63,進(jìn)程1,又稱為init進(jìn)程 由進(jìn)程0在start_kernel調(diào)用rest_init創(chuàng)建 init進(jìn)程PID為1,當(dāng)調(diào)度程序選擇到init進(jìn)程時,init進(jìn)程開始執(zhí)行init()函數(shù),xlanchen2007.9.25,Linux Operating Systems Analysis,64,init() 為常規(guī)內(nèi)核任務(wù)初始化一些必要的內(nèi)核線程,如: kflushd 刷新臟緩沖區(qū)中的內(nèi)容到磁盤以歸還內(nèi)存 kswapd 執(zhí)行內(nèi)存回收功能的線程 最后init()函數(shù)調(diào)用execve()系統(tǒng)調(diào)用裝入可執(zhí)行程序init。從此,init內(nèi)核線程變成一個普通的進(jìn)程。但init進(jìn)程從不終止,因為它創(chuàng)建和監(jiān)控操作系統(tǒng)外層的所有進(jìn)程的活動,xlanchen2007.9.25,Linux Operating Systems Analysis,65,撤銷進(jìn)程,進(jìn)程終止 進(jìn)程終止的一般方式是exit()系統(tǒng)調(diào)用。 這個系統(tǒng)調(diào)用可能由編程者明確的在代碼中插入 另外,在控制流到達(dá)主過程C中的main()函數(shù)的最后一條語句時,執(zhí)行exit()系統(tǒng)調(diào)用 內(nèi)核可以強迫進(jìn)程終止 當(dāng)進(jìn)程接收到一個不能處理或忽視的信號時 當(dāng)在內(nèi)核態(tài)產(chǎn)生一個不可恢復(fù)的CPU異常而內(nèi)核此時正代表該進(jìn)程在運行,xlanchen2007.9.25,Linux Operating Systems Analysis,66,進(jìn)程終止使用exit系統(tǒng)調(diào)用 刪除進(jìn)程 在父進(jìn)程調(diào)用wait()類系統(tǒng)調(diào)用檢查子進(jìn)程是否合法終止以后,就可以刪除這個進(jìn)程,xlanchen2007.9.25,Linux Operating Systems Analysis,67,Project:進(jìn)程的創(chuàng)建,使用C語言編寫一段用戶程序 調(diào)用fork創(chuàng)建一個子進(jìn)程 然后讓子進(jìn)程和父進(jìn)程分別輸出fork的返回值 目的:從用戶態(tài)體驗進(jìn)程的創(chuàng)建 對Linux中進(jìn)程的創(chuàng)建進(jìn)行分析,提交分析報告,xlanchen2007.9.25,Linux Operating Systems Analysis,68,進(jìn)程調(diào)度,調(diào)度策略 調(diào)度算法,xlanchen2007.9.25,Linux Operating Systems Analysis,69,調(diào)度策略(scheduling policy),決定什么時候以怎樣的方式選擇一個新進(jìn)程運行的一組規(guī)則 Linux的調(diào)度基于分時技術(shù) 允許多個進(jìn)程“并發(fā)”運行 CPU的時間被劃分成“片”,給每個可運行進(jìn)程分配一片 在單處理器上,任何時刻只能運行一個進(jìn)程,當(dāng)一個并發(fā)執(zhí)行的進(jìn)程時間片用完時(到期)還沒有終止,就可以進(jìn)行進(jìn)程調(diào)度 分時依賴于時鐘中斷,對進(jìn)程透明,xlanchen2007.9.25,Linux Operating Systems Analysis,70,Linux進(jìn)程的優(yōu)先級 根據(jù)特定的算法計算出進(jìn)程的優(yōu)先級,用一個值表示 這個值表示把進(jìn)程如何適當(dāng)?shù)姆峙浣oCPU Linux中進(jìn)程的優(yōu)先級是動態(tài)的 調(diào)度程序會根據(jù)進(jìn)程的行為周期性的調(diào)整進(jìn)程的優(yōu)先級 較長時間未分配到CPU的進(jìn)程,通常 已經(jīng)在CPU上運行了較長時間的進(jìn)程,通常,xlanchen2007.9.25,Linux Operating Systems Analysis,71,進(jìn)程的分類,不同類型的進(jìn)程有不同的調(diào)度需求 第一種分類: I/O-bound 頻繁的進(jìn)行I/O 通常會花費很多時間等待I/O操作的完成 CPU-bound 計算密集型 需要大量的CPU時間進(jìn)行運算,xlanchen2007.9.25,Linux Operating Systems Analysis,72,第二種分類 交互式進(jìn)程(interactive process) 需要經(jīng)常與用戶交互,因此要花很多時間等待用戶輸入操作 響應(yīng)時間要快,平均延遲要低于50150ms 典型的交互式程序:shell、文本編輯程序、圖形應(yīng)用程序等,xlanchen2007.9.25,Linux Operating Systems Analysis,73,批處理進(jìn)程(batch process) 不必與用戶交互,通常在后臺運行 不必很快響應(yīng) 典型的批處理程序:編譯程序、科學(xué)計算 實時進(jìn)程(real-time process) 有實時需求,不應(yīng)被低優(yōu)先級的進(jìn)程阻塞 響應(yīng)時間要短、要穩(wěn)定 典型的實時進(jìn)程:視頻/音頻、機械控制等,xlanchen2007.9.25,Linux Operating Systems Analysis,74,與調(diào)度相關(guān)的系統(tǒng)調(diào)用,nice getpriority/setpriority sched_getscheduler/sched_setscheduler sched_getparam/sched_setparam sched_yield sched_get_priority_min/sched_get_priority_max sched_rr_get_interval,xlanchen2007.9.25,Linux Operating Systems Analysis,75,時間片的選擇,時間片的長短對系統(tǒng)性能非常關(guān)鍵,它既不能太長也不能太短 太短: 頻繁的切換會造成系統(tǒng)開銷過大 假如切換時間為1ms,時間片設(shè)置為1ms,那就沒空執(zhí)行進(jìn)程了,xlanchen2007.9.25,Linux Operating Systems Analysis,76,太長 幾乎每個進(jìn)程都一次運行完 并發(fā)的概念基本消失 普通進(jìn)程需要等待很長時間才能運行 時間片大小的選擇總是一種折衷。Linux采取單憑經(jīng)驗的方法,即選擇盡可能長的時間片,同時能保持良好的響應(yīng)時間,xlanchen2007.9.25,Linux Operating Systems Analysis,77,調(diào)度算法,epoch linux調(diào)度算法把CPU時間劃分為時期(epoch) 在一個單獨的時期內(nèi),每個進(jìn)程有一個指定的時間片 一個進(jìn)程用完它的時間片時,就會被強占 只要進(jìn)程的時間片沒有用完,就可以被多次調(diào)度運行 當(dāng)所有的進(jìn)程用完它的時間片的時候,一個時期才結(jié)束

溫馨提示

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

評論

0/150

提交評論