国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Linux】程序地址空間

這篇具有很好參考價值的文章主要介紹了【Linux】程序地址空間。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

首先引入地址空間的作用

  1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <stdlib.h>
  4 

	int g_val = 100;
  6 int main()
  7 {
  8   pid_t id = fork();
  9   if(id == 0)
 10   {
 11     int cnt = 0;
 12     while(1)
 13     {
 14       printf("I am child,pid : %d,ppid : %d,g_val : %d,&g_val : %p\n",getpid(),getppid(),g_val,&g_val);
 15       cnt++;
 16       sleep(1);
 17       if(cnt == 5)
 18       {
 19         g_val = 200;
 20         printf("child chage g_val 100 -> 200 success\n");
 21       }
 22     }
 23   }
 24   else 
 25   {
 26     //father
 27     while(1)
 28     {                                                                                                                                                
 29 
 30       printf("I am father,pid : %d,ppid : %d,g_val : %d,&g_val : %p\n",getpid(),getppid(),g_val,&g_val);
 31       sleep(1);
 32     }
 33   }
 34   return 0;
 35 }

我們發(fā)現(xiàn),但我們子進(jìn)程修改全局變量g_val的時候,父進(jìn)程的g_val沒有受到影響,但是他們的地址都是一樣的,這是為什么呢?

【Linux】程序地址空間,Linux,linux

由此我們知道,這里的地址絕對不是物理內(nèi)存的地址,而是虛擬地址(線性地址);并且?guī)缀跛姓Z言,如果有地址的概念,這個地址一定不是物理地址,而是虛擬地址。物理地址是由操作系統(tǒng)保管的。以下我們就開始介紹虛擬內(nèi)存的作用

什么是地址空間

首先基本了解一下地址空間的排布情況

目前我們先不考慮解析這里的共享區(qū)【Linux】程序地址空間,Linux,linux

代碼實現(xiàn)驗證地址空間的排布

  1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <stdlib.h>
  4 int g_val = 100;
  5 int g_unval;
  6 int main(int argc,char *argv[],char *env[])
  7 {
  8   //代碼區(qū)
  9   printf("code addr:%p\n",main);
 10   //初始化數(shù)據(jù)
 11   printf("init global addr:%p\n",&g_val);
 12   //未初始化數(shù)據(jù)
 13   printf("uninit global addr:%p\n",&g_unval);
 14   //堆區(qū)
 15   char* heap_mem = (char*)malloc(10);
 16   char* heap_mem1 = (char*)malloc(10);
 17   char* heap_mem2 = (char*)malloc(10);
 18   char* heap_mem3 = (char*)malloc(10);
 19   printf("heap_mem addr:%p\n",heap_mem);
 20   printf("heap_mem1 addr:%p\n",heap_mem1);
 21   printf("heap_mem2 addr:%p\n",heap_mem2);
 22   printf("heap_mem3 addr:%p\n",heap_mem3);
 23 
 24   //棧區(qū)
 25   printf("stack addr:%p\n",&heap_mem);
 26   printf("stack addr:%p\n",&heap_mem1);
 27   printf("stack addr:%p\n",&heap_mem2);
 28   printf("stack addr:%p\n",&heap_mem3);
 29 //字面常量
 30   const char *str = "helloworld";
 31   printf("read only string addr: %p\n", str);
 32   
 33   int i,j;
 34   //命令區(qū)                                                                                                
 35    for(i = 0 ;i < argc; i++)                                                                                                                                             
 36     {              
 37         printf("argv[%d]: %p\n", i, argv[i]);
 38     }        
 39   
 40  //環(huán)境區(qū)
 41  for(j = 0;env[j];++j)
 42  {
 43    printf("env[%d] addr:%p\n",j,&env[j]);
 44  }
 45 
 46   
 47   
 48   return 0;
 49 }


【Linux】程序地址空間,Linux,linux

由此可見我們發(fā)現(xiàn)我們輸入命令后,命令的地址在我們所執(zhí)行的代碼之后,這說明剛創(chuàng)建好這些變量就有了它自己本身的地址,地址程序結(jié)束后才打印,要分清前后

接下來我們來認(rèn)識什么是地址空間
【Linux】程序地址空間,Linux,linux

這時我們可以利用虛擬地址加映射機(jī)制(頁表)來正確的講地址存入物理內(nèi)存
虛擬地址:不管哪個編譯器,只要看到的地址都是虛擬地址,物理地址是操作系統(tǒng)保管的。
每一行代碼都進(jìn)行了編址。故,程序在編譯的時候,每一個字段早已經(jīng)具有了一個虛擬地址
=什么是映射機(jī)制?
映射機(jī)制可以將虛擬地址轉(zhuǎn)換到物理地址,如果發(fā)現(xiàn)虛擬地址會越界或者錯誤,則就不會拋出,他起到了關(guān)鍵作用
那么映射機(jī)制是怎么判斷的呢?
【Linux】程序地址空間,Linux,linux
以上就是所描述的社么是地址空間,簡單來說它是存儲虛擬地址的。

