在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > linux下內存管理學習心得(一)

            linux下內存管理學習心得(一)

            作者: 時間:2016-11-23 來源:網絡 收藏

              然而,如果該頁被修改過,操作系統(tǒng)必須保留該頁的內容以便晚些時候在被訪問。這種頁稱為"臟(dirty)頁",當它被從內存中刪除時,將被保存在一個稱為交換文件的特殊文件中。

              相對于處理器和物理內存的速度,訪問交換文件要很長時間,操作系統(tǒng)必須在將頁寫到磁盤以及再次使用時取回內存的問題上花費心機。

              如果用來決定哪一頁被淘汰或交換的算法不夠高效的話,就可能出現(xiàn)稱為"抖動"的情況。在這種情況下,頁面總是被寫到磁盤又讀回來,操作系統(tǒng)忙于此而不能進行真正的工作。

              linux使用"最近最少使用(Least Recently Used ,LRU)"頁面調度技巧來公平地選擇哪個頁可以從系統(tǒng)中刪除。這種設計系統(tǒng)中每個頁都有一個"年齡",年齡隨頁面被訪問而改變。頁面被訪問越多它越年輕;被訪問越少越老。年老的頁是用于交換的最佳候選頁。

            四、鏡像在進程空間

            我們來看看,當我們寫好一個應用程序,編譯后它都有什么東東?

              例如:

              用命令size a.out會得到:

              其中text是放的是代碼,data放的是初始化過的全局變量或靜態(tài)變量,bss放的是未初始化的全局變量或靜態(tài)變量

              由于歷史原因,C程序一直由下列幾部分組成:

              A.正文段。這是由cpu執(zhí)行的機器指令部分。通常,正文段是可共享的,所以即使是經常執(zhí)行的程序(如文本編輯程序、C編譯程序、shell等)在存儲器中也只需要有一個副本,另外,正文段常常是只讀的,以防止程序由于意外事故而修改器自身的指令。

              B.初始化數(shù)據段。通常將此段稱為數(shù)據段,它包含了程序中需賦初值的變量。例如,C程序中任何函數(shù)之外的說明:

              int maxcount = 99;(全局變量)

              C.非初始化數(shù)據段。通常將此段稱為bss段,這一名稱來源于早期匯編程序的一個操作,意思是"block started by symbol",在程序開始執(zhí)行之前,內核將此段初始化為0。函數(shù)外的說明:

              long sum[1000];

              使此變量存放在非初始化數(shù)據段中。

              D.棧。自動變量以及每次函數(shù)調用時所需保存的信息都存放在此段中。每次函數(shù)調用時,其返回地址、以及調用者的環(huán)境信息(例如某些機器寄存器)都存放在棧中。然后,新被調用的函數(shù)在棧上為其自動和臨時變量分配存儲空間。通過以這種方式使用棧,C函數(shù)可以遞歸調用。

              E.堆。通常在堆中進行動態(tài)存儲分配。由于歷史上形成的慣例,堆位于非初始化數(shù)據段頂和棧底之間。

              從上圖我們看到??臻g是下增長的,堆空間是從下增長的,他們會會碰頭呀?一般不會,因為他們之間間隔很大,如:

              #include

              #include

              int bss_var;

              int data_var0 = 1;

              int main()

              {

              printf("Test location:");

              printf(" Address of main(Code Segment):%p",main);

              printf("_____________________________________");

              int stack_var0 = 2;

              printf("Stack location:");

              printf(" Initial end of stack:%p",&stack_var0);

              int stack_var1 = 3;

              printf(" New end of stack:%p",&stack_var1);

              printf("_____________________________________");

              printf("Data location:");

              printf(" Address of data_var(Data Segment):%p",&data_var0);

              static int data_var1 = 4;

              printf(" New end of data_var(Data Segment):%p",&data_var1);

              printf("_____________________________________");

              printf("BSS location:");

              printf(" Address of bss_var:%p",&bss_var);

              printf("_____________________________________");

              printf("Heap location:");

              char *p = (char *)malloc(10);

              printf(" Address of head_var:%p",p);

              return 0;

              }

              運行結果如下:

              呵呵,這里我們看到地址了,這個地址是虛擬地址,這些地址時怎么來的呢?其實在我們編譯的時候,

              這些地址就已經確定了,如下圖中紅線。

              也就是說,我們不論我們運行a.out程序多少次這些地址都是一樣的。我們知道,linux操作系統(tǒng)每個進程的地址空間都是獨立的,其實這里的獨立說得是物理空間上得獨立。


            上一頁 1 2 下一頁

            評論


            技術專區(qū)

            關閉