0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

計算機內(nèi)存的基本知識詳細說明

Wildesbeast ? 來源:今日頭條 ? 作者:小二歲zzzz ? 2020-02-07 13:54 ? 次閱讀

介紹完內(nèi)存類別,內(nèi)存的基本結(jié)構(gòu),分段尋址原理,我們再來看我們程序是怎么使用內(nèi)存。

內(nèi)存中的程序

BSS段

通常是指用來存放程序中未初始化的全局變量的一塊內(nèi)存區(qū)域。BSS是英文Block Started by Symbol的簡稱。BSS段屬于靜態(tài)內(nèi)存分配?!敬鎯θ治闯跏蓟淖兞俊?/p>

數(shù)據(jù)段

數(shù)據(jù)段通常是指用來存放程序中 已初始化 的 全局變量 的一塊內(nèi)存區(qū)域。數(shù)據(jù)段屬于靜態(tài)內(nèi)存分配。 【存儲全局已初始化的變量】

代碼段

代碼段通常是指用來存放 程序執(zhí)行代碼 的一塊內(nèi)存區(qū)域。這部分區(qū)域的大小在程序運行前就已經(jīng)確定,并且內(nèi)存區(qū)域通常屬于 只讀 , 某些架構(gòu)也允許代碼段為可寫,即允許修改程序。在代碼段中,也有可能包含一些 只讀的常數(shù)變量 ,例如字符串常量等。程序段為程序代碼在內(nèi)存中的映射.一個程序可以在內(nèi)存中多有個副本.【存儲的是二進制后的程序代碼】

堆是用于存放進程運行中被動態(tài)分配的內(nèi)存段,它的大小并不固定,可動態(tài)擴張或縮減。當(dāng)進程調(diào)用malloc/free等函數(shù)分配內(nèi)存時,新分配的內(nèi)存就被動態(tài)添加到堆上(堆被擴張)/釋放的內(nèi)存從堆中被剔除(堆被縮減)【存儲初始化的局部變量】

棧又稱堆棧, 存放程序的 局部變量 (但不包括static聲明的變量, static 意味著 在數(shù)據(jù)段中 存放變量)。除此以外,在函數(shù)被調(diào)用時,棧用來傳遞參數(shù)和返回值。由于棧的先進先出特點,所以棧特別方便用來保存/恢復(fù)調(diào)用現(xiàn)場。儲動態(tài)內(nèi)存分配,需要程序員手工分配,手工釋放【儲存的動態(tài)未初始化變量】

cat /proc/maps 進程內(nèi)存映射

C語言文件編譯成a.out文件,并執(zhí)行該文件#./a.out,查看執(zhí)行該文件對應(yīng)的進程#ps au,可以看到2200就2200就是我們需要的pidut文件,并執(zhí)行該文件#./a.out查看執(zhí)行該文件對應(yīng)的進程#ps au,可以看到2200就2200就是我們需要的pid,#cat /proc/2200/maps 。

#a.out #include #include int q[200]; int main(void) { int i, n, *p; p = (int *) malloc(sizeof(int)); scanf("%d", &n); for (i=0; i<200; i++) q[i]=i; printf("%x %x %x %x %x ", main, q, p, &i, scanf); return 0; }

進程使用內(nèi)存狀況

參數(shù)解釋

#cat /proc/2200/maps

address: 0085d000-00872000 虛擬內(nèi)存區(qū)域的起始和終止地址文件所占的地址空間

perms:rw-p 權(quán)限:r=read, w=write, x=execute, s=shared, p=private(copy on write)

offset: 00000000 虛擬內(nèi)存區(qū)域在被映射文件中的偏移量

dev: 03:08 文件的主設(shè)備號和次設(shè)備號

inode: 設(shè)備的節(jié)點號,0表示沒有節(jié)點與內(nèi)存相對應(yīng)

name: /lib/ld-2.2.12.so 被映射文件的文件名

#cat /proc/2200/statm

size:任務(wù)虛擬地址空間大小

ident:正在使用的物理內(nèi)存大小

Shared:共享頁數(shù)

Trs:程序所擁有的可執(zhí)行虛擬內(nèi)存大小

Lrs:被映像倒任務(wù)的虛擬內(nèi)存空間的庫的大小

Drs:程序數(shù)據(jù)段和用戶態(tài)的棧的大小

dt:臟頁數(shù)量

UNIX/LINUX系統(tǒng)進程情況

c語言在UNIX/LINUX系統(tǒng)內(nèi)存使用圖示

左邊的是UNIX/LINUX系統(tǒng)的執(zhí)行文件,右邊是對應(yīng)進程邏輯地址空間的劃分情況。

堆棧區(qū)(stack),堆棧是由編譯器自動分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。棧的申請是由系統(tǒng)自動分配,如在函數(shù)內(nèi)部申請一個局部變量 int h,同時判別所申請空間是否小于棧的剩余空間,如若小于的話,在堆棧中為其開辟空間,為程序提供內(nèi)存,否則將報異常提示棧溢出。

堆(heap),堆一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時可能由OS回收 。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表。堆的申請是由程序員自己來操作的,在C中使用malloc函數(shù),而C++中使用new運算符,但是堆的申請過程比較復(fù)雜:當(dāng)系統(tǒng)收到程序的申請時,會遍歷記錄空閑內(nèi)存地址的鏈表,以求尋找第一個空間大于所申請空間的堆結(jié)點,然后將該結(jié)點從空閑結(jié)點鏈表中刪除,并將該結(jié)點的空間分配給程序,此處應(yīng)該注意的是有些情況下,新申請的內(nèi)存塊的首地址記錄本次分配的內(nèi)存塊大小,這樣在delete尤其是delete[]時就能正確的釋放內(nèi)存空間。

