linux C 进程内部存储管理
一方面能足夠強健的承受。另一方面又能保持清醒的品質,正是一個擁有一顆完善不可戰勝的靈魂的標志
----------馬克.奧勒留
之所以寫上面這句話是看的一些鳥書,每章前面有有那么一句名言貌似引導該章的思想。我也效仿,上句摘自沉思錄卷一目錄。當然上句純屬裝B,與以下內容無關,本來我計劃寫進程控制,及通訊,想想還是從0開始來。也就是后所下一篇就是進程的控制了。
一 談到內存,首先想到的是數據存儲,多字節存儲分為大端小端,大端就是數據中的最低位存數存儲在內存中的最高位,小端是數據中的最低位存儲在內存中的最低位,其實我們的用的pc都是intel的X86都是小端存儲,ARM一般是大端大端存儲,我們來寫個小程序來看看你的電腦時大端還是小段,以后給開發板板寫的時候也可看看他的內存存儲方式。
1 #include<stdio.h> 2 3 int mian() 4 5 { 6 7 int a = 0x12345678; 8 9 char *p; 10 11 p = (char *) &a; 12 13 if (*p == 0x78) 14 15 { 16 17 printf(" 這是小端。。。。\n"); 18 19 } 20 21 else 22 23 printf("這是大端。。。。\n"); 24 25 return 0; 26 27 }二 :?C程序內存分布分為 代碼段 ?數據段 棧和堆 ?常量存儲
代碼段就是cpu執行的指令。當你打開多個一個程序的多個窗口,例如打開多個shell,他們使用的是同一個代碼段,其他的數據段不同。
數據段和緩沖段: 初始化的數據段(.data)就是數據段,它包括明確給定初值的全局變量和靜態變量。如int a = 10; (全局變量);static int b = 5;
編譯的時候該段的大小時不會改變的,還有就是這個段的內容就直接在內存中,不在外存上。
非初始化的數據段(.bss):在這個段上的內容是沒有給初值的全局變量,如int max; 這段內容是存在外存上的。表達的不是很請,代碼最具有說服力。
#include<stdio.h> int a[30] int main { printf ("hello world \n");return 0; }這里有全局變量a[30],int 占四個字節,int a[30] 應該占120字節,如果注釋掉int a[30]變量,兩個程序的大小應該相差120字節,可是事實上只差18字節,所以.bss并不是程序的一部分,保存在外存中。多的18個字節是系統標記。bss段的內容和屬性。這里沒有把具體結果貼出來,有興趣可以編譯完后看看他們的二進制文件的大小。
三 棧 : 所有自動變量以及函數調用時所要保存的信息,都儲存在棧上。*每次調用時棧會隨著函數的調用而增長,隨著函數調用結束而消亡。所以我們要避免將一個指向局部變量的指針作為函數返回。因為調用完就變量就釋放了,返回不來了。
自動變變量有3中存儲方式:1存儲在數據段或bss端(靜態局部變量)。2存儲在寄存器中(寄存器變量)。3存儲在棧中(一般自動變量)。自動變量的作用域往往只在函數中。
四 堆 :堆用于存儲用戶申請的存儲空間。在堆中進行動態內存分配。 int * p = (int *)malloc(sizeof(int));這里給大家補充個小知識 “*”的兩個作用。一個就是大家常用的是地址解析,就是指針。第二個就是如int *p = &a;*的作用是告訴編譯器p將存儲一個整型的的地址。上面p是指向分配內存的首地址。其實動態分配內存有三個函數
malloc ?calloc realloc具體可以google。要是再說詳細就跑題了。最常用的的還是malloc.
五 常量的存儲:常量分為簡單的,和復雜的。如123,‘a’,復雜的如'yaoze studying...',簡單的就隨指令一起存儲,這樣可以提高程序的運行速度,長的字符串不會存儲在代碼段,這樣會導致代碼段變大。所以復雜常量,編譯器會將存儲的首地址轉換成一個簡單的變量隨指令存儲,把復雜的常量存儲在特殊的內存段中叫.rodata.
這基本上差不多就介紹完了,由于是處女作,有錯請探討。。。。。。
ps : 接下來會一個持續更新,有關linux , C 的一些東西。下集預告:進程控制。
?
?
轉載于:https://www.cnblogs.com/xiaoyaoc/archive/2013/04/09/3009829.html
總結
以上是生活随笔為你收集整理的linux C 进程内部存储管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS对JSON的操作总结
- 下一篇: linux 其他常用命令