日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux C 进程内部存储管理

發布時間:2024/4/17 linux 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 进程内部存储管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。