【Linux进行时】进程地址空间

news2024/11/27 15:32:59

进程地址空间

在这里插入图片描述

例子引入:

我们在讲C语言的时候,老师给大家画过这样的空间布局图,但是我们对它不了解

image-20231001211243614

我们写一个代码来验证Linux进程地址空间

#include<stdio.h>
#include<assert.h>
#include<unistd.h>
int g_value=100;
int main()
{
  pid_t id=fork();
  assert(id>=0);
  if(id==0)
  {
   //child
   while(1)
  {
   printf("我是子进程,我的id是:%d,我的父进程是:%d,  g_value:%d,&g_value:%p\n",getpid(),getppid(),g_value,&g_value);
   sleep(1);
  }
  }                                                                                                                             
  else
  {
   //father
   while(1)
   {
   printf("我是父进程,我的id是:%d,我的父进程是:%d,g_value:%d,&g_value:%p\n",getpid(),getppid(),g_value,&g_value);
   sleep(2);
   }          
   }  
  return 0;
}          
                                

image-20230819095438860

这里没什么问题,就是他们的g_valule 和其地址都是一样的,

我们将代码调整一下,让子进程的g_value++

#include<stdio.h>
#include<assert.h>
#include<unistd.h>
int g_value=100;
int main()
{
  pid_t id=fork();
  assert(id>=0);
  if(id==0)
  {
   //child
   while(1)
  {
   printf("我是子进程,我的id是:%d,我的父进程是:%d,g_value:%d,&g_value:%p\n",getpid(),getppid(),g_value,&g_value);
   sleep(1);
   g_value++;//只有子进程会进行修改
  }
  }                                                                                                                             
  else
  {
   //father
   while(1)
   {
   printf("我是父进程,我的id是:%d,我的父进程是:%d,g_value:%d,&g_value:%p\n",getpid(),getppid(),g_value,&g_value);
   sleep(2);
   }          
   }  
  return 0;
}                                 

image-20230819095954894

我们可以发现子进程的g_value变了,但是父进程没有变,两个的地址还是一样的

❓为什么他们两个地址相同但是读出来的数据不同呢?(下文会解答)

🔥子进程对全局数据修改,并不影响父进程!——进程具有独立性!

❓这个地址会是物理地址?💡不会

显然这个地址绝对不是物理地址!所以我们平常在语言层面用的地址,绝对不是物理地址,所以以前用的指针绝对不是地址,其实这个地址叫做虚拟地址or线性地址

故事引入:

香港某个老板非常滴有钱,有10亿美金,他有 4个私生子,每个私生子都并不知道对方的存在,他们都以为自己是独生子。因为他们彼此不知道对方的存在,所以他们在生活和工作上也没有交集,不会有任何互相的影响(这就是独立性的体现)。财阀老板为了维护自己的独立性:

他就对大儿子说:“儿子,你好好学习,以后老爹钱都是你的。”,大儿子一听卧槽真好,高枕无忧,就好好学习,一想到自己以后有钱,就更想学习了。

然后又对二儿子说:“儿子,好好工作,等以后我就把公司给你。”,二儿子一听热泪盈眶,于是就好好工作,等着将来有一天可以继承公司。

后来又对三儿子说:“儿子,你好好干活,等你长大老爹的家产交给你!”,三儿子知道自己以后会继承老爹的所有财产,开心坏了,就努力的干活。

后来又对四儿子说:“儿子,你好好干活,等你长大老爹的家产交给你!”,四儿子知道自己以后会继承老爹的所有财产,开心坏了,就努力的干活。

只要在财阀爹的可承受范围内,孩子要多少钱他都给多少钱,所以三个儿子自然都认为自己有很多钱。财阀老板给他的三个儿子画了一张虚拟的、不存在的大饼,让他们都能努力学习工作干活(这个步骤就是给他们分别建立了进程地址空间)。

image-20230819102740749

画的饼:进程地址空间,10亿美金:内存,老板:操作系统,四个私生子是进程