【Linux】程序地址空間,Linux,linux

地址空間和頁表(用戶級)是每一個進(jìn)程都單獨(dú)有一份的。
只要每一個進(jìn)程的頁表映射的是物理內(nèi)存的不同區(qū)域,就可以做到進(jìn)程之間不會互相干擾保證進(jìn)程的獨(dú)立性。

為什么要有地址空間

  1. 凡是非法的訪問或者映射,os都會識別到,并終止你這個進(jìn)程,有效的保護(hù)了物理內(nèi)存。
    因為地址空間和頁表是os創(chuàng)建并維護(hù)的,所以凡是使用地址空間和頁表的都會在os的監(jiān)控下來進(jìn)行范文,這樣就間接的保護(hù)了物理內(nèi)存中的所有合法數(shù)據(jù)和各個進(jìn)程,以及內(nèi)核的相關(guān)有效數(shù)據(jù)
  2. 物理內(nèi)存和進(jìn)程的管理可以做到解耦合(沒關(guān)聯(lián))。
    當(dāng)我們申請了物理空間,但是我們不立即使用的時候,就會造成內(nèi)存空間的浪費(fèi);
    針對這一現(xiàn)象,os做出了延遲分配的策略,來提高整機(jī)的效率。
    因為地址空間的存在,所有申請的空間都是在地址空間上申請的,物理內(nèi)存不是被申請到一個字節(jié),當(dāng)我們真正訪問物理地址的時候,才執(zhí)行內(nèi)存相關(guān)的算法。幫助申請內(nèi)存,構(gòu)建頁表之間的映射關(guān)系,這些都是由os自主完成的
  3. 因為在物理內(nèi)存中理論上隨意加載,也是隨意存放的,但是通過地址空間的虛擬地址和頁表之間的映射,從進(jìn)程視角來看所有的內(nèi)存分布就成有序的了。
    因為有地址空間的存在,每一個進(jìn)程都認(rèn)為自己單獨(dú)有一塊4GB(32)空間,并且各個區(qū)域是有序的。進(jìn)而通過頁表映射到不同區(qū)域,來實現(xiàn)進(jìn)程的獨(dú)立性,各個進(jìn)程是不知道其他進(jìn)程的存在的

回答問題,為什么地址相同值不同
【Linux】程序地址空間,Linux,linux

發(fā)生了寫時拷貝!,所以父子進(jìn)程各自其實在物理內(nèi)存中,有屬于自己的變量空間!只不過在用戶層用同一個變量(虛擬地址!)來標(biāo)識了文章來源地址http://www.zghlxwxcb.cn/news/detail-645848.html

