• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            Linux內存管理-進程的五個數據段

            Posted on 2009-08-17 13:53 Prayer 閱讀(1496) 評論(0)  編輯 收藏 引用 所屬分類: 計算機基礎

            進 程(執行的程序)會占用一定數量的內存,它或是用來存放從磁盤載入的程序代碼,或是存放取自用戶輸入的數據等等。不過進程對這些內存的管理方式因內存用途 不一而不盡相同,有些內存是事先靜態分配和統一回收的,而有些卻是按需要動態分配和回收的。對任何一個普通進程來講,它都會涉及到5種不同的數據段。

            一、Linux進程的五個段

            下面我們來簡單歸納一下進程對應的內存空間中所包含的5種不同的數據區都是干什么的。

            1)代碼段:代碼段是用來存放可執行文件的操作指令,也就是說是它是可執行程序在內存中的鏡像。代碼段需要防止在運行時被非法修改,所以只準許讀取操作,而不允許寫入(修改)操作——它是不可寫的。

            2)數據段:數據段用來存放可執行文件中已初始化全局變量,換句話說就是存放程序靜態分配的變量和全局變量。

            3BSS段:BSS段包含了程序中未初始化的全局變量,在內存中 bss段全部置零。

            4)堆(heap):堆是用于存放進程運行中被動態分配的內存段,它的大小并不固定,可動態擴張或縮減。當進程調用malloc等函數分配內存時,新分配的內存就被動態添加到堆上(堆被擴張);當利用free等函數釋放內存時,被釋放的內存從堆中被剔除(堆被縮減)

              它的物理內存空間是由程序申請的,并由程序負責釋放。

            5)棧:棧是用戶存放程序臨時創建的局部變量,也就是說我們函數括弧“{}”中定義的變量(但不包括static聲明的變量,static意味著在數據段中存放變量)。除此以外,在函數被調用時,其參數也會被壓入發起調用的進程棧中,并且待到調用結束后,函數的返回值也會被存放回棧中。由于棧的先進先出特點,所以棧特別方便用來保存/恢復調用現場。從這個意義上講,我們可以把堆棧看成一個寄存、交換臨時數據的內存區。

               它是由操作系統分配的,內存的申請與回收都由OS管理。

            舉個具體的C語言的例子吧:

            //main.c

            int a = 0; //全局初始化區

            char *p1; //全局未初始化區

            main()

            {

            static int c =0 //全局(靜態)初始化區

            int b; //

            char s[] = "abc"; //

            char *p2; //

            char *p3 = "123456"; //"123456\0"在常量區,p3在棧上。

            p1 = (char *)malloc(10);

            p2 = (char *)malloc(20); //分配得來得1020字節的區域就在堆區。

            }

            二、各個段在內存中的組織

            各個段段在線性空間中的組織。直接上圖:

            +--------------------------------   高地址

            + envstrings 環境變量字串    

            +--------------------------------

            + argv string 命令行字串        

            +--------------------------------

            + env pointers 環境變量指針表

            +--------------------------------

            + argv pointers命令行參數指針表

            +--------------------------------

            + argc 命令行參數個數 

            +--------------------------------

            +     main函數的棧幀  

            +--------------------------------

            +     被調用函數的棧幀

            +--------------------------------

            +         ......                

            +--------------------------------


            +       (heap)                

            +--------------------------------


            +   BSS 未初始化全局數據     

            +--------------------------------


            +   Data 初始化的全局數據    

            +--------------------------------

            +   Text  代碼段                 

            +--------------------------------   

             

            其中,HeapBSSData這三個段在物理內存中是連續存放的,可以這么理解:這三個是一體的。TextStack是獨立存放的,這是現在Linux中個段的分布,在0.11中代碼段和數據段不是分立的,是在一起的也就是說數據段和代碼段是一個段,當然了,堆與BSS也與它們一起了。從0.11的task_struct中還可以看出數據段、堆棧段的描述符是一個,都在ldt[2]處。

            久久精品成人免费网站| 亚洲精品乱码久久久久久自慰| 久久国产精品成人片免费| 婷婷久久久亚洲欧洲日产国码AV| 久久精品国产亚洲av影院| 欧美精品一区二区精品久久| 99国内精品久久久久久久| 岛国搬运www久久| 久久亚洲私人国产精品vA| 国产成人精品久久亚洲高清不卡 | 色8激情欧美成人久久综合电| 色偷偷久久一区二区三区| 久久久综合香蕉尹人综合网| 99久久人妻无码精品系列蜜桃 | 亚洲人成伊人成综合网久久久 | 狠狠色综合久久久久尤物| 久久精品国产亚洲av麻豆图片| 婷婷综合久久狠狠色99h| 久久综合香蕉国产蜜臀AV| 午夜精品久久久久久影视777| 国产一级持黄大片99久久| 色偷偷偷久久伊人大杳蕉| 四虎国产精品成人免费久久| 久久精品成人免费国产片小草| 99精品久久久久中文字幕| 无码人妻久久一区二区三区免费 | 一极黄色视频久久网站| 亚洲综合婷婷久久| 国产成人久久精品区一区二区| 久久无码人妻一区二区三区| 18岁日韩内射颜射午夜久久成人| 色8激情欧美成人久久综合电| 久久久久国产精品麻豆AR影院| 亚洲国产精品婷婷久久| 88久久精品无码一区二区毛片 | 久久国产亚洲精品| 思思久久99热只有频精品66| 亚洲欧美成人久久综合中文网| 综合久久精品色| 国产成人精品综合久久久久| 亚洲国产精品高清久久久|