• <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++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

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

            一、Linux進(jìn)程的五個(gè)段

            下面我們來簡單歸納一下進(jìn)程對應(yīng)的內(nèi)存空間中所包含的5種不同的數(shù)據(jù)區(qū)都是干什么的。

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

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

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

            4)堆(heap):堆是用于存放進(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)存時(shí),新分配的內(nèi)存就被動(dòng)態(tài)添加到堆上(堆被擴(kuò)張);當(dāng)利用free等函數(shù)釋放內(nèi)存時(shí),被釋放的內(nèi)存從堆中被剔除(堆被縮減)

              它的物理內(nèi)存空間是由程序申請的,并由程序負(fù)責(zé)釋放。

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

               它是由操作系統(tǒng)分配的,內(nèi)存的申請與回收都由OS管理。

            舉個(gè)具體的C語言的例子吧:

            //main.c

            int a = 0; //全局初始化區(qū)

            char *p1; //全局未初始化區(qū)

            main()

            {

            static int c =0 //全局(靜態(tài))初始化區(qū)

            int b; //

            char s[] = "abc"; //

            char *p2; //

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

            p1 = (char *)malloc(10);

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

            }

            二、各個(gè)段在內(nèi)存中的組織

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

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

            + envstrings 環(huán)境變量字串    

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

            + argv string 命令行字串        

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

            + env pointers 環(huán)境變量指針表

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

            + argv pointers命令行參數(shù)指針表

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

            + argc 命令行參數(shù)個(gè)數(shù) 

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

            +     main函數(shù)的棧幀  

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

            +     被調(diào)用函數(shù)的棧幀

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

            +         ......                

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


            +       (heap)                

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


            +   BSS 未初始化全局?jǐn)?shù)據(jù)     

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


            +   Data 初始化的全局?jǐn)?shù)據(jù)    

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

            +   Text  代碼段                 

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

             

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

            欧洲精品久久久av无码电影 | 久久久久成人精品无码| 欧美亚洲另类久久综合| 国产精品成人无码久久久久久 | 国产精品99久久免费观看| 99久久免费只有精品国产| 婷婷久久综合九色综合九七| 久久九九精品99国产精品| 久久亚洲欧美日本精品| 久久夜色精品国产亚洲| 国产精品一久久香蕉国产线看| 国产精品gz久久久| 色88久久久久高潮综合影院| 色偷偷88欧美精品久久久| 九九精品99久久久香蕉| 久久久久久久综合综合狠狠| 国内精品久久久久久99蜜桃| 亚洲国产婷婷香蕉久久久久久| 久久er国产精品免费观看2| 亚洲国产成人久久精品99| 久久精品国产91久久综合麻豆自制| 久久亚洲AV无码西西人体| 久久久久四虎国产精品| 久久亚洲国产成人精品性色| 三级三级久久三级久久| 久久精品国产99久久香蕉| 久久精品国产一区| 99国产欧美久久久精品蜜芽 | 久久人人爽人人爽人人爽| 一本大道久久a久久精品综合| 久久精品亚洲精品国产色婷| 久久久久久综合网天天| 亚洲人成无码www久久久| 久久久久99精品成人片| 99久久亚洲综合精品成人| 国内精品久久久久久野外| 精品无码久久久久久午夜| 亚洲人成伊人成综合网久久久| 亚洲女久久久噜噜噜熟女| 亚洲国产精品久久久天堂| 国产成人久久精品一区二区三区|