到了這里,關(guān)于【Linux】程序地址空間的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Linux初階】進(jìn)程地址空間 | CUP與可執(zhí)行程序的交互原理

    【Linux初階】進(jìn)程地址空間 | CUP與可執(zhí)行程序的交互原理

    ???hello,各位讀者大大們你們好呀?? ????系列專欄:【Linux初階】 ????本篇內(nèi)容:計算機(jī)空間初識(子進(jìn)程變量修改實驗),感性理解進(jìn)程虛擬地址空間,進(jìn)程地址空間基礎(chǔ)(概念、區(qū)域劃分與調(diào)整、程序?qū)?nèi)存數(shù)據(jù)的修改、按需分配虛擬地址空間),解答為什么存

    2024年02月05日
    瀏覽(22)
  • 【Linux】地址空間&&虛擬地址

    【Linux】地址空間&&虛擬地址

    個人主頁 : zxctscl 如有轉(zhuǎn)載請先通知 先先來一個測試代碼: 編譯運(yùn)行: 子進(jìn)程把數(shù)據(jù)改了,父進(jìn)程的數(shù)據(jù)沒有改變,但是父子地址是一樣的。 這個地址絕對不是物理地址,理論上修改了數(shù)據(jù)為300之后不可能在輸出有100,訪問一個地址怎么可能又是100也是300。這個地址在系

    2024年04月22日
    瀏覽(18)
  • Linux: 進(jìn)程地址空間究竟是什么?進(jìn)程地址空間存在意義何在?

    Linux: 進(jìn)程地址空間究竟是什么?進(jìn)程地址空間存在意義何在?

    ?在C/C++中,我們常將內(nèi)存分為: 代碼區(qū)、常量區(qū)、全局區(qū)(靜態(tài)區(qū))、堆、棧 等等。相關(guān)內(nèi)存區(qū)域劃分如下:(X86, 32位平臺) 如何驗證C/C++中各區(qū)域的相對位置呢? ?我們可以在每個區(qū)域中選擇一個地址來驗證C/C++中各區(qū)域的相對位置??!具體如下: 【源代碼】: 【運(yùn)行

    2024年04月08日
    瀏覽(26)
  • 【Linux】—— 進(jìn)程地址空間

    【Linux】—— 進(jìn)程地址空間

    序言: 在上篇中,我們講解了關(guān)于進(jìn)程優(yōu)先級的概念。本期,我將給大家介紹的是關(guān)于進(jìn)程地址空間的話題。 目錄 (一)程序地址空間回顧 (二)代碼演示 (三)進(jìn)程地址空間的引入 總結(jié) 我們在學(xué)習(xí)C/C++語言的時候,大家可能都見過這樣的空間布局圖: 一個程序有哪些

    2024年02月15日
    瀏覽(25)
  • 【Linux】深挖進(jìn)程地址空間

    【Linux】深挖進(jìn)程地址空間

    作者簡介:?舊言~,目前大二,現(xiàn)在學(xué)習(xí)Java,c,c++,Python等 座右銘:松樹千年終是朽,槿花一日自為榮。 目標(biāo):熟悉【Linux】進(jìn)程地址空間 毒雞湯:也許有一天,你發(fā)覺日子特別的艱難,那可能是這次的收獲特別的巨大。 望小伙伴們點(diǎn)贊??收藏?加關(guān)注喲????? ????

    2024年02月03日
    瀏覽(26)
  • 【Linux】理解進(jìn)程地址空間

    【Linux】理解進(jìn)程地址空間

    ?? 作者: 阿潤菜菜 ?? 專欄: Linux系統(tǒng)編程 ?我們在學(xué)習(xí)C語言的時候,都學(xué)過內(nèi)存區(qū)域的劃分如棧、堆、代碼區(qū)、數(shù)據(jù)區(qū)這些。但我們其實并不真正理解內(nèi)存 — 我們之前一直說的內(nèi)存是物理上的內(nèi)存嗎? 我們先看一段測試代碼: 運(yùn)行結(jié)果: 我們可以注意到子進(jìn)程的變量

    2024年02月02日
    瀏覽(28)
  • Linux:進(jìn)程地址空間

    Linux:進(jìn)程地址空間

    目錄 1.程序地址空間? 2.進(jìn)程地址空間 我們在講C/C++語言的時候,32位平臺下,我們見過這樣的空間布局圖 我們來驗證一下這張圖的正確性: 運(yùn)行結(jié)果: 通過觀察靜態(tài)變量的位置,可以認(rèn)為靜態(tài)變量就是全局變量,只是靜態(tài)變量只初始化一次,有作用域的限制。 這里棧區(qū)還

    2024年02月04日
    瀏覽(28)
  • 『 Linux 』進(jìn)程地址空間概念

    『 Linux 』進(jìn)程地址空間概念

    在c/C++中存在一種 內(nèi)存 的概念; 一般來說一個內(nèi)存的空間分布包括 棧區(qū) , 堆區(qū) , 代碼段 等等; 且內(nèi)存是 自底向上 (由 0x00000000 至 0xFFFFFFFF ); 以該圖為例: 該圖即為常見的內(nèi)存分布圖; 正文代碼段 正文代碼段所存放的數(shù)據(jù) 一般為函數(shù)體的二進(jìn)制代碼 ; 已初始化數(shù)據(jù)區(qū) 已初始化

    2024年02月03日
    瀏覽(21)
  • Linux--進(jìn)程地址空間

    Linux--進(jìn)程地址空間

    1.線程地址空間 所謂進(jìn)程地址空間(process address space),就是從進(jìn)程的視角看到的地址空間,是進(jìn)程運(yùn)行時所用到的虛擬地址的集合。 簡單地說,進(jìn)程就是內(nèi)核數(shù)據(jù)結(jié)構(gòu)和代碼和本身的代碼和數(shù)據(jù),進(jìn)程本身不能訪問物理地址,之時候就需要有一個中間媒介,就是地址空間,

    2024年02月11日
    瀏覽(22)
  • Linux虛擬地址空間

    Linux虛擬地址空間

    運(yùn)行結(jié)果 上述代碼為,創(chuàng)建子進(jìn)程,若干秒后,子進(jìn)程改變?nèi)肿兞恐?,發(fā)現(xiàn)子進(jìn)程與父進(jìn)程打印此全局變量值時, 值不同,且地址相同 。 同一個地址處的值在同一時刻不可能不同,于是引出了虛擬地址空間的概念。即這里子進(jìn)程與父進(jìn)程打印的地址并非實際的物理地址,

    2024年01月25日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包