Linux內(nèi)存管理上

Linux內(nèi)存管理上

ID:45565877

大小:48.91 KB

頁(yè)數(shù):9頁(yè)

時(shí)間:2019-11-14

Linux內(nèi)存管理上_第1頁(yè)
Linux內(nèi)存管理上_第2頁(yè)
Linux內(nèi)存管理上_第3頁(yè)
Linux內(nèi)存管理上_第4頁(yè)
Linux內(nèi)存管理上_第5頁(yè)
資源描述:

《Linux內(nèi)存管理上》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。

1、Linux內(nèi)存管理(上)摘要:本章首先以應(yīng)用程序開(kāi)發(fā)者的角度審視Linux的進(jìn)程內(nèi)存管理,在此基礎(chǔ)上逐步深入到內(nèi)核中討論系統(tǒng)物理內(nèi)存管理和內(nèi)核內(nèi)存地使用方法。力求從外自內(nèi)、水到渠成地引導(dǎo)網(wǎng)友分析Linux地內(nèi)存管理與使用。在本章最后我們給出一個(gè)內(nèi)存映射地實(shí)例,幫助網(wǎng)友們理解內(nèi)核內(nèi)存管理與用戶內(nèi)存管理之間地關(guān)系,希望大家最終能駕馭Linux內(nèi)存管理。刖弓內(nèi)存管理一向是所有操作系統(tǒng)書(shū)籍不惜筆墨重點(diǎn)討論的內(nèi)容,無(wú)論市面上或是網(wǎng)上都充斥著大量涉及內(nèi)存管理的教材和資料。因此我們這里所要寫(xiě)的Linux內(nèi)存管理采取必重就輕的策略,從理論層面就

2、不去板門(mén)弄斧,貽笑人方了。我們最想做的和可能做到的是以開(kāi)發(fā)者的角度談?wù)剬?duì)內(nèi)存管理的理解,最終FI的是把我們?cè)趦?nèi)核開(kāi)發(fā)屮使用內(nèi)存的經(jīng)驗(yàn)和對(duì)Linux內(nèi)存管理的認(rèn)識(shí)與大家共享。當(dāng)然這其中我們也會(huì)設(shè)計(jì)一些諸如段頁(yè)等內(nèi)存管理的基本理論,但我們目的不是為了強(qiáng)調(diào)理論,而是為了指導(dǎo)理解開(kāi)發(fā)屮的實(shí)踐,所以僅僅點(diǎn)到為止,不做深究。遵循“理論來(lái)源于實(shí)踐”的“教條”,我們先不必一下了就鉆入內(nèi)核里去看系統(tǒng)內(nèi)存到底是如何管理,那樣往往會(huì)讓你陷入似懂非懂的窘境(我當(dāng)年就犯了這個(gè)錯(cuò)誤!)。所以最好的方式是先從外部(用戶編程范疇)來(lái)觀察進(jìn)程如何使用內(nèi)存,等到對(duì)

3、大家內(nèi)存使用有了較直觀的認(rèn)識(shí)后,再深入到內(nèi)核屮去學(xué)習(xí)內(nèi)存如何被管理等理論知識(shí)。最后再通過(guò)一個(gè)實(shí)例編程將所講內(nèi)容融會(huì)貫通。進(jìn)程與內(nèi)存進(jìn)程如何使用內(nèi)存?毫無(wú)疑問(wèn)所冇進(jìn)程(執(zhí)行的程序)都必須占用一定數(shù)量的內(nèi)存,它或是用來(lái)存放從磁盤(pán)載入的程序代碼,或是存放取口用戶輸入的數(shù)據(jù)等等。不過(guò)進(jìn)程對(duì)這些內(nèi)存的管理方式因內(nèi)存用途不一而不盡相同,冇些內(nèi)存是事先靜態(tài)分配和統(tǒng)一冋收的,而有些卻是按需要?jiǎng)討B(tài)分配和冋收的。對(duì)任何一個(gè)普通進(jìn)程來(lái)講,它都會(huì)涉及到5種不同的數(shù)據(jù)段。稍有編程知識(shí)的朋友都該能想到這幾個(gè)數(shù)據(jù)段種包含冇“程序代碼段”、“程序數(shù)據(jù)段”、“程

