【Linux】进程概念IV 进程地址空间

news2025/3/10 14:45:32

img

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。

本篇导航

  • 0. 数据在内存中的分布
  • 1. 虚拟地址与真实物理地址
  • 2. 进程地址空间
    • 2.1 进程地址空间概念
    • 2.2 进程->页表->内存

在这里插入图片描述

0. 数据在内存中的分布

我们熟知的栈区堆区等在内存中的分布是怎样的呢?

地址空间中有着这几样区域:

  1. 代码区
  2. 字符常量区
  3. 已初始化全局变量
  4. 未初始化全局变量
  5. 堆区
  6. 栈区
  7. 命令行参数
  8. 内核空间

他们在内存中的分布是由上到下,满足下面这个模型.

228dfa789007f98aa0f45743545d024

代码区在低地址空间.地址从下往上增长. 堆区向上申请地址,栈区向下申请地址

我们可以来验证一下这个布局正确与否

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
int gval=100;
int initgval=100;
int uninitgval;
int main()
{
    printf("code address :%p\n",main);
    const char* str="hhhhh";
    printf("str address : %p\n",str);
    int a=0;
    int b=0;
    int c=0;
    static int sta=0;
    printf("initgval:%p\n",&initgval);
    printf("uninitgval:%p\n",&uninitgval);
    printf("static:%p\n",&sta);
    printf("stack address:%p\n",&a);
    printf("stack address:%p\n",&b);
    printf("stack address:%p\n",&c);
    int* heapadd1=(int*)malloc(100);
    int* heapadd2=(int*)malloc(100);
    printf("stack address:%p\n",&heapadd1);
    printf("stack address:%p\n",&heapadd2);
    printf("heap address:%p\n",heapadd1);
    printf("heap address:%p\n",heapadd2);
    return 0;
}

我们使用main函数地址来表示代码区,const char* str代表字符常量区.最后发现

image-20231110192754517

大部分和我们之前所说一致.

我们可以发现static修饰的变量为什么能在函数结束时被保存下来呢?因为其存放在了全局变量去,

但栈似乎并不是往下增长的.这是由于操作系统的操作导致的,不同的操作系统可能测试出来的结果并不相同.但内存分布是相同的.

1. 虚拟地址与真实物理地址

我们使用fork函数创建一个子进程,在子进程中改变与父进程同名的变量.父进程中该变量会被改变嘛?

#include<stdlib.h>                                                                                         
#include<stdio.h>
#include<unistd.h>
int main()
{
   int val=100;
   pid_t id = fork();
   if(id==0)
   {
       val=99;
       printf("i am a childre process val is: %d address is %p\n",val,&val);
       sleep(1);
    }
   else
        printf("i am a father process val is: %d address is %p\n",val,&val);
    return 0;
}

编译执行会出现下面的结果

image-20231110194550166

我们可以发现 子进程将val变量值更改了,而父进程却不受影响.但他们两个指向的是同一个地址空间.

相同的地址空间怎会存储两个不一样的值呢? 他们使用的都是虚拟地址空间,而虚拟空间与真实地址空间中存在映射关系.

2. 进程地址空间

2d5d4599f712724b866e3caf71e45ec

每个进程都会拥有一个这样的内存分布+页表.

上面的情况是:子进程复制了父进程的页表与内存分布.其中子进程的页表与父进程的页表虚拟地址真实地址都相同.当向一个共享的变量写入数据时,会发生写时拷贝.在内存中重新给子进程申请一片空间,在这里进行写入.但是虚拟地址不变,只是改变了虚拟地址与物理地址的映射关系.

重新开辟空间这一操作,对于左边的虚拟地址,或者说对于进程来说是不可知的.这满足了软件中的解耦合设计.左边的进程管理只需要管理好进程,不需要去操作内存.

2.1 进程地址空间概念

在PCB中也即在Task_Struct中会存在一段mem结构体指针.mem结构体中存了每个区域(代码、堆区…)的起始与终止位置

对线性空间进行区域划分.

我们来看看Linux内核2.6.1中关于这段的具体描述

struct mm_struct{

image-20231110202059772

}

每一个段区域中每个最小单位都有自己的地址可以 供进程直接使用

这样做可以让进程以相同的方式看待内存,不必去管内存中哪里为空,当下需要将数据放到哪里.只需要管好自己的内存分布即可.

我们之前如果想要去修改一个常量区的字符,或者指针越界访问,操作系统会抛出警告.那么这是如何做到的呢?

通过页表.页表中有一个标志位,可以标志当前存入的数据的属性.当我们通过页表去访问内存时,操作系统会去检查本次操作是否合法.进而保护物理内存