❓大富翁,要不要把“饼”管理起来呢?

显然需要的,遵循先描述再组织的原则

所以,进程地址空间,就是就是给进程画的大饼

进程地址空间 → 逻辑上抽象的概念 → 让每个进程都认为自己独占系统的所有资源

**概念:**操作系统通过软件的方式,给进程提供一个软件视角,认为自己是独占系统的所有资源(内存)。

image-20231001212605706

区域和页表:

什么叫做区域?我们来拿一张桌子来理解,初中的时候小花和小胖分过 “38线”

三八线的本质就是区域划分!

image-20230819105220732

🔥地址空间本身就是一个线性区域,地址空间是线性结构的!

struct mm_struct {
    long code_start;
    long code_end;
    
    long init_start;
    long init_end;
    
    long uninit_start;
    long uninit_end;
    
    long heap_start;
    long heap_end;
    
    long stack_start;
    long stack_end;
    ...
}

如果限定了区域,那么区域之间的数据是什么?

是虚拟地址or线性地址

🔥程序加载到内存,由程序变成进程后,由操作系统给每个进程构建的一个页表结构,就是 页表

🔥数据和代码真正只能在内存中!

找到地址不是目的,而是手段

image-20230820093416558

回到之前那个问题:

❓为什么他们两个地址相同但是读出来的数据不同呢?

💡如果子进程对数据进行了修改,因为进程具有独立性,子进程的修改不能影响父进程

子进程这里的 物理地址改了,但是虚拟地址没有改

写时拷贝发生在物理地址,虚拟地址没有变

因为进程具有独立性,比如如果此时子进程把变量改了(写入),就会导致父进程识别的问题就出现了父进程和子进程不一的情况,因为进程是具有独立性的,所以我们就要做到互不影响。我们的子进程要进行修改了,影响到父进程怎么办?没关系!操作系统会出手!当我们识别到子进程要修改时,操作系统会重新给子进程开辟一段空间,并且把 100 拷贝下来,重新给进程建立映射关系,所以子进程的页表就不再指向父进程所对应的 100 了,而直接指向新的 100。你在做修改时又把它的值从 100 改成 200 时,我们就出现了 “改的时候永远改的是页表的右侧,左侧不变” 的情况,所以最后你看到了父子进程的虚拟地址一样,但是经过页表映射到了不同的物理内存,所以了你看到了一个是 100 一个是 200,父子进程的数据不同的结果。

我们的操作系统当我们的父子对数据进行修改时,操作系统会给修改的一方重新开辟一块空间,并且把原始数据拷贝到新空间当中,这种行为就是 写时拷贝!

当父子有任何一个进程尝试修改对应变量时,有一个人想修改,就会触发写时拷贝,让他去拷贝新的物理内存,这只需要重新构建也表的映射关系,虚拟地址是不发生任何变化的,所以最终你看的结果是虚拟地址不变,而内容不同。

这个结构也体现了进程具有独立性

pid_t id=fork()
if(){}
else
{}

❓fork在返回的时候,父子都有,return两次,id是不是pid_T类型定义的变量呢?

💡是的,返回的本质就是写入!谁先返回,谁就让OS发生写时拷贝

如果是父进程就返回pid,如果是子进程就返回0

为什么进程地址空间要存在?

❓如果没有地址空间,我们OS是如何工作呢?

💡这里就是害怕野指针的情况,要寻找一个地址因为你的代码错误找到了一个越界地址时写入时会使别人的进程错了而且很不安全,因此有了页表和虚拟空间

🔥这两个存在的意义:1.防止地址随意访问,保护物理内存与其他进程

❓常量字符串不能修改,这是为什么呢?💡因为页表访问的时候是有权限的,权限不能修改

char*str=“hello world”;
*str=‘H’;

🔥先来将另外一个扩充:malloc的本质——

❓向OS申请内存,操作系统立马给你,还是说在你需要的时候给你?

