【Linux】進程地址空間

目錄

  • 一、回顧我們以前學習的地址空間
  • 二、進程地址空間
  • 三、進程地址空間的作用
  • 四、解決一個地址出現兩個值的問題

一、回顧我們以前學習的地址空間

在這里插入圖片描述

這個內存布局真是的我們實實在在的內存嘛? 答案是不是的
下面我們來驗證

  1 #include<stdio.h>2 #include<assert.h>3 #include<unistd.h>4 5 int myval=100;6 7 int main()8 {9   pid_t id=fork();10   assert(id>=0);11   if(id==0)12   {13     //子進程14     myval=200;   //修改myval的值15     while(1)16     {17       printf("我是子進程,我的pid是:%d,我的父進程是:%d,myval: %d, &myval: %p\n",getpid(),getppid(),myval,&myval);18       sleep(1);19     }20   }else if(id>0)21   {22     //父進程23     while(1)24     {25       printf("我是父進程,我的pid是:%d,我的父進程是:%d,myval: %d, &myval: %p\n",getpid(),getppid(),myval,&myval);                                                                        26       sleep(1);27     }28   }29 30   return 0;31 }

在這里插入圖片描述

可以看到,父進程和子進程中的g_val的地址是一摸一樣的,那么按理說將子進程中的g_val改變后,由于他們使用的是一塊空間,所以父進程中的g_val的值也應該改變,可這里為什么沒有變化??

如果C/C++打印出來的地址是物理內存的地址,這種現象絕不可能存在!而這里使用的地址是虛擬地址。

在用C/C++語言所看到的地址,全部都是虛擬地址!物理地址,用戶一概看不到,由OS統一管理

所以最上面那張圖應該叫做,進程虛擬地址空間

二、進程地址空間

每個進程都有一個地址空間,都認為自己在獨占物理內存。而這個地址空間在內核中是一個結構體 struct mm_struct.

mm_struct 中的分布類似下面這種:

struct mm_struct {unsigned int code_start;  //地址空間上進行區域劃分時,對應的線性位置,稱為虛擬地址unsigned int code_end;unsigned int init_data_start;unsigned int init_data_end;unsigned int uninit_data_start;unsigned int uninit_data_end ;unsigned int heap_start;unsigned int heap_end;unsigned int stack_start;unsigned int stack end;
}

?
雖然這里只有start和end,但每個進程都可以認為mm_struct代表整個內存的所有的地址為0x0000…000~0xFFFF…FFF(即每個進程都認為自己擁有4GB的空間,至于到底有沒有,是OS要做的事)

真實內存的樣子

在這里插入圖片描述

頁表:是一種特殊的數據結構,放在系統空間的頁表區,存放邏輯頁與物理頁幀的對應關系。 每一個進程都擁有一個自己的頁表,PCB表中有指針指向頁表。

三、進程地址空間的作用

1.防止訪問權限越界
通過添加一層軟件層,完成有效的對進程操作內存進行權限管理,本質目的是為了保護物理內存以及各個進程的數據安全。
在這里插入圖片描述

?

2.將內存申請和內存使用的概念劃分清楚
通過虛擬地址空間,來屏蔽底層申請內存的過程,達到進程讀寫內存和OS申請內存管理操作,進行軟件上面的分離。
在這里插入圖片描述

進程A想申請1000字節空間,進程A馬上就能使用這1000字節嗎?這是不一定的,可能會存在暫時不會全部使用的情況。

在OS角度,如果空間馬上給進程A,就意味著整個系統會有一部分空間本來可以給其他進程立即使用,先在卻被進程A閑置著。

這樣就會存在空間浪費的情況。操作系統不允許出現浪費和不高效的行為

所以在這種情況下,OS會在進程A使用空間的時候才將內存申請給進程A。(相當于是類似寫時拷貝的思想)

?

3.站在CPU和應用層的角度,進程同意可以看作統一使用4GB空間,而且每個空間區域的相對位置是比較確定的。

如果同時存在多個進程,而每個進程代碼的其實位置是不確定的,那么CPU在執行時,需要找到代碼在哪里,比較混亂。

而使用虛擬地址空間和頁表的方式,將內存劃分為代碼段、常量區、堆、棧等區域,CPU執行進程時,每次從同一個位置開始即可,而不同的進程通過不同的頁表映射到自己的物理內存中存放代碼和數據的位置,提高了CPU的執行效率。

