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

下載本文檔

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

文檔簡(jiǎn)介

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論