💡1.在你需要的时候给你,OS一般不允许任何的浪费或者不高效

2.申请内存==立马使用呢?不一定等于立马使用

3.在你申请成功之后,和你使用之前就有一段小小的时间窗口,这个空间没有被正常使用,但是别人用不了—-闲置状态

🔥如果有500进程这样的话,这样操作系统就有大块的空间处于这种状态,这种情况叫做缺页中断

❓因为有页表,你关心不关心你申请的空间是在物理空间的哪一块呢?💡不关心,一样的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1055958.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【吞噬星空】连播两集,尼赫鲁对徐欣动手,罗峰修分身强势复仇

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析吞噬星空资讯。 吞噬星空动画第四季定档之后&#xff0c;官方真的是太宠粉了&#xff0c;每天都会公布全新预告情报&#xff0c;无论是外星人物角色&#xff0c;亦或者宇宙星球建模&#xff0c;那都是相当的炸裂。如今更…

《CTFshow-Web入门》10. Web 91~110

Web 入门 索引web91题解总结 web92题解总结 web93题解 web94题解 web95题解 web96题解 web97题解 web98题解 web99题解总结 web100题解 web101题解 web102题解 web103题解 web104题解 web105题解总结 web106题解 web107题解 web108题解 web109题解 web110题解 ctf - web入门 索…

怒刷LeetCode的第22天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;回溯算法 方法二&#xff1a;基于位运算的回溯 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;动态规划 方法二&#xff1a;分治法 方法三&#xff1a;前缀和数组 第三题 题目来源 题目内容…

通讯网关软件014——利用CommGate X2HTTP实现HTTP访问OPC Server

本文介绍利用CommGate X2HTTP实现HTTP访问OPC Server。CommGate X2HTTP是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;SCADA系统配置OPC Server&#xff0c;现在上位机需要通过Http Client…

Springboot+Vue+Mysql实现模拟汽车保养系统(附源码)

前言 本项目基于springbootvue搭建的汽车保养的系统&#xff0c;页面较为粗糙&#xff0c;前端好的小伙伴可自行优化。 项目环境 -环境框架后端JDK1.8SpringBootmybatisPlus前端NodeJS16.0Vue2.0ElementPlus数据库MySQL8.0- 数据库设计 数据表备注banner轮播图表car用户汽…

树的表示——孩子兄弟表示法

从图中可以看出&#xff0c;树的每个结点&#xff0c;都有不确定的指向他们的孩子的节点&#xff0c;如果我们定义这样一个结构体来便是数的结构的话&#xff1a; struct TreeNode { int val; struct TreeNodep1; struct TreeNodep1; … }; 是不能够表示一棵树的&#xff0c;因…

可视化 | (一)数据基础及基本数据可视化方法

​ 文章目录 &#x1f4da;数据可视化的基本流程&#x1f4da;数据属性&#x1f4da;基本可视化图表类型&#x1f407;数据分析三规则&#x1f407;条形图&#xff08;Bar Chart&#xff09;&#x1f407;饼图&#xff08;Pie Chart&#xff09;&#x1f407;衡量易变性 (meas…

计算机网络(一):概述

参考引用 计算机网络微课堂-湖科大教书匠计算机网络&#xff08;第7版&#xff09;-谢希仁 1. 计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成为一种重要的信息服务基础设施计算机网络已经像水、电、煤气这些基础设施一样&#xff0c;成为我们生活中不可或…

CleanMyMac X4.14.1最新和谐版下载

CleanMyMac一款macOS上非常经典的清理工具。它可以帮助用户清理垃圾文件、卸载无用应用程序、优化系统性能等。旨在帮助用户提高系统性能、释放磁盘空间并保持Mac的健康状态。 下面是CleanMyMac X软件的主要特点&#xff1a; 系统垃圾&#xff1a;清理您的系统来获得最大的性能…

CocosCreator3.8研究笔记(二十四)CocosCreator 动画系统-动画编辑器实操-关键帧实现动态水印动画效果