每个进程是完全独立的,每个进程都认为自己拥有了所有的内存.进程需要使用内存时通过操作系统向内存模块进行申请.这样的设计让内存模块与进程模块实现了解耦合

**进程PCB中具有几个属性描述了当前内存分布以及页表所在的空间.当进程被放在CPU上时,会将这些信息提供给CPU.反之,从内存中拿下时,也会将这些信息带走.**所以每个进程间都是互相独立的.

2.2 进程->页表->内存

我们平常玩游戏,一个游戏的大小大多时候是远大于我们的内存的.显然不可能一次性将全部的内容加载到内存当中.那么我们怎么保证当前进程所访问的内容在使用时一定存在呢?

  • 操作系统对大文件以一种惰性加载的方式实现分批加载

进程通常假设自己要使用的资源已经全部加入到内存当中.(解耦合暗示了是否加载到真实的物理地址中进程并不关心),之后为这些资源分配虚拟的地址空间.

当进程访问这些虚拟的地址空间时,操作系统会检查虚拟空间对应的物理内存是否存在?
若不存在则发生却缺页中断,该进程被挂起.此时CPU向内存管理模块去申请对应的资源.待准备完毕再反馈给进程

所以现代操作系统不做任何浪费空间和时间的事情
image-20230905164632777

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

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

相关文章

Prometheus+Ansible+Consul实现服务发现

一、简介 1、Consul简介 Consul 是基于 GO 语言开发的开源工具&#xff0c;主要面向分布式&#xff0c;服务化的系统提供服务注册、服务发现和配置管理的功能。Consul 提供服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等功能。 在没有使用 consul 服…

解析浏览器的事件循环机制:理解JavaScript运行时的执行顺序

解析浏览器的事件循环机制&#xff1a;理解JavaScript运行时的执行顺序 前言定义执行顺序异步任务概念&#xff1a;微任务、宏任务宏任务有哪些&#xff1f;微任务有哪些 实例代码与图解 前言 因为防止在多个用户同时在浏览器中操作一个DOM节点所带来的复杂性&#xff0c;故Ja…

ADFS 高可用配置 + NLB配置(Windows网络负载均衡)

ADFS 高可用配置 NLB配置&#xff08;Windows网络负载均衡&#xff09; ADFS安装配置NLB配置节点 TEST-ADFS-01 网络负载平衡配置节点 TEST-ADFS-02 网络负载平衡修改CRM配置 ADFS实现高可用负载均衡有两种&#xff0c;主要是在数据库的选择方式&#xff1a; windows自带的内…

AP/PF PLASMA电源维修等离子变频电源PF23V-A1-138

维修包括&#xff1a;PECVD、MOCVD、IONIMP,PLASMA的设备电源,包括直流、高压、脉冲、射频、微波、匹配器、RPSC、CHILLER等。电源维修的时候&#xff0c;需要检测一下各功率器件是否存在击穿短路&#xff0c;例如电源整流桥堆、开关管、高频大功率整流管、浪涌电流的大功率电阻…

# Spring事务与分布式事务

一、事务的具体定义 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元&#xff0c;组成事务的所有操作只有在所有操作均能正常执行的情况下方能提交&#xff0c;只要其中任一操作执行失败&#xff08;出现异常&#xff09;&#xff0c;都将导致整个事务…

抖音自动发评论之论人工智能AI的应用和发展趋势

人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;是目前国际上热门的科技话题之一。它是计算机科学中的一个分支&#xff0c;旨在创造能够智能地工作、学习、感知、理解和决策的机器。人工智能的应用范围十分广泛&#xff0c;包括语音识别、自然语言处理…

国际阿里云:提高CDN缓存命中率教程!!!

CDN缓存命中率低会导致源站压力大&#xff0c;静态资源访问效率低。您可以根据导致CDN缓存命中率低的具体原因&#xff0c;选择对应的优化策略来提高CDN的缓存命中率。 背景信息 CDN通过将静态资源缓存在CDN节点上实现资源访问加速。当客户端访问某资源时&#xff0c;如果CDN节…

群晖Docker(Container Manager)中安装Home Assistant Container

群晖Docker&#xff08;Container Manager&#xff09;中安装Home Assistant Container 不要使用 套件里面的 Home Assistant&#xff0c;不利于后期拓展 方式一&#xff1a; docker run -d --name"home-assistant-1" -v /volume1/docker/homeassistant/config:/c…

基于JAX-WS实现RESTful形式的web服务端点(endpoint)

RESTful形式的web服务使用XML/HTTP绑定&#xff0c;实现jakarta.xml.ws.Provider。 服务端的实现类用jakarta.xml.ws.WebServiceProvider和BindingType(valueHTTPBinding.HTTP_BINDING)注释。其中HTTPBinding.HTTP_BINDING表示使用XML/HTTP绑定。 例如&#xff1a; WebServic…

