<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 初學(xué)者如何熟悉Linux內(nèi)存管理機(jī)制

          初學(xué)者如何熟悉Linux內(nèi)存管理機(jī)制

          作者: 時(shí)間:2016-10-08 來源:網(wǎng)絡(luò) 收藏

          內(nèi)存是Linux內(nèi)核所管理的最重要的資源之一,內(nèi)存管理系統(tǒng)是操作系統(tǒng)中最為重要的部分。對(duì)于Linux的初學(xué)者來說,熟悉Linux的內(nèi)存管理非常重要。

          本文引用地址:http://www.ex-cimer.com/article/201610/305314.htm

          進(jìn)程是運(yùn)行于虛擬地址空間的一個(gè)程序??梢哉f,任何在Linux系統(tǒng)下運(yùn)行的程序都是進(jìn)程。Linux系統(tǒng)中包括交互進(jìn)程和批處理進(jìn)程。交互進(jìn)程是由Shell控制和運(yùn)行的,既可以在前臺(tái)運(yùn)行,也可以在后臺(tái)運(yùn)行。批處理進(jìn)程不屬于某個(gè)終端,被提交到一個(gè)隊(duì)列中以便順序執(zhí)行。大多數(shù)的進(jìn)程都需要虛擬內(nèi)存。

          一般需要多少內(nèi)存

          對(duì)于典型的Linux應(yīng)用系統(tǒng),128MB內(nèi)存是合理的選擇。如果不運(yùn)行X-Window系統(tǒng),那么在一臺(tái)特殊用途的機(jī)器(比如用于調(diào)試設(shè)備驅(qū)動(dòng)程序的“崩潰和燒毀”系統(tǒng))上僅用8MB內(nèi)存就可以工作。

          筆者曾經(jīng)做過實(shí)驗(yàn),在128MB和256MB下編譯內(nèi)核所需的時(shí)間幾乎一樣,都少于3分半鐘(筆者的Linux發(fā)行版本是Mandrake Linux 9.1,內(nèi)核2.4.21)。在一個(gè)只有8MB內(nèi)存的系統(tǒng)上,編譯需要的時(shí)間會(huì)更長(zhǎng)一些。類似Web瀏覽器這樣的多媒體應(yīng)用軟件,在內(nèi)存充足時(shí)會(huì)運(yùn)行得更流暢,特別是在一邊編譯程序,一邊上網(wǎng)瀏覽的時(shí)候更是如此。因此,如果只有128MB內(nèi)存,則預(yù)期的性能會(huì)有所降低。類似地,如果要開發(fā)消耗大量?jī)?nèi)存的應(yīng)用程序,可能會(huì)要求更多的內(nèi)存。所以,需要多少內(nèi)存由工作需求來決定。

          實(shí)時(shí)監(jiān)控內(nèi)存使用情況

          1.在命令行使用“Free”命令監(jiān)控內(nèi)存使用情況 #free

          total  used  free shared buffers cached

          Mem:    256024 192284  63740   0  10676 101004

          -/+ buffers/cache: 80604  75420

          Swap:    522072   0 522072

          上面代碼給出了一個(gè)256MB的RAM和512MB交換空間的系統(tǒng)情況。第三行輸出(Mem:)顯示物理內(nèi)存。Total列不顯示核心使用的物理內(nèi)存(通常大約1MB)。Used列顯示被使用的內(nèi)存總額(第二行不計(jì)緩沖)。Free列顯示全部沒有使用的內(nèi)存。Shared列顯示多個(gè)進(jìn)程共享的內(nèi)存總額。Buffers列顯示磁盤緩存的當(dāng)前大小。第五行(Swap:)對(duì)換空間,顯示的信息類似上面。如果這行為全0,那么就沒有使用對(duì)換空間。在缺省的狀態(tài)下,free命令以千字節(jié)(也就是1024字節(jié)為單位)來顯示內(nèi)存使用情況。使用-h參數(shù),以字節(jié)為單位顯內(nèi)存使用情況;或者使用-m參數(shù),以兆字節(jié)為單位顯示內(nèi)存使用情況。還可以通過-s參數(shù),使用命令來不間斷地監(jiān)視內(nèi)存使用情況:

          #free -b -s5

          這個(gè)命令將會(huì)在終端窗口中連續(xù)不斷地報(bào)告內(nèi)存的使用情況,每5秒鐘更新一次。

          2.使甩vmstat命令監(jiān)視虛擬內(nèi)存使用情況 # vmstat

          procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----

          r b  swpd  free  buff cache  si  so  bi  bo  in  cs us sy id wa

          1 0   0 63692 10704 101008  0  0  239  42 126  105 48 45 7 0

          vmstat()命令是一個(gè)通用監(jiān)控程序,是Virtual Meomory Statistics(虛擬內(nèi)存統(tǒng)計(jì))的縮寫。如果使用vmstat命令的時(shí)候沒有使用任何命令行參數(shù),將會(huì)得到一個(gè)一次性的報(bào)告。vmstat命令報(bào)告主要的活動(dòng)類型有進(jìn)程(procs)、內(nèi)存(以千字節(jié)為單位)、交換分區(qū)(以千字節(jié)為單位)、來自塊設(shè)備(硬盤驅(qū)動(dòng)器)的輸入輸出量、系統(tǒng)中斷(每秒鐘發(fā)生的次數(shù)),以及中央處理單元(CPU)分配給用戶、系統(tǒng)和空閑時(shí)分別占用的比例。

          虛擬內(nèi)存實(shí)現(xiàn)的機(jī)制

          存儲(chǔ)管理子系統(tǒng)是操作系統(tǒng)中最重要的組成部分之一。在早期計(jì)算時(shí)代,由于人們所需要的內(nèi)存數(shù)目遠(yuǎn)遠(yuǎn)大于物理內(nèi)存,因此設(shè)計(jì)出了各種各樣的策略來解決此問題,其中最成功的就是虛擬內(nèi)存技術(shù),它使得系統(tǒng)中有限的物理內(nèi)存競(jìng)爭(zhēng)進(jìn)程所需內(nèi)存空間得到滿足。虛擬內(nèi)存通過在各個(gè)進(jìn)程之間共享內(nèi)存,而使系統(tǒng)看起來有多于實(shí)際內(nèi)存的內(nèi)存容量。Linux支持虛擬內(nèi)存, 就是使用磁盤作為RAM的擴(kuò)展,使可用內(nèi)存相應(yīng)地有效擴(kuò)大。核心把當(dāng)前不用的內(nèi)存塊存到硬盤,騰出內(nèi)存給其它目的。當(dāng)原來的內(nèi)容又要使用時(shí),再讀回內(nèi)存。運(yùn)行于Linux的程序只看到大量的可用內(nèi)存,而不關(guān)心哪部分在磁盤上。當(dāng)然,讀寫硬盤比真的內(nèi)存慢(大約慢千倍),所以程序運(yùn)行較慢。用做虛擬內(nèi)存的這部分硬盤叫對(duì)換空間。

          虛擬內(nèi)存技術(shù)不僅僅讓我們可以使用更多的內(nèi)存,它還提供了下面這些功能:

          1.巨大的尋址空間

          操作系統(tǒng)讓系統(tǒng)看上去有比實(shí)際內(nèi)存大得多的內(nèi)存空間。虛擬內(nèi)存可以是系統(tǒng)中實(shí)際物理空間的許多倍。每個(gè)進(jìn)程運(yùn)行在其獨(dú)立的虛擬地址空間中,這些虛擬空間相互之間都完全隔離開來,所以進(jìn)程間不會(huì)互相影響。同時(shí),硬件虛擬內(nèi)存機(jī)構(gòu)可以將內(nèi)存的某些區(qū)域設(shè)置成不可寫,這樣可以保護(hù)代碼與數(shù)據(jù)不會(huì)受惡意程序的干擾。

          2.公平的物理內(nèi)存分配

          內(nèi)存管理子系統(tǒng)允許系統(tǒng)中每個(gè)運(yùn)行的進(jìn)程公平地共享系統(tǒng)中的物理內(nèi)存。

          3.共享虛擬內(nèi)存

          盡管虛擬內(nèi)存允許進(jìn)程有其獨(dú)立的虛擬地址空間,但有時(shí)也需要在進(jìn)程之間共享內(nèi)存。例如,有可能系統(tǒng)中有幾個(gè)進(jìn)程同時(shí)運(yùn)行BASH命令外殼程序。為了避免在每個(gè)進(jìn)程的虛擬內(nèi)存空間內(nèi)都存在BASH程序的拷貝,較好的解決辦法是系統(tǒng)物理內(nèi)存中只存在一份BASH的拷貝,并在多個(gè)進(jìn)程間共享。動(dòng)態(tài)庫(kù)則是另外一種進(jìn)程間共享執(zhí)行代碼的方式。共享內(nèi)存可用來作為進(jìn)程間通信(IPC)的手段,多個(gè)進(jìn)程通過共享內(nèi)存來交換信息。Linux支持SYSTEM V的共享內(nèi)存IPC機(jī)制。

          4.進(jìn)程的保護(hù)

          系統(tǒng)中的每一個(gè)進(jìn)程都有自己的虛擬地址空間。這些虛擬地址空間是完全分開的,這樣一個(gè)進(jìn)程的運(yùn)行不會(huì)影響其它進(jìn)程,并且硬件上的虛擬內(nèi)存機(jī)制是被保護(hù)的,內(nèi)存不能被寫入。這樣可以防止迷失的應(yīng)用程序覆蓋代碼的數(shù)據(jù)。

          5.Linux虛擬內(nèi)存實(shí)現(xiàn)機(jī)制

          Linux虛擬內(nèi)存的實(shí)現(xiàn)需要6種機(jī)制的支持:地址映射機(jī)制、內(nèi)存分配回收機(jī)制、緩存和刷新機(jī)制、請(qǐng)求頁(yè)機(jī)制、交換機(jī)制和內(nèi)存共享機(jī)制。

          內(nèi)存管理程序通過映射機(jī)制把用戶程序的邏輯地址映射到物理地址。當(dāng)用戶程序運(yùn)行時(shí),如果發(fā)現(xiàn)程序中要用的虛地址沒有對(duì)應(yīng)的物理內(nèi)存,就發(fā)出了請(qǐng)求頁(yè)要求。如果有空閑的內(nèi)存可供分配,就請(qǐng)求分配內(nèi)存(于是用到了內(nèi)存的分配和回收),并把正在使用的物理頁(yè)記錄在緩存中(使用了緩存機(jī)制)。如果沒有足夠的內(nèi)存可供分配,那么就調(diào)用交換機(jī)制;騰出一部分內(nèi)存。另外,在地址映射中要通過TLB(翻譯后援存儲(chǔ)器)來尋找物理頁(yè);交換機(jī)制中也要用到交換緩存,并且把物理頁(yè)內(nèi)容交換到交換文件中,也要修改頁(yè)表來映射文件地址。Linux虛擬內(nèi)存實(shí)現(xiàn)原理見圖1。


          上一頁(yè) 1 2 下一頁(yè)

          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();