版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、貴州大學人民武裝學院嵌入式操作系統(tǒng)論文嵌入式操作系統(tǒng)課程論文Linux內(nèi)存管理與進程調(diào)度策略學 號 P B 0 9 2 0 2 8 1 0 9 班 級 09計算機科學與技術(shù) 姓 名 王 華 聯(lián)系電話Email : 810946067 學 院 貴州大學人民武裝學院 2010年 06 月 29 日Linux內(nèi)存管理與進程調(diào)度策略【摘 要】內(nèi)存是Linux內(nèi)核所管理的最重要的資源之一,內(nèi)存管理系統(tǒng)是操作系統(tǒng)中最為重要的部分。對于Linux的學習和熟悉Linux的內(nèi)存管理是非常重要的。進程是運行于虛擬地址空間的一個程序??梢哉f,任何在Linux系統(tǒng)下運行的程序都是進程。 Li
2、nux系統(tǒng)中包括交互進程和批處理進程。交互進程是由Shell控制和運行的,既可以在前臺運行,也可以在后臺運行。批處理進程不屬于某個終端,被提 交到一個隊列中以便順序執(zhí)行。大多數(shù)的進程都需要虛擬內(nèi)存。因此,Linux進程的學習也是至關(guān)重要的?!娟P(guān)鍵詞】linux; 進程調(diào)度;調(diào)度策略;內(nèi)存管理引 言在Intel 80X86 CPU 中,程序在尋址過程中使用的是由段和偏移值構(gòu)成的地址。該地址并不能直接用來尋址物理內(nèi)存地址,因此被稱為虛擬地址。為了能尋址物理內(nèi)存,就需要一種地址變換機制將虛擬地址映射或變換到物理內(nèi)存中,這種地址變換機制就是內(nèi)存管理的主要功能之一(內(nèi)存管理的另外一個主要功能是內(nèi)存的尋址
3、保護機制。虛擬地址通過段管理機制首先變換成一種中間地址形式CPU 32 位的線性地址,然后使用分頁管理機制將此線性地址映射到物理地址。為了弄清Linux 內(nèi)核對內(nèi)存的管理操作方式,我們需要了解內(nèi)存分頁管理的工作原理,了解其尋址的機制。分頁管理的目的是將物理內(nèi)存頁面映射到某一線性地址處。在分析本章的內(nèi)存管理程序時,需明確區(qū)分清楚給定的地址是指線性地址還是實際物理內(nèi)存的地址。內(nèi)存管理以提高內(nèi)存利用率和擴大內(nèi)存量為主要目標,設(shè)計了各種內(nèi)存分配管理方法、算法和數(shù)據(jù)結(jié)構(gòu),通過分析比較,得到不同管理方法的異同。同時,以地址映射為輔線條,描述分區(qū)、分頁、分段、請求分頁和請求分段的映射原理。Linux內(nèi)存管理
4、一個操作系統(tǒng)的內(nèi)存管理方式很大程度上決定了它的效率,時間與空間的對立統(tǒng)一在內(nèi)存管理上體現(xiàn)得最為明顯,首先,分配/釋放內(nèi)存是一個發(fā)生頻率很高的操作,所以它要求有一定的實時性,另外,內(nèi)存又是一種非常寶貴的資源.所以要盡量減少內(nèi)存碎片的產(chǎn)生. Linux采用了伙伴系統(tǒng)算法來管理內(nèi)存,即把內(nèi)頁按20,21,22210大小進行分組.每次分配內(nèi)存時,從相應大小的池中分配內(nèi)存,然后再把余下的內(nèi)存分配給它的下一級緩存池.如右圖 首先,它會到相應大小的(20)的空閑鏈表入隊.判斷相鄰塊的空閑情況,此時,因為第三個是空閑的,所以可以合
5、并為一塊21的空閑塊.繼續(xù)判斷21鏈中相鄰塊是否是空閑的,上圖中可以將21的兩個塊合成一個大塊,然后繼續(xù)判斷22中是否可以繼續(xù)合并,依次類推.上述內(nèi)容,涉及到幾個位操作,分析如下:1:得到相鄰塊的的起始page:buddy1 = base + (page_idx (1 << order)align="center"根據(jù)上面的分析,可得知page_idx本身就是order位對齊的,所以,它的低order位為零.此外,再根據(jù)0與任何數(shù)異或值不變,1與數(shù)異或都相反的規(guī)律,我們可以得知,位運算結(jié)果只跟order+1位有關(guān).據(jù)此就可以計算出它的“伙伴塊”2:得到高一級空閑
6、鏈的首空閑塊序號:mask <<= 1;page_idx &= mask;只要按著高一級鏈表的order位對齊就行了3:得到空閑塊在高一級鏈表中對應的分配位圖位index >>= 1;在前面分析過對應位的計算方法,在高一級空閑鏈中的位對應當前除二其實這一個過程在操作系統(tǒng)設(shè)計中也叫“內(nèi)存拼湊”,就是把剩余小內(nèi)存,拼成連續(xù)的大內(nèi)存,以滿足某些程序的需要。在Intel 80x86 體系結(jié)構(gòu)中,Linux 內(nèi)核的內(nèi)存管理程序采用了分頁管理方式。利用頁目錄和頁表結(jié)構(gòu)處理內(nèi)核中其它部分代碼對內(nèi)存的申請和釋放操作。內(nèi)存的管理是以內(nèi)存頁面為單位進行的,一個內(nèi)存頁面是指地址連續(xù)的
7、4K 字節(jié)物理內(nèi)存。通過頁目錄項和頁表項,可以尋址和管理指定頁面的使用情況。在Linux 0.11 的內(nèi)存管理目錄中共有三個文件,如列表10-1 中所示:其中,page.s 文件比較短,僅包含內(nèi)存頁異常的中斷處理過程(int 14)。主要實現(xiàn)了對缺頁和頁寫保護的處理。memory.c 是內(nèi)存頁面管理的核心文件,用于內(nèi)存的初始化操作、頁目錄和頁表的管理和內(nèi)核其它部分對內(nèi)存的申請?zhí)幚磉^程。一·內(nèi)存管理的硬件機理1內(nèi)存分頁管理機制在Intel 80x86 的系統(tǒng)中,內(nèi)存分頁管理是通過頁目錄表和內(nèi)存頁表所組成的二級表進行的。見圖10-1所示。“那么,一個線性地址如何使用這兩個表來映射到一個物
8、理地址上呢?”。為了使用分頁機制,一個32 位的線性地址被分成了三個部分,分別用來指定一個頁目錄項、一個頁表項和對應物理內(nèi)存頁上的偏移地址,從而能間接地尋址到線性地址指定的物理內(nèi)存位置。見圖10-2 所示。 在內(nèi)存管理的函數(shù)中,大量使用了從線性地址到實際物理地址的變換計算。對于給定一個進程的線性地址,通過圖10-2 中所示的地址變換關(guān)系,我們可以很容易地找到該線性地址對應的頁目錄項。若該目錄項有效(被使用),則該目錄項中的頁框地址指定了一個頁表在物理內(nèi)存中的基址,那么結(jié)合線性地址中的頁表項指針,若該頁表項有效,則根據(jù)該頁表項中的指定的頁框地址,我們就可以最終確定指定線性地址對應的實際物理內(nèi)存頁
9、的地址。反之,如果需要從一個已知被使用的物理內(nèi)存頁地址,尋找對應的線性地址,則需要對整個頁目錄表和所有頁表進行搜索。若該物理內(nèi)存頁被共享,我們就可能會找到多個對應的線性地址來。圖10-3 用形象的方法示出了一個給定的線性地址是如何映射到物理內(nèi)存頁上的。對于第一個進程(任務0),其頁表是在頁目錄表之后,共4 頁。對于應用程序的進程,其頁表所使用的內(nèi)存是在進程創(chuàng)建時向內(nèi)存管理程序申請的,因此是在主內(nèi)存區(qū)中。一個系統(tǒng)中可以同時存在多個頁目錄表,而在某個時刻只有一個頁目錄表可用。當前的頁目錄表是用CPU 的寄存器CR3 來確定的,它存儲著當前頁目錄表的物理內(nèi)存地址。但在本書所討論的Linux 內(nèi)核中只
10、使用了一個頁目錄表。在圖10.1 中我們看到,每個頁表項對應的物理內(nèi)存頁在4G 的地址范圍內(nèi)是隨機的,是由頁表項中頁框地址內(nèi)容確定的,也即是由內(nèi)存管理程序通過設(shè)置頁表項確定的。每個表項由頁框地址、訪問標志位、臟(已改寫)標志位和存在標志位等構(gòu)成。表項的結(jié)構(gòu)可參見圖10-4 所示。2 Linux 中物理內(nèi)存的管理和分配有了以上概念,我們就可以說明Linux 進行內(nèi)存管理的方法了。但還需要了解一下Linux 0.11 內(nèi)核使用內(nèi)存空間的情況。對于Linux 0.11 內(nèi)核,它默認最多支持16M 物理內(nèi)存。在一個具有16MB 內(nèi)存的80x86 計算機系統(tǒng)中,Linux 內(nèi)核占用物理內(nèi)存最前段的一部分
11、,圖中end 標示出內(nèi)核模塊結(jié)束的位置。隨后是高速緩沖區(qū),它的最高內(nèi)存地址為4M 。高速緩沖區(qū)被顯示內(nèi)存和ROM BIOS 分成兩段。剩余的內(nèi)存部分稱為主內(nèi)存區(qū)。主內(nèi)存區(qū)就是由本章的程序進行分配管理的。若系統(tǒng)中還存在RAM 虛擬盤時,則主內(nèi)存區(qū)前段還要扣除虛擬盤所占的內(nèi)存空間。當需要使用主內(nèi)存區(qū)時就需要向本章的內(nèi)存管理程序申請,所申請的基本單位是內(nèi)存頁。整個物理內(nèi)存各部分的功能示意圖如圖10-5 所示。為了節(jié)約物理內(nèi)存,在調(diào)用fork()生成新進程時,新進程與原進程會共享同一內(nèi)存區(qū)。只有當其中一個進程進行寫操作時,系統(tǒng)才會為其另外分配內(nèi)存頁面。這就是寫時復制的概念。page.s 程序用于實現(xiàn)頁
12、異常中斷處理過程(int 14)。該中斷處理過程對由于缺頁和頁寫保護引起的中斷分別調(diào)用memory.c 中的do_no_page()和do_wp_page()函數(shù)進行處理。do_no_page()會把需要的頁面從塊設(shè)備中取到內(nèi)存指定位置處。在共享內(nèi)存頁面情況下,do_wp_page()會復制被寫的頁面(copy onwrite,寫時復制),從而也取消了對頁面的共享。3 Linux 內(nèi)核對線性地址空間的使用分配在閱讀本章代碼時,我們還需要了解一個執(zhí)行程序進程的代碼和數(shù)據(jù)在虛擬的線性地址空間中的分布情況,參見下面圖所示。每個進程在線性地址中都是從nr*64M 的地址位置開始(nr 是任務號),占用
13、線性地址空間的范圍是64M。其中最后部的環(huán)境參數(shù)數(shù)據(jù)塊最長為128K,其左面起始堆棧指針。在進程創(chuàng)建時bss 段的第一頁被初始化為全。4關(guān)于寫時復制(copy on write)機制當進程A 使用系統(tǒng)調(diào)用fock 創(chuàng)建一個子進程B 時,由于子進程B 實際上是父進程A 的一個拷貝,因此會擁有與父進程相同的物理頁面。也即為了達到節(jié)約內(nèi)存和加快創(chuàng)建速度的目標,fork()函數(shù)會讓子進程B 以只讀方式共享父進程A 的物理頁面。同時將父進程A 對這些物理頁面的訪問權(quán)限也設(shè)成只讀。詳見memory.c 程序中的copy_page_tables()函數(shù)。這樣一來,當父進程A 或子進程B 任何一方對這些以共享
14、的物理頁面執(zhí)行寫操作時,都會產(chǎn)生頁面出錯異常(page_fault int14)中斷,此時CPU 會執(zhí)行系統(tǒng)提供的異常處理函數(shù)進程是運行于虛擬地址空間的一個程序。可以說,任何在Linux系統(tǒng)下運行的程序都是進程。 Linux系統(tǒng)中包括交互進程和批處理進程。交互進程是由Shell控制和運行的,既可以在前臺運行,也可以在后臺運行。批處理進程不屬于某個終端,被提 交到一個隊列中以便順序執(zhí)行。大多數(shù)的進程都需要虛擬內(nèi)存。存儲管理子系統(tǒng)是操作系統(tǒng)中最重要的組成部分之一。在早期計算時代,由于人們所需要的內(nèi)存數(shù) 目遠遠大于物理內(nèi)存,因此設(shè)計出了各種各樣的策略來解決此問題,其中最成功的就是虛擬內(nèi)存技術(shù),它使得
15、系統(tǒng)中有限的物理內(nèi)存競爭進程所需內(nèi)存空間得到滿 足。虛擬內(nèi)存通過在各個進程之間共享內(nèi)存,而使系統(tǒng)看起來有多于實際內(nèi)存的內(nèi)存容量。Linux支持虛擬內(nèi)存, 就是使用磁盤作為RAM的擴展,使可用內(nèi)存相應地有效擴大。核心把當前不用的內(nèi)存塊存到硬盤,騰出內(nèi)存給其它目的。當原來的內(nèi)容又要使用時,再讀回內(nèi)存。 運行于Linux的程序只看到大量的可用內(nèi)存,而不關(guān)心哪部分在磁盤上。當然,讀寫硬盤比真的內(nèi)存慢(大約慢千倍),所以程序運行較慢。用做虛擬內(nèi)存的這 部分硬盤叫對換空間。虛擬內(nèi)存技術(shù)不僅僅讓我們可以使用更多的內(nèi)存,它還提供了下面這些功能:1.巨大的尋址空間:操作系統(tǒng)讓系統(tǒng)看上去有比實際內(nèi)存大得多的內(nèi)存空
16、間。虛擬內(nèi)存可以是系統(tǒng)中實際物理空間的許 多倍。每個進程運行在其獨立的虛擬地址空間中,這些虛擬空間相互之間都完全隔離開來,所以進程間不會互相影響。同時,硬件虛擬內(nèi)存機構(gòu)可以將內(nèi)存的某些區(qū) 域設(shè)置成不可寫,這樣可以保護代碼與數(shù)據(jù)不會受惡意程序的干擾。2.公平的物理內(nèi)存分配:內(nèi)存管理子系統(tǒng)允許系統(tǒng)中每個運行的進程公平地共享系統(tǒng)中的物理內(nèi)存。3.共享虛擬內(nèi)存:盡管虛擬內(nèi)存允許進程有其獨立的虛擬地址空間,但有時也需要在進程之間共享內(nèi)存。例如,有可 能系統(tǒng)中有幾個進程同時運行BASH命令外殼程序。為了避免在每個進程的虛擬內(nèi)存空間內(nèi)都存在BASH程序的拷貝,較好的解決辦法是系統(tǒng)物理內(nèi)存中只存在 一份BAS
17、H的拷貝,并在多個進程間共享。動態(tài)庫則是另外一種進程間共享執(zhí)行代碼的方式。共享內(nèi)存可用來作為進程間通信(IPC)的手段,多個進程通過共 享內(nèi)存來交換信息。Linux支持SYSTEM V的共享內(nèi)存IPC機制。 4.進程的保護:系統(tǒng)中的每一個進程都有自己的虛擬地址空間。這些虛擬地址空間是完全分開的,這樣一個進程的運行不會影響其它進程,并且硬件上的虛擬內(nèi)存機制是被保護的,內(nèi)存不能被寫入。這樣可以防止迷失的應用程序覆蓋代碼的數(shù)據(jù)。 5.Linux虛擬內(nèi)存實現(xiàn)機制:Linux虛擬內(nèi)存的實現(xiàn)需要6種機制的支持:地址映射機制、內(nèi)存分配回收機制、緩存和刷新機制、請求頁機制、交換機制和內(nèi)存共享機制。 內(nèi)存管理程
18、序通過映射機制把用戶程序的邏輯地址映射到物理地址。當用戶程序運行時,如果發(fā)現(xiàn) 程序中要用的虛地址沒有對應的物理內(nèi)存,就發(fā)出了請求頁要求。如果有空閑的內(nèi)存可供分配,就請求分配內(nèi)存(于是用到了內(nèi)存的分配和回收),并把正在使用的 物理頁記錄在緩存中(使用了緩存機制)。如果沒有足夠的內(nèi)存可供分配,那么就調(diào)用交換機制;騰出一部分內(nèi)存。另外,在地址映射中要通過TLB(翻譯后援存 儲器)來尋找物理頁;交換機制中也要用到交換緩存,并且把物理頁內(nèi)容交換到交換文件中,也要修改頁表來映射文件地址。6.虛擬內(nèi)存容量設(shè)定:也許有人說,虛擬內(nèi)存容量的設(shè)定應該分配2倍于物理內(nèi)存,但這只是個規(guī)律。如果物理內(nèi)存比較 小,可以這
19、樣設(shè)定。如果有256MB物理內(nèi)存或更多的話,就可以縮小虛擬內(nèi)存。Linux會把大量的內(nèi)存用做Cache,但在資源緊張時會收回。只要看到 swap為0,或者該數(shù)很小就可以放心了,內(nèi)存放著不用才是最大的浪費。 內(nèi)存泄露和回收內(nèi)存的方法 1.內(nèi)存泄漏的定義:一般常說的內(nèi)存泄漏是指堆內(nèi)存的泄漏。堆內(nèi)存是指程序從堆中分配的、大小任意的(內(nèi)存塊的大 小可以在程序運行期決定)、使用完后必須顯示釋放的內(nèi)存。應用程序一般使用malloc、realloc、new等函數(shù)從堆中分配到一塊內(nèi)存,使用完后, 程序必須負責相應的調(diào)用free或delete釋放該內(nèi)存塊。否則,這塊內(nèi)存就不能被再次使用,我們就說這塊內(nèi)存泄漏了。
20、 2.內(nèi)存泄露的危害:從用戶使用程序的角度來看,內(nèi)存泄漏本身不會產(chǎn)生什么危害。作為一般的用戶,根本感覺不到內(nèi) 存泄漏的存在。真正有危害的是內(nèi)存泄漏的堆積,這會最終消耗盡系統(tǒng)所有的內(nèi)存。從這個角度來說,一次性內(nèi)存泄漏并沒有什么危害,因為它不會堆積。而隱式內(nèi) 存泄漏危害性則非常大,因為較之于常發(fā)性和偶發(fā)性內(nèi)存泄漏它更難被檢測到。存在內(nèi)存泄漏問題的程序除了會占用更多的內(nèi)存外,還會使程序的性能急劇下降。對 于服務器而言,如果出現(xiàn)這種情況,即使系統(tǒng)不崩潰,也會嚴重影響使用。 3.內(nèi)存泄露的檢測和回收:對于內(nèi)存溢出之類的麻煩,大家可能在編寫指針比較多的復雜程序時就會遇到。在 Linux或Unix下,C和C
21、+語言是最常使用的工具。但是C+程序缺乏相應的手段來檢測內(nèi)存信息,只能使用top指令觀察進程的動態(tài)內(nèi)存總額。而 且程序退出時,我們無法獲知任何內(nèi)存泄漏信息。 使用Linux命令回收內(nèi)存,可以使用ps、kill兩個命令檢測內(nèi)存使用情況和進行 回收。在使用超級用戶權(quán)限時使用命令“ps”,它會列出所有正在運行的程序名稱和對應的進程號(PID)。kill命令的工作原理是向Linux 操作系統(tǒng)的內(nèi)核送出一個系統(tǒng)操作信號和程序的進程號(PID)。二·Linux內(nèi)存管理源代碼分析由于CPU調(diào)度的結(jié)果,才能提高CPU的使用率和計算機對用戶的響應速度.但是,為了實現(xiàn)這一性能改進,必須將多個進程保存在內(nèi)
22、存中,也就是說必須共享內(nèi)存,所以這就應該對內(nèi)存更好的管理,才能滿足需求,使得運行的效率和資源的利用率更高.所以各種內(nèi)存管理方法和機制都要更好的掌握,Linux0.11內(nèi)存管理內(nèi)核代碼更好了解釋了管理機制的底層機理. 進程是運行于虛擬地址空間的一個程序??梢哉f,任何在Linux系統(tǒng)下運行的程序都是進程。 Linux系統(tǒng)中包括交互進程和批處理進程。交互進程是由Shell控制和運行的,既可以在前臺運行,也可以在后臺運行。批處理進程不屬于某個終端,被提 交到一個隊列中以便順序執(zhí)行。大多數(shù)的進程都需要虛擬內(nèi)存。Linux進程中最知名的屬性就是它的進程號(Process Identity Number,P
23、ID)以其父進程號(Parent Process ID,PPID)。PID、PPID都是非零正整數(shù)。一個PID唯一地標識一個進程。一個進程創(chuàng)建新進程稱為創(chuàng)建了子進程(Child Process),創(chuàng)建子進程的進程稱為父進程。所有進程追溯其祖先最終都會落到進程號為1的進程身上,這個進程叫做init進程,是內(nèi)核自舉后第一個啟動的進程。Init進程的作用是扮演終結(jié)父進程的角色。因為init進程永遠不會被終止,所以系統(tǒng)總是確信它的存在,并在必要時以它為參照。如果某個進程在它衍生出來的全部子進程結(jié)束之前被終止,就會出現(xiàn)必須以init為參照的情況。此時那些失去了父進程的子進程就都會以init作為其父進程。
24、通過執(zhí)行ps-af命令,可以列出許多父進程ID為1的進程。Linux提供了一條pstree命令,允許用戶查看系統(tǒng)內(nèi)正在運行的各個進程之間的繼承關(guān)系。直接在命令行輸入pstree,程序會以樹狀結(jié)構(gòu)方式列出系統(tǒng)中正在運行的各進程之間的繼承關(guān)系。三·Linux內(nèi)存管理之slab分配器分析前面我們分析過了大內(nèi)存分配的實現(xiàn)機制,事實上,若為小塊內(nèi)存而請求整個頁面,這樣對于內(nèi)存來說是一種極度的浪費。因此linux采用了slab來管理小塊內(nèi)存的分配與釋放。Slab最早是由sun的工程師提出。它的提出是基于以下因素考慮的:1:內(nèi)核函數(shù)經(jīng)常傾向于反復請求相同的數(shù)據(jù)類型。比如:創(chuàng)建進程時,會請求一塊內(nèi)存
25、來存放mm結(jié)構(gòu)。2:不同的結(jié)構(gòu)使用不同的分配方法可以提高效率。同樣,如果進程在撤消的時候,內(nèi)核不把mm結(jié)構(gòu)釋放掉,而是存放到一個緩沖區(qū)里,以后若有請求mm存儲空間的行為就可以直接從緩沖區(qū)中取得,而不需重新分配內(nèi)存.3:前面我們曾分析過,如果伙伴系統(tǒng)頻繁分配,釋放內(nèi)存會影響系統(tǒng)的效率,以此,可以把要釋放到的內(nèi)存放到緩沖區(qū)中,直至超過一個閥值才把它釋放至伙伴系統(tǒng),這樣可以在一定程度上緩減減伙伴系統(tǒng)的壓力4:為了緩減“內(nèi)碎片”的產(chǎn)生,通??梢园研?nèi)存塊按照2的倍數(shù)組織在一起,這一點和伙伴系統(tǒng)類似slab分配器概貌:Slab將緩存分為兩種:一種是專用高速緩存,另外一種是普通高速緩存。請注意,這里所說的
26、高速緩存和硬件沒有必然的關(guān)系,它只是slab分配器中的一個軟件概念。專用高速緩存中用來存放內(nèi)核使用的數(shù)據(jù)結(jié)構(gòu),例如:mm,skb,vm等等普通高速緩存是指存放一般的數(shù)據(jù),比如內(nèi)核為指針分配一段內(nèi)存所有的高速緩存區(qū)都通過鏈表的方式組織在一起,它的首結(jié)點是cache_chain另外,普通高速緩存將分配區(qū)分為32*(20),32*(21),32*(22) .32*(212)大小,共13個區(qū)域大小,另外,每個大小均有兩個高速緩存,一個為DMA高速緩存,一個是常規(guī)高速緩存。它們都存放在一個名這cache_size的表中.Slab分配器把每一個請求的內(nèi)存稱之為對象(和oop設(shè)計方法中的對象類似,都有初始化
27、與析構(gòu)).對象又存放在slab中.slab又按照空,末滿,全滿全部鏈接至高速緩存中.如下圖所示: align="center" slab分配器相關(guān)數(shù)據(jù)結(jié)構(gòu)高速緩存:typedef struct kmem_cache_s kmem_cache_t;struct kmem_cache_s struct array_cache *arrayNR_CPUS; unsigned int batchcount; unsigned int limit; /* arrayNR_CPUS中所允許的最大空
28、閑數(shù) */struct kmem_list3 lists; /*將在后面分析*/unsigned int objsize; /*slab中的對象大小*/ unsigned int flags; /* cache標志*/ unsigned int num; /*每個slab中的對象數(shù)量 */ unsigned int free_limit; spinlock_t
29、spinlock; unsigned int gfporder; /*2gfporder即為cache中slab的大小*/ unsigned int gfpflags; size_t colour; /*著色機制,后面會詳細分析 */ unsigned int colour_off; unsigned int
30、 colour_next; kmem_cache_t *slabp_cache; unsigned int slab_size; /*每一個slab的大小*/ unsigned int dflags; void (*ctor)(void *, kmem_cache_t *, unsigned long); /*構(gòu)造函數(shù)*/ void (*dtor)(v
31、oid *, kmem_cache_t *, unsigned long); /*析構(gòu)函數(shù)*/const char *name; /*cache的名字*/struct list_head next; /*下一個cache 用來構(gòu)成鏈表*/ /* statistics */#if STATS unsigned long num_active; unsigned long
32、60; num_allocations; unsigned long high_mark; unsigned long grown; unsigned long reaped; unsigned long errors; unsign
33、ed long max_freeable; atomic_t allochit; atomic_t allocmiss; atomic_t freehit; atomic_t freemiss;#endif#if DEBUG
34、0; int dbghead; int reallen;#endif注意,這里與前面的相比,slab部份的結(jié)構(gòu)與成員位置發(fā)生了很大改變。一般來說經(jīng)常用的成員放在結(jié)構(gòu)體的前面。后面會解述為什么。在cache這個結(jié)構(gòu)里,有兩個很重要的結(jié)構(gòu):struct array_cache *arrayNR_CPUS與struct kmem_list3 lists;詳細分析一下struct array_cache
35、; unsigned int avail; /當前空閑對象的位置 unsigned int limit; /允許的空閑對象的最大值 unsigned int batchcount; unsigned int touched; /如果從該組中分配了對象,則把此值置為1struct kmem_list3
36、 struct list_head slabs_partial; /*末滿的slab鏈 */ struct list_head slabs_full; /*滿的slab鏈*/ struct list_head slabs_free; /*完全空閑的slab鏈*/ unsigned long free
37、_objects; /*空鏈的對象數(shù)*/ int free_touched; unsigned long next_reap; struct array_cache *shared; /*全局shar數(shù)組*/Slab的數(shù)據(jù)結(jié)構(gòu)struct slab struct list
38、_head list; /*用來構(gòu)成鏈表*/ unsigned long colouroff; /*著色機制,后面會詳解*/ void *s_mem; /* 首個對象的起始地址 */
39、 unsigned int inuse; /* slab中的使用對象個數(shù) */ kmem_bufctl_t free; /*slab中的第一個空閑對象的序號*/;Linux的進程調(diào)度策略一·調(diào)度時機: 內(nèi)核中:進程自己通過系統(tǒng)調(diào)用schedule()或者schedule_timeout()自愿放棄CPU,讓CPU調(diào)度其他的進程。(sche
40、dule_timeout() 可以指定放棄CPU的時間)1:自愿調(diào)度: 用戶空間:進程通過系統(tǒng)調(diào)用pause()或者nanosleep()而自 愿放棄CPU。(nanosleep()也可以指定放棄CPU的時間,此外,Sleep()、Sleep_on()是庫函數(shù),不是系統(tǒng)調(diào)用,最終也是通過系統(tǒng)調(diào)用實現(xiàn)放棄CPU)2:自愿調(diào)度:主要發(fā)生在系統(tǒng)從內(nèi)核態(tài)返回到用戶態(tài)時(即從系統(tǒng)空間返回到用戶空間),主要發(fā)生以下幾種情況:用戶進程進行系統(tǒng)調(diào)用返回時(系統(tǒng)調(diào)用在系統(tǒng)空間中完成);中處理完成時(中斷處理也是在系統(tǒng)空間);異常處理完成時(異常處理也在系統(tǒng)空間)。CPU每次從系統(tǒng)空間返回到用戶空間時,都會進行一
41、次進程調(diào)度。此外,每次時鐘中斷產(chǎn)生時,發(fā)現(xiàn)當前運行進程的時間片超時,也會進行一次進程調(diào)度(這也是LINUX系統(tǒng)中各個進程都能夠得到執(zhí)行的原因,否則,如果某個進程不進行系統(tǒng)調(diào)用,自身運行有沒有異常,又不自愿放棄CPU,系統(tǒng)中又沒有中斷,則該進程會一直等到時間片用完為止)。也就是說,強制進程調(diào)度只發(fā)生在用戶空間,絕對不會發(fā)生在系統(tǒng)空間中。二·調(diào)度方式:“有條件可剝奪”方式通過以上調(diào)度時機的分析,可見,LINUX內(nèi)核使用的是“有條件可剝奪”方式的進程調(diào)度,當系統(tǒng)運行在系統(tǒng)空間時,是不可已被剝奪的,但是,一旦系統(tǒng)從系統(tǒng)空間返回返回到用戶空間時,當前進程就有可能被剝奪CPU的占用權(quán)。三
42、3;調(diào)度策略:“以進程各自的優(yōu)先級和調(diào)度策略“為基礎(chǔ)的調(diào)度策略1:總的調(diào)度策略:系統(tǒng)會根據(jù)每個進程的優(yōu)先級和它所采用的調(diào)度策略,通過某種算法計算出各個進程的一個運行“權(quán)值”,系統(tǒng)每次調(diào)度時,就根據(jù)這個權(quán)值進行調(diào)度,權(quán)值最高的,最先被調(diào)度。但是,這個權(quán)值并不是一成不變的,而是隨著被執(zhí)行進程執(zhí)行的時間而遞減,這樣,原來權(quán)值較低的進程也可以有機會得到執(zhí)行(保證進程調(diào)度的“公正”性)。當所有進程的權(quán)值都減小到0時(注意:如果有線程采用下面將要提到的SCHED_FIFO或者,SCHED_RR調(diào)度策略,則不可能所有進程的權(quán)值都變成0,至少采用這兩種調(diào)度策略的進程的權(quán)值最少會保持1000),系統(tǒng)就會重新計算一次所有進程的權(quán)值,再次重復上述調(diào)度過程。2:進程自己的調(diào)度策略:為適應不同的需要,LINUX內(nèi)核設(shè)計了三種不同的進程調(diào)度政策:SCHED_FIFO-適用于對時間性要求比較強,而且每次運行時所用的時間比較短,實時應用程序適合這種策略。 SCHED_RR-“RR”是 Round Robin(輪流)的意思,適合程序比較大,每次運行都需要花費很長時間的進程。 SCHED_OTHER-傳統(tǒng)的調(diào)度策略,適用于交互式得分時應用此外,各個進程可以通過系統(tǒng)調(diào)用sched_setscheduler()設(shè)置自己的調(diào)度策略。四:通過以上對LINUX進程調(diào)度策略的分析,可以得出這種調(diào)度策略不能保證實
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026上半年海南事業(yè)單位聯(lián)考儋州市事業(yè)單位(考核)招聘工作人員213人備考題庫(第一號)及完整答案詳解一套
- 糧油加工自動化控制系統(tǒng)安全
- 廠礦企業(yè)電工培訓課件
- 2022~2023安全保護服務人員考試題庫及答案第877期
- Ⅰ型干擾素病診療中國專家共識課件
- 未來五年海水養(yǎng)殖龍蝦企業(yè)縣域市場拓展與下沉戰(zhàn)略分析研究報告
- 未來五年通信設(shè)備修理企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略分析研究報告
- 未來五年P(guān)ET基膜企業(yè)ESG實踐與創(chuàng)新戰(zhàn)略分析研究報告
- 未來五年加密企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略分析研究報告
- 五年級科學上冊《體積變化之謎》教學設(shè)計
- 2025年繩索技術(shù)理論題庫及答案
- 天津市和平區(qū)2025年高二化學第一學期期末監(jiān)測試題含解析
- 人造噴霧造景施工方案
- 供熱企業(yè)環(huán)保知識培訓課件
- 工業(yè)園招商課件
- 護理帶教老師小講課
- 氟硅烷改性自清潔涂層的制備及性能表征
- 特警小組戰(zhàn)術(shù)課件大綱
- 電氣設(shè)備維護保養(yǎng)手冊模板
- 3.1城市的輻射功能課件-高中地理人教版選擇性必修2
- 病歷抽查管理辦法
評論
0/150
提交評論