4、序堆棧段”等。不錯(cuò),這幾種數(shù)據(jù)段都在其中,但除了以上幾種數(shù)據(jù)段Z外,進(jìn)程述另外包含兩種數(shù)據(jù)段。下而我們來(lái)簡(jiǎn)單歸納一下進(jìn)程對(duì)應(yīng)的內(nèi)存空間屮所包含的5種不同的數(shù)據(jù)區(qū)。代碼段??代碼段是用來(lái)存放可執(zhí)行文件的操作指令,也就是說(shuō)是它是可執(zhí)行程序在內(nèi)存種的鏡像。代碼段需要防止在運(yùn)行時(shí)被非法修改,所以只準(zhǔn)許讀取操作,而不允許寫(xiě)入(修改)操作——它是不可寫(xiě)的。數(shù)據(jù)段:數(shù)據(jù)段用來(lái)存放可執(zhí)行文件中已初始化全局變量,換句話說(shuō)就是存放程序靜態(tài)分配⑴的變量和全局變量。BSS段[2]:BSS段包含了程序屮未初始化全局變量,在內(nèi)存屮bss段全部置零。堆(he

5、ap)??堆是用于存放進(jìn)程運(yùn)行屮被動(dòng)態(tài)分配的內(nèi)存段,它大小并不固定,可動(dòng)態(tài)擴(kuò)張或縮減。當(dāng)進(jìn)程調(diào)用malloc等函數(shù)分配內(nèi)存吋,新分配的內(nèi)存就被動(dòng)態(tài)添加到堆上(堆被擴(kuò)張);當(dāng)利用free等函數(shù)釋放內(nèi)存時(shí),被釋放的內(nèi)存從堆屮被剔除(堆被縮減)棧:棧是用戶存放程序臨時(shí)創(chuàng)建的局部變量,也就是說(shuō)我們函數(shù)扌舌弧“{}”屮定義的變量(但不包括static聲明的變量,static意味這在數(shù)據(jù)段屮存放變量)。除此以外在函數(shù)被調(diào)用時(shí),其參數(shù)也會(huì)被壓入發(fā)起調(diào)用的進(jìn)程棧中,并11待到調(diào)用結(jié)束后,函數(shù)的返回值也回被存放回棧中。由于棧的先進(jìn)先出特點(diǎn),所以棧

6、特別方便用來(lái)保存/恢復(fù)調(diào)用現(xiàn)場(chǎng)。從這個(gè)意義上將我們可以把堆??闯梢粋€(gè)臨時(shí)數(shù)據(jù)寄存、交換的內(nèi)存區(qū)。進(jìn)程如何組織這些區(qū)域?上述幾種內(nèi)存區(qū)域中數(shù)據(jù)段、BSS和堆通常是被連續(xù)存儲(chǔ)的——內(nèi)存位置上是連續(xù)的,而代碼段和棧往往會(huì)被獨(dú)立存放。有趣的是堆和棧兩個(gè)區(qū)域關(guān)系很“曖味”,他們一個(gè)向下“長(zhǎng)”G386休系結(jié)構(gòu)屮棧向下、堆向上),一個(gè)向上“長(zhǎng)”,相對(duì)而生。但你不必?fù)?dān)心他們會(huì)碰頭,因?yàn)樗麄僙間間隔很大(到底大到多少,你可以從下面的例子程序計(jì)算一下),絕少有機(jī)會(huì)能碰到一起。下圖簡(jiǎn)要描述了進(jìn)程內(nèi)存區(qū)域的分布:數(shù)據(jù)段BSS代碼段堆棧“事實(shí)勝于雄辯”,

7、我們用一個(gè)小例子(原形取自《User-LevelMemoryManagement》)來(lái)展示上面所講的各種內(nèi)存區(qū)的差別與位置。ffinclude^include^includemtbss_var;intdata_^arO=l;intmain(intargc,char*^argv){printf(,fbelowareaddressesoftypesofprocess'smem/nu);printf(nTextlocation:/n"丿;printf(f7tAddressof

8、main(CodeSegment):%p/n9main);printfC;/廿);intstack_i^ir0=2;printf(ffStackLocation:/n"丿;printf(f7tInitialendofstack:%p/nf&stack_var

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫(huà)的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。