常用网络命令ping、arp、tracert、route的详细用法,弄懂立马成大神

你们好&#xff0c;我的网工朋友。 做网工&#xff0c;你遇到最多的问题是啥&#xff1f;大部分人的回答都是网络故障吧。 所以有很多朋友多次问到&#xff0c;如何检测网络故障和对网络进行基础的操作。比如&#xff1a;网络经常掉线、网络时好时坏&#xff0c;ip地址冲突、…

BUUCTF刷题十一道【缺】(10)

文章目录 EasyBypass[SCTF2019]Flag Shop[BSidesCF 2019]SVGMagic[极客大挑战 2020]Greatphp[GYCTF2020]Easyphp【留坑-反序列化】[HarekazeCTF2019]Avatar Uploader 1[FireshellCTF2020]Caas[ISITDTU 2019]EasyPHP[N1CTF 2018]eating_cms[GYCTF2020]Ez_Express【留坑-nodejs原…

塑料质量检测是确保产品制造和装配过程的关键环节

激光塑料透光率检测是一种有效的塑料材料特性检测方法。在激光束通过上层透明材料后&#xff0c;被下层材料吸收。上层材料可以是透明的或者是有颜色的&#xff0c;但是必须能够保证有足够的激光通过。 塑料质量检测是确保产品制造和装配过程的关键环节。通过激光塑料透光率检测…

C语言—字符串连接函数

strcpy_s&#xff1a;拷贝整个字符串 #include <stdio.h> #include <string.h>int main() {char str1[] "first stringiiii";char str2[] "second string";char str3[100];strcpy_s(str1, sizeof(str1) / sizeof(str1[0]), str2);strcpy_s(…

datax 搭建使用

文章目录 datax 环境搭建使用一、解压文件二、配置 json 文件三、执行命令 datax 环境搭建使用 用于全量同步 一、解压文件 将包上传至服务器 输入命令&#xff1a; tar -zxvf datax.tar.gz -C /opt/module/ 将包 解压到 /opt/module 目录 解压完之后&#xff0c;不需要任何…

双通道、8位、MCP47CMD02T-E/MG、MCP47CMD02T-E/MF、MCP47CMD02T-E/UN数模转换器(DAC)适合消费和工业应用

典型应用&#xff1a; •设定点或偏移微调 •传感器校准 •低功耗便携式仪器仪表 •个人电脑外围设备 •数据采集系统 特性 8位分辨率 轨到轨输出 快速建立时间&#xff1a;4s&#xff08;典型值&#xff09; I2C接口 非易失性存储器&#xff08;MTP&#xff09;&#xff1a…

ios 对话框UIAlertController放 tableview

//强弱引用 #define kWeakSelf(type)__weak typeof(type)weak##type type; -(void) showUIAlertTable {kWeakSelf(self)UIAlertController *alert [UIAlertController alertControllerWithTitle:NSLocalizedString("select_stu", nil) message:nil prefer…

《数据结构、算法与应用C++语言描述》-代码实现键值有序链表跳表

跳表 定义 在一个用有序链表描述的 n 个数对的字典中进行查找&#xff0c;至多需要 n 次关键字比较。如果在链表的中部节点加一个指针&#xff0c;则比较次数可以减少到 n/21。这时&#xff0c;为了查找一个数对&#xff0c;首先与中间的数对比较。如果查找的数对关键字比较小…

腾讯云优惠服务器有哪些?腾讯云服务器优惠券领取入口汇总

腾讯云此次推出云服务器中最实惠的2核2G服务器以每年仅需88元的超低价格为用户提供稳定可靠的计算资源。这样的价格对于个人网站、小型企业以及学生开发者来说绝对是一笔难以忽视的优惠。 腾讯云双十一领9999代金券 https://1111.mian100.cn 腾讯云新用户领2860代金券 https:…

前后端交互案例,图书管理系统

先引入前端代码运行看看是否有问题 图书管理系统 定义前后端交互接口 1.登录 URL : /user/login 参数 : userName?&password? 响应 : true/false 2.图书列表展示 : URL : /book/getBookList 参数 : 无 响应 : List<BookInfo> 后端代码如下: package com…

【Python】jupyter notebook(学习笔记)

Jupyter Notebook初见 1、Jupyter Notebook介绍 web版的ipython 编程、写文档、记笔记、展示 格式.ipynb 2、为什么使用Jupyter Notebook? 画图方面的优势&#xff1a;图像的生成不会堵塞后面代码的执行数据展示方面的优势&#xff1a;生成的数据可以保存在文件中 3、J…