所以通過虛擬地址和頁表,程序的代碼和數據可以被加載到物理內存的任意位置!!極大的減少內存管理的負擔。

OS最終這樣的目的,為了達到一個目標:每個進程都認為自己是獨占系統資源的。

?

四、解決一個地址出現兩個值的問題

在開始那段代碼中,我們可以看到myval的值在被子進程修改后,父進程值沒有改變,同時打印出來的myval的地址相同,出現了一個地址兩個值的情況,我們來解決。

在這里插入圖片描述

子進程在創建時會以父進程為模板,即能夠拷貝父進程的地方就拷貝,例如虛擬地址,只讀區的映射關系(代碼共享)。

所以子進程和父進程的虛擬地址是相同的,而頁表的映射關系是不同的,所以他們的物理地址也不同。

所以就出現了,子進程改變myval的值,而父進程不變,但打印出的地址卻是一樣的情況了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39211.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39211.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39211.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從三個主要需求市場分析,VR全景創業的潛力發展

VR全景&#xff0c;5G時代朝陽產業&#xff0c;其實拍攝制作很簡單&#xff0c;就是利用一套專業的相機設備去給商家拍攝&#xff0c;結合后期專業的3DVR全景展示拍攝制作平臺&#xff0c;打造3D立體環繞的效果&#xff0c;將線下商家真實環境1&#xff1a;1還原到線上&#xf…

使用docker快速搭建wordpress服務,并指定域名訪問

文章目錄 引入使用docker快速跑起服務創建數據庫安裝wordpress服務配置域名 引入 wordpress是一個基于PHP語言編寫的開源的內容管理系統&#xff08;CMS&#xff09;&#xff0c;它有豐富的插件和主題&#xff0c;可以非常簡單的創建各種類型的網站&#xff0c;包括企業網站、…

Java異步方法CompletableFuture類的使用

Java中常用的異步方法 1、使用線程&#xff1a;你可以創建一個新的線程來執行異步操作。這可以通過直接創建Thread對象并啟動它&#xff0c;或者使用線程池來管理線程的生命周期。 new Thread(() -> {// 異步操作代碼 }).start(); 2、使用線程池Executor框架&#xff1a;E…

Spring Boot 支持多種環境,包括開發環境、測試環境、預發布環境和生產環境。

Spring Boot 支持多種環境&#xff0c;包括開發環境、測試環境、預發布環境和生產環境。不同的環境具有不同的配置&#xff0c;可以在不同的環境中對應用程序進行測試、驗證和部署。以下是每種環境的用途和相應的代碼案例。 開發環境 開發環境是開發人員在本地進行開發的環境&…

AI Chat 設計模式:15. 橋接模式

本文是該系列的第十五篇&#xff0c;采用問答式的方式展開&#xff0c;問題由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字則主要是我的一些思考和補充。 問題列表 Q.1 如果你是第一次接觸橋接模式&#xff0c;那么你會有哪些疑問呢&#xff1f;A.1Q.2 什…

內網隧道—HTTP\DNS\ICMP

本文僅限于安全研究和學習&#xff0c;用戶承擔因使用此工具而導致的所有法律和相關責任&#xff01; 作者不承擔任何法律和相關責任&#xff01; HTTP隧道 Neo-reGeorg Neo-reGeorg 是一個旨在積極重構 reGeorg 的項目&#xff0c;目的是&#xff1a; 提高可用性&#xff0…

山西電力市場日前價格預測【2023-08-17】

日前價格預測 預測明日&#xff08;2023-08-17&#xff09;山西電力市場全天平均日前電價為376.70元/MWh。其中&#xff0c;最高日前電價為431.75元/MWh&#xff0c;預計出現在19: 45。最低日前電價為339.25元/MWh&#xff0c;預計出現在13: 15。 價差方向預測 1&#xff1a; 實…

python實現抽獎小程序

使用Python的Tkinter庫來添加抽獎程序的界面操作。下面是一個示例代碼&#xff1a; import random import tkinter as tkdef lottery():prizes [一等獎, 二等獎, 三等獎, 謝謝參與]winner random.choice(prizes)result_label.config(text恭喜您獲得了{}&#xff01;.format(…

未出現過的最小正整數

