根據大學所學的知識,我們知道程序都是需要被加載到內存中才能被執行的,而加載到內存當中的數據只能是1或0,即高電頻或低電頻。那么操作系統如何去識別內存中0011究竟是代碼還是數據還是函數或者常量呢?下面我們就簡單說一下程序的執行流程。
- 將編譯后的程序加載到操作系統的執行內存中。
- 操作系統把加載到內存中的數據進行人為的分區,大致分為:
- .data區:常量區,存放程序中的所有靜態常量,相當于java中的public static 的常量,在C語言中則是通過宏定義(define)聲明的常量。
- .code區:方法區,存放funcation編譯后的聲明和實現的描述(其實也是0101).
- 棧(Stack)空間:程序運行時存放變量的空間,大小由操作系統指定,是一塊連續的內存空間,訪問速度和效率比Heap要高一些。
- 堆(Heap)空間:存放對象的一塊不連續的內存空間,訪問、存儲效率比棧稍低。
- 劃分好區域并將對應的數據加載到各自分區后,各個內存分區開始配合工作,舉例:
#include<stdio.h>
#define PI 3.1415
void swap(int* p, int* q){
int temp;
temp = *p;
*p=*q;
*q = temp;
}
int main(){
int i = 3;
int j = 5;
swap(&i,&j);
printf("i=%d\n",i);
printf("j=%d\n",j);
system("pause");
}
首先操作系統會將define的PI常量放到.data區中,然后從.code區尋找入口函數main()開始執行,
第一行會在??臻g中申請內存空間存放int i=3;
第二行在??臻g中申請內存存放int j=5;
第三行系統會去.code區尋找swap(int* p, int* q)函數并執行,先在棧空間申請內存創建p和q這兩個形參,然后申請棧內存創建int temp...當函數執行完之后,??臻g發現p、q、temp已經沒有程序在使用了,就會對這個幾個局部變量執行出棧操作,騰出內存空間;第四、第五、第六行以此類推。
最后簡單說一下堆內存與malloc()函數:動態分配內存空間,也就是向Heap申請一塊指定字節大小的內存。例:
#include <stdlib.h>
char *ptr = (char *)malloc(10);
ptr被存放在棧中,malloc(10)向Heap申請了10個字節的內存空間用來存放字符,當使用完畢之后需手動釋放