上一篇&#xff0c;我们介绍了动画编辑器相关功能面板说明&#xff0c;感兴趣的朋友可以前往阅读&#xff1a; CocosCreator3.8研究笔记&#xff08;二十三&#xff09;CocosCreator 动画系统-动画编辑器相关功能面板说明。 熟悉了动画编辑器的基础操作&#xff0c;那么再使用动…

Three.js:打造独一无二的3D模型可视化编辑神器!

前言 1.因为之前工作过的可视化大屏项目开发3d大屏组件模块需要用到Three.js来完成&#xff0c;其主功能是实现对3d模型的材质&#xff0c;灯光&#xff0c;背景&#xff0c;动画。等属性进行可视化的编辑操作以及模型编辑数据的存储和模型在大屏上面的拖拽显示 2.因为是第一…

不能显式拦截ajax请求的302响应?

记录工作中早该加深印象的一个小小小case&#xff1a;ajax请求不能显式拦截 302响应。 我们先来看一个常规的登录case: 1. 浏览器请求资源&#xff0c;服务器发现该请求未携带相关凭据&#xff08;cookie或者token&#xff09;2. 服务器响应302&#xff0c;并在响应头Location写…

2021-06-15 51单片机c语言秒表的仿真ISIS7 professional

缘由51单片机c语言秒表的仿真ISIS7 professional_嵌入式-CSDN问答 #include "REG52.h" sbit K1 P1^5; sbit K2 P1^6; sbit K3 P1^7; sbit K4 P1^4; sbit LED1P1^0; sbit LED2P1^1; sbit LED3P1^2; sbit LED4P1^3; bit k0; unsigned char code SmZiFu[]{63,6,91,…

IDT 一款自动化挖掘未授权访问漏洞的信息收集工具

IDT v1.0 IDT 意为 Interface detection&#xff08;接口探测) 项目地址: https://github.com/cikeroot/IDT/该工具主要的功能是对批量url或者接口进行存活探测&#xff0c;支持浏览器自动打开指定的url&#xff0c;避免手动重复打开网址。只需输入存在批量的url文件即可。 …

EM聚类(上):数据分析 | 数据挖掘 | 十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

Polygon Miden:扩展以太坊功能集的ZK-optimized rollup

1. 引言 Polygon Miden定位为zkVM&#xff0c;定于2023年Q4上公开测试网。 zk、zkVM、zkEVM及其未来中指出&#xff0c;当前主要有3种类型的zkVM&#xff0c;括号内为其相应的指令集&#xff1a; mainstream&#xff08;WASM, RISC-V&#xff09;EVM&#xff08;EVM bytecod…

1.3 互联网的组成

思维导图&#xff1a; 前言&#xff1a; 我的笔记&#xff1a; #### 一、总览 - **互联网的结构**&#xff1a; - 具有全球覆盖和复杂的拓扑结构。 - 即便结构复杂&#xff0c;还是可以从工作方式上简化为两大部分&#xff1a;边缘部分和核心部分。 #### 二、边缘部分 -…

免费、丰富、便捷的资源论坛——Yiove论坛,包括但不限于阿里云盘、夸克云盘、迅雷云盘等等

引言 目前资源的数量达到了60000&#xff0c;六万多的资源意味着在这里几乎可以找到任何你想要的资源。 当然&#xff0c;资源并不是论坛的全部&#xff0c;其中还包括了技术交流、福利分享、最新资讯等等。 传送门&#xff1a;YiOVE论坛 - 一个有资源有交流&#xff0c;有一…

正则表达式模块re

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 正则表达式模块re [太阳]选择题 下列程序输出的结果是&#xff1f; import re print("【执行】re.match(www, www.china.com)") print(re.match(www, www.china.com)) print(&quo…

环形链表[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个链表的头节点head&#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪next指针再次到达&#xff0c;则链表中存在环。为了表示给定链表中的环&#xff0c;评测系统内部使用整数pos来表示链…