給定一個長度為 n 的整數數組&#xff0c;請你找出未在數組中出現過的最小正整數。 樣例 輸入1&#xff1a;[-5, 3, 2, 3]輸出1&#xff1a;1輸入2&#xff1a;[1, 2, 3]輸出2&#xff1a;4數據范圍 1≤n≤105 , 數組中元素的取值范圍 [?109,109]。 代碼&#xff1a; c…

MySql主從復制1032錯誤(Slave_IO_Running: Yes Slave_SQL_Running: No)

MySql主從復制1032錯誤&#xff08;Slave_IO_Running: Yes Slave_SQL_Running: No&#xff09; Slave_IO_Running: Yes Slave_SQL_Running: No報錯&#xff1a; Last_SQL_Error: Could not execute Delete_rows event on table hr.test; Can’t find record in ‘test’, Erro…

【Unity造輪子】制作一個簡單的2d抓勾效果(類似蜘蛛俠的技能)

文章目錄 前言開始1. 實現簡單的抓勾效果2. 高階鉤爪效果 源碼參考完結 前言 歡迎閱讀本文&#xff0c;本文將向您介紹如何使用Unity游戲引擎來實現一個簡單而有趣的2D抓勾效果&#xff0c;類似于蜘蛛俠的獨特能力。抓勾效果是許多動作游戲和平臺游戲中的常見元素&#xff0c;…

【AI繪畫】3分鐘學會ikun幻術圖

目錄 前言一、效果展示二、準備工作三、操作步驟3.1平臺創建實例3.2 啟動SD 四、安裝QR Code Monster 模型五、成圖 前言 大家熱愛的ikun幻術在今天的分享中將呈現。在本文中&#xff0c;我們將揭示一個備受歡迎的圖像幻術技術&#xff0c;讓您感受到令人驚嘆的視覺創造力。 …

springboot+vue游戲攻略推薦網站的設計與開發_s5832

熱門網游推薦網站是一個利用JAVA技術建設的網上管理系統&#xff0c;在熱門網游推薦管理中實現信息化。系統的設計就是為了迎合廣大用戶需求而創建的一個界面簡潔、有定向內容、業務邏輯簡單易操作的熱門網游推薦網站。本文以熱門網游推薦為例&#xff0c;提出了利用JAVA技術設…

Angular中的ActivatedRoute和Router

Angular中的ActivatedRoute和Router解釋 在Angular中&#xff0c;ActivatedRoute和Router是兩個核心的路由服務。他們都提供可以用來檢查和操作當前頁面路由信息的方法和屬性。 ActivatedRoute ActivatedRoute是一個保存關于當前路由狀態&#xff08;如路由參數、查詢參數以…

Linux下grep通配容易混淆的地方

先上一張圖: 我希望找到某個版本為8的一個libXXX.8XXX.so ,那么應該怎么寫呢? 先看這種寫法對不對: 是不是結果出乎你的意料之外? 那么我們來看一下規則: 這里的 "*" 表示匹配前一個字符的零個或多個 于是我們就不難理解了: lib*8*.so 表示 包…

醫療PACS源碼,支持三維多平面重建、三維容積重建、三維表面重建、三維虛擬內窺鏡

C/S架構的PACS系統源碼&#xff0c;PACS主要進行病人信息和影像的獲取、處理、存儲、調閱、檢索、管理&#xff0c;并通過網絡向全院提供病人檢查影像及診斷報告&#xff1b;各影像科室之間共享不同設備的病人檢查影像及診斷報告;在診斷工作站上&#xff0c;調閱HIS中病人的其它…

拒絕擺爛!C語言練習打卡第二天

&#x1f525;博客主頁&#xff1a;小王又困了 &#x1f4da;系列專欄&#xff1a;每日一練 &#x1f31f;人之為學&#xff0c;不日近則日退 ??感謝大家點贊&#x1f44d;收藏?評論?? 目錄 一、選擇題 &#x1f4dd;1.第一題 &#x1f4dd;2.第二題 &#x1f4dd;…

P1304 哥德巴赫猜想

題目描述 輸入一個偶數 N N N&#xff0c;驗證 4 ~ N 4\sim N 4~N 所有偶數是否符合哥德巴赫猜想&#xff1a;任一大于 2 2 2 的偶數都可寫成兩個質數之和。如果一個數不止一種分法&#xff0c;則輸出第一個加數相比其他分法最小的方案。例如 10 10 10&#xff0c; 10 …

Springboot寫單元測試

導入依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintag…