40、程序中的內存佈局

先看一張示意圖:不同代碼在可執行程序中的對應關係


    程序和進程的不同:

     程序是 靜態的 概念,表現形式爲一個可執行文件
進程是 動態的 概念,程序由操作系統加載運行後得到進程
每個程序可以對應多個進程
每個進程只能對應一個程序

問題:包含腳本代碼的文本文件是一種類型的可執行程序嗎?如果是,對應什麼樣的進程呢?


腳本程序是一種可執行程序,但是它需要操作系統加載腳本解釋程序來生成進程,然後進程對腳本文件進行讀取並解釋執行。

文件佈局在內存中的映射:

    

各個段的作用:
堆棧段在程序運行後才正式存在,是程序運行的基礎
.bss段存放的是未初始化全局變量和靜態變量
.text段存放的是程序中的可執行代碼
.data段保存的是已經初始化了的全局變量和靜態變量
.rodata段存放程序中的常量值,如字符串常量

靜態存儲區通常指程序中的.bss和.data段
只讀存儲區通常指的是程序中的.rodata段(const修飾的變量)
局部變量所佔空間爲棧上的空間
動態空間爲堆上的空間
程序可執行代碼存放在.text段

問題:同是全局變量和靜態變量,爲什麼初始化和未初始化的保存在不同段中?

效率問題。
未初始化變量(.bss)的在加載時全部初始化爲0,這樣加載速度可以更快。初始化(.data)後的變量必須在加載時保證一一對應,且必須保存好,相對複雜一點。區分保存有利於程序加載。

小結:
程序源碼在編譯後對應可執行程序中的不同存儲區
程序和進程不同,程序靜態概念,進程是動態概念
堆棧段是程序運行的基礎,只存在於進程空間中
程序可執行程序存放於.text段,是隻讀的
.bss(未初始化的)和.data(已經初始化的)段用於保存全局變量和靜態變量



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章