C C 高階之程序空間(二)

2021-08-16 04:25:41 字數 1671 閱讀 4839

程序空間

首先認識程序和程式的區別1、程式:原始檔經過編譯,生成可執行檔案,一般window下是*.exe檔案,linux下是a.out。程式是靜態的。程式包含3個區域,text,inial data, uinial data。

2、程序:被作業系統載入到記憶體至執行結束的過程。程序是動態的。程序包含5個區域,text,inial data, uinial data,heap,stack。

通過下面這這張圖可以更清晰的認識,程序和程式的區別。

接下來是分析程序空間簡概圖

以乙個例項解析變數在程序空間的儲存區域全域性變數和靜態變數,如果賦初始值,儲存在data的inial的rw區域,放在.exe檔案裡面。如果沒有賦初始值,儲存在data的uninial的bss區,當 .exe被執行時,會呼叫命令將全域性變數和靜態變數初始化為0。

區域性變數壓棧。

全域性變數的生命週期和main函式一樣長。

靜態變數只初始化一次。

函式壓棧與出棧

通過圖1、2、3進行形象解釋圖1左邊表示的是主函式會呼叫fa()函式,fa()函式會呼叫fb()函式,右邊表示程序空間壓棧情況

首先,將系統執行狀態壓棧,然後將返回位址壓棧;

然後將main函式引數壓棧,此時要先儲存main函式執行狀態,得到返回位址後才能把fa引數壓棧;

fa呼叫fb時和main呼叫fa時同理

圖1

圖2解析圖2表示fb呼叫完後要出棧,fb所包含的內容會被清空

圖3表示的是最終狀態就是main執行結束後的狀態。

根據程序呼叫壓棧過程,很容易明白mn的值沒有進行交換的原因,因為swap壓棧後建立的a b變數壓棧,ab交換後,swap執行結束出棧,ab的值也會跟著消失,所以mn的值並沒有進行交換。

void swap(int a,int b)

void main()

圖2

圖3

高階程式設計之程序(二)

進 程 1 程序的退出 return 只有在main函式中執行才能將程序退出。exit 程序退出函式,會自動重新整理快取區。exit 強制退出程序,不會重新整理快取區。2 特殊程序 2.1 孤兒程序 父程序退出,而子程序單獨存在。子程序變成孤兒程序。2.2 殭屍程序 父程序存在,子程序退出。父程序沒...

高階程序管理之程序優先順序

linux不會隨意對程序進行排程。事實上,應用程式會被指派優先順序,優先順序會對程序何時執行以及執行多久造成影響。以往,unix將優先順序成為友善值 nice value 因為友善值背後的概念是通過調低乙個程序的優先順序來 善待 系統上的其他程序,這讓其他程序可以使用較多的處理器空間。友善值可控制乙...

Linux核心之程序位址空間

程序使用的是虛擬記憶體中的位址,也叫線性位址,由作業系統協助相關硬體 如mmu 對映到實體地址。線性位址是通過頁表 page table 對映到物理記憶體,頁表由作業系統維護並被處理器引用。核心空間在頁表中擁有較高特權級,因此使用者態程式試圖訪問這些頁時會導致乙個頁錯誤。在linux中,核心空間是持...