全局數(shù)據(jù)區(qū)(靜態(tài)區(qū)) (static),全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。 另外文字常量區(qū),常量字符串就是放在這里,程序結(jié)束后有系統(tǒng)釋放。

程序代碼區(qū),放著函數(shù)體的二進制代碼。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207910
  • 計算機
    +關(guān)注

    關(guān)注

    19

    文章

    7174

    瀏覽量

    87156
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2903

    瀏覽量

    73536
收藏 人收藏

    評論

    相關(guān)推薦

    了解計算機內(nèi)部結(jié)構(gòu)

    本帖最后由 eehome 于 2013-1-5 10:08 編輯 很好的一本學(xué)習(xí)計算機內(nèi)知識的書
    發(fā)表于 07-27 11:11

    計算機控制基本知識

    `計算機控制基本知識.ppt[hide][/hide]`
    發(fā)表于 08-05 20:03

    求推薦關(guān)于計算機內(nèi)存知識的入門書籍

    年后需要接觸到有關(guān)于計算機內(nèi)存條方面的測試工作,有沒有哪位大神能夠推薦下有關(guān)于計算機內(nèi)存條的書籍,是在不行文章鏈接也是可以的。多多益善,謝謝大家。
    發(fā)表于 01-23 14:37

    計算機內(nèi)部總線,計算機內(nèi)部總線是什么意思

    計算機內(nèi)部總線,計算機內(nèi)部總線是什么意思    由于計算機內(nèi)部的主要工作過程是信息傳送和加工的過程,因此在機器內(nèi)部各部件之間的數(shù)據(jù)傳送非常頻繁。為了
    發(fā)表于 04-13 10:31 ?7302次閱讀

    計算機基礎(chǔ)知識介紹

    計算機基礎(chǔ)知識計算機基礎(chǔ)知識計算機基礎(chǔ)知識
    發(fā)表于 12-03 16:13 ?0次下載

    計算機通信網(wǎng)基本知識

    一些關(guān)于計算機通信網(wǎng)的基本知識,應(yīng)付一下考試的
    發(fā)表于 01-05 17:21 ?4次下載

    計算機控制基本知識

    計算機控制基本知識對初學(xué)者很有用的ppt教學(xué)
    發(fā)表于 12-09 15:30 ?0次下載

    計算機網(wǎng)絡(luò)的基本知識詳細資料總結(jié)

    本文檔的主要內(nèi)容詳細介紹的是計算機網(wǎng)絡(luò)的基本知識詳細資料總結(jié)包括了:1 概述2 網(wǎng)絡(luò)分類3 數(shù)據(jù)傳輸4 網(wǎng)絡(luò)拓撲結(jié)構(gòu)5 網(wǎng)絡(luò)體系結(jié)構(gòu)6 網(wǎng)絡(luò)互連7 網(wǎng)絡(luò)操作系統(tǒng)8 Internet基礎(chǔ)
    發(fā)表于 09-27 17:00 ?14次下載
    <b class='flag-5'>計算機</b>網(wǎng)絡(luò)的<b class='flag-5'>基本知識</b><b class='flag-5'>詳細</b>資料總結(jié)

    微機原理與接口技術(shù)教程之計算機基本知識詳細資料概述

    本文檔的主要內(nèi)容詳細介紹的是微機原理與接口教程之計算機基本知識詳細資料概述主要內(nèi)容包括了:計算機的發(fā)展概況和微型
    發(fā)表于 01-09 08:00 ?16次下載
    微機原理與接口技術(shù)教程之<b class='flag-5'>計算機</b><b class='flag-5'>基本知識</b>的<b class='flag-5'>詳細</b>資料概述

    微型計算機的基礎(chǔ)知識詳細資料說明

    本文檔的主要內(nèi)容詳細介紹的是微型計算機的基礎(chǔ)知識詳細資料說明主要內(nèi)容有:1.微型計算機的組成及工
    發(fā)表于 05-09 08:00 ?0次下載
    微型<b class='flag-5'>計算機</b>的基礎(chǔ)<b class='flag-5'>知識</b><b class='flag-5'>詳細</b>資料<b class='flag-5'>說明</b>

    如何去優(yōu)化計算機內(nèi)存

    大多數(shù)計算和存儲部署如今面臨的情況是,計算機內(nèi)存空間都受到了上限的限制。
    發(fā)表于 11-28 17:48 ?1123次閱讀
    如何去優(yōu)化<b class='flag-5'>計算機內(nèi)存</b>

    光纖的基本知識詳細說明

    計算機網(wǎng)絡(luò)已經(jīng)進入千兆時代,把我們的電腦和Internet連接起來的網(wǎng)線也在逐步變成光纖。這篇文章帶大家普及一下光纖的基本知識。
    的頭像 發(fā)表于 02-07 15:39 ?9530次閱讀

    計算機系統(tǒng)的層次結(jié)構(gòu)詳細說明

    通常由用戶用高級語言編寫程序,然后講它和數(shù)據(jù)一起送入計算機內(nèi),再由計算機將其翻譯成機器能識別的機器語言程序,機器自動運行該機器語言程序,并將其計算結(jié)果輸出。
    的頭像 發(fā)表于 02-22 16:44 ?6794次閱讀

    計算機的海明校驗及其實現(xiàn)詳細說明

    本文檔的主要內(nèi)容詳細介紹的是計算機的海明校驗及其實現(xiàn)詳細說明。
    發(fā)表于 04-30 08:00 ?3次下載
    <b class='flag-5'>計算機</b>的海明校驗及其實現(xiàn)<b class='flag-5'>詳細說明</b>

    一圖詳細講解計算機預(yù)備知識

    一圖詳細講解計算機預(yù)備知識
    發(fā)表于 04-19 09:14 ?2次下載