当前位置: 首页 > news >正文

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

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);}elseprintf("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

相关文章:

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

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法…感兴趣就关注我吧&#xff01;你定不会失望。 本篇导航 0. 数据在内存中的分布1. 虚拟地址与真实物理地址2. 进程地址空间2.1 进程地址空间概念2.2 进程->页表->内存 0. 数据在内…...

Flink在汽车行业的应用【面试加分系列】

很多同学问我为什么要发这些大数据前沿汇报&#xff1f; 一方面是自己学习完后觉得非常好&#xff0c;然后总结发出来方便大家阅读&#xff1b;另外一方面&#xff0c;看这些汇报对你的面试帮助会很大&#xff0c;特别是面试前可以看看即将面试公司在大数据前沿的发展动向&…...

智慧工地源码:助力数字建造、智慧建造、安全建造、绿色建造

智慧工地围绕建设过程管理&#xff0c;建设项目与智能生产、科学管理建设项目信息生态系统集成在一起&#xff0c;该数据在虚拟现实环境中&#xff0c;将物联网收集的工程信息用于数据挖掘和分析&#xff0c;提供过程趋势预测和专家计划&#xff0c;实现工程建设的智能化管理&a…...

Spring Boot(二)

1、运行维护 1.1、打包程序 SpringBoot程序是基于Maven创建的&#xff0c;在Maven中提供有打包的指令&#xff0c;叫做package。本操作可以在Idea环境下执行。 mvn package 打包后会产生一个与工程名类似的jar文件&#xff0c;其名称是由模块名版本号.jar组成的。 1.2、程序…...

上海亚商投顾:沪指缩量调整跌 高位强势股继续退潮

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数11月10日弱势震荡&#xff0c;上证50盘中跌超1%&#xff0c;以保险为首的权重板块走势较弱。 高位强…...

药理学试卷

1【单选题】关于尼可刹米&#xff0c;错误的是 C A、直接兴奋延脑呼吸中枢 B、刺激颈动脉体化学感受器 C、作用时间较长 D、过量可致惊厥 2【单选题】属于第三代头孢菌素的药物是 C A、头孢克洛 B、头孢噻吩 C、头孢曲松 D、头孢匹罗 3【单选题】不属于β受体阻断药禁…...

SpringBoot3-快速入门

1.前置知识 Java17Spring、SpringMVC、MyBatisMaven、IDEA\ 2. 环境要求 环境&工具 版本&#xff08;or later&#xff09; SpringBoot 3.0.5 IDEA 2021.2.1 Java 17 Maven 3.5 Tomcat 10.0 Servlet 5.0 GraalVM Community 22.3 Native Build Tools 0.9…...

具名挂载和匿名挂载

匿名卷挂载 &#xff1a; -v 的时候只指定容器内的路径 如下面这个&#xff1a;/etc/nginx 1.docker run -d -P --name nginx -v /etc/nginx nginx 2.查看所有卷 docker volume ls 这里发现&#xff0c;这就是匿名挂载&#xff0c;只指定容器内的路径&#xff0c;没有指定…...

ARM串口

...

C++ Qt 学习(文章链接汇总)

C Qt 学习&#xff08;一&#xff09;&#xff1a;Qt 入门 C Qt 学习&#xff08;二&#xff09;&#xff1a;常用控件使用与界面布局 C Qt 学习&#xff08;三&#xff09;&#xff1a;无边框窗口设计 C Qt 学习&#xff08;四&#xff09;&#xff1a;自定义控件与 qss 应用 …...

2311d9月会议

DLF2023年9月月度会议摘要 Robert Robert,在DConf上做了一些初步的JSON5工作.他还更新了Bugzilla到GitHub的迁移脚本.他使用了"隐藏"API,现在脚本要快得多. 除此外,他在DScanner上做了一些小事,并等待JanJurzitza(Webfreak)合并它们.他指出,沃尔特曾要求他写一篇演…...

《算法通关村——二分查找在旋转数字中的应用》

《算法通关村——二分查找在旋转数字中的应用》 这里我们直接通过一个题目&#xff0c;来了解二分查找的应用。 153. 寻找旋转排序数组中的最小值 已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&a…...

C/S架构学习之基于TCP的本地通信(服务器)

基于TCP的本地通信&#xff08;服务器&#xff09;&#xff1a;创建流程&#xff1a;一、创建字节流式套接字&#xff08;socket函数&#xff09;&#xff1a; int sock_fd socket(AF_LOCAL,SOCK_STREAM,0);二、创建服务器和客户机的本地网络信息结构体并填充服务器本地网络信…...

乡镇村污水处理智慧水务智能监管平台,助力污水监管智慧化、高效化

一、背景与需求 随着城市化进程的加速&#xff0c;排放的污水量也日益增加&#xff0c;导致水污染严重。深入打好污染防治攻坚战的重要抓手&#xff0c;对于改善城镇人居环境&#xff0c;推进城市治理体系和治理能力现代化&#xff0c;加快生态文明建设&#xff0c;推动高质量…...

OSPF综合

实验拓扑 实验需求&#xff1a; 1 R4为ISP&#xff0c;其上只能配置IP地址; R4与其他所有直连设备间均使用公有IP 2 R3-R5/6/7为MGRE环境&#xff0c;R3为中心站点 ; 3 整个OSPF环境IP基于172.16.0.0/16划分; 4 所有设备均可访问R4的环回; 5 减少LSA的更新量&#xff0c;加快收…...

vue分片上传视频并转换为m3u8文件并播放

开发环境&#xff1a; 基于若依开源框架的前后端分离版本的实践&#xff0c;后端java的springboot&#xff0c;前端若依的vue2&#xff0c;做一个分片上传视频并分段播放的功能&#xff0c;因为是小项目&#xff0c;并没有专门准备文件服务器和CDN服务&#xff0c;后端也是套用…...

【MySQL】对表结构进行增删查改的操作

表的操作 前言正式开始建表查看表show tables;desc xxx;show create table xxx; 修改表修改表名 rename to对表结构进行修改新增一个列 add 对指定列的属性做修改 modify修改列名 change 删除某列 drop 删除表 drop 前言 前一篇讲了库相关的操作&#xff0c;如果你不太懂&…...

Hadoop原理,HDFS架构,MapReduce原理

Hadoop原理&#xff0c;HDFS架构&#xff0c;MapReduce原理 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c…...

【Spring Boot】035-Spring Boot 整合 MyBatis Plus

【Spring Boot】035-Spring Boot 整合 MyBatis Plus 【Spring Boot】010-Spring Boot整合Mybatis https://blog.csdn.net/qq_29689343/article/details/108621835 文章目录 【Spring Boot】035-Spring Boot 整合 MyBatis Plus一、MyBatis Plus 概述1、简介2、特性3、结构图4、相…...

Hafnium之强制性的接口

安全之安全(security)博客目录导读 目录 一、FFA_VERSION 二、FFA_FEATURES 三、FFA_RXTX_MAP/FFA_RXTX_UNMAP 四、FFA_PARTITION_INFO_GET 五、FFA_PARTITION_INFO_GET_REGS...

智慧农业之梨树识别数据集 果树识别 水果检测 梨子识别数据集 梨子识别数据集第10643期

梨子识别数据集第10643期 README 项目概述 本数据集聚焦于农业场景下的梨子目标检测任务&#xff0c;包含真实果园环境中采集的图像&#xff0c;适用于果实定位、成熟度分析及智能农业应用研究。数据提供 Yolo 与 VOC 双格式标注&#xff0c;便于无缝集成至主流深度学习框架&am…...

Unity托管堆内存优化实战:如何避免频繁GC引发的性能卡顿

1. 为什么你的Unity游戏会卡顿&#xff1f;GC是罪魁祸首 刚做完的Unity游戏明明跑得好好的&#xff0c;一到真机上就出现迷之卡顿&#xff1f;特别是场景切换或者特效爆发时&#xff0c;画面突然卡住0.5秒&#xff1f;这很可能就是垃圾回收&#xff08;GC&#xff09;在搞鬼。…...

STM32定时器编码器模式实战:5分钟搞定电机转速与转向测量(附常见波形问题排查)

STM32定时器编码器模式实战&#xff1a;5分钟搞定电机转速与转向测量&#xff08;附常见波形问题排查&#xff09; 在机器人控制和自动化项目中&#xff0c;电机转速和转向的精确测量往往是系统闭环控制的基础。传统软件计数方式不仅占用CPU资源&#xff0c;还容易因中断延迟导…...

Fish Speech 1.5语音延迟优化:2-5秒响应背后的推理加速技巧

Fish Speech 1.5语音延迟优化&#xff1a;2-5秒响应背后的推理加速技巧 1. 引言&#xff1a;从分钟级到秒级的突破 还记得早期的文本转语音系统吗&#xff1f;输入一段文字&#xff0c;等待几分钟才能听到结果&#xff0c;那种焦急的体验让很多开发者望而却步。如今&#xff…...

从湖科大计网笔记出发,聊聊我当年学网络时踩过的那些坑(附避坑指南)

从湖科大计网笔记出发&#xff1a;一位工程师的避坑实战指南 1. 那些年我掉进的TCP/IP陷阱 第一次接触TCP三次握手时&#xff0c;我天真地以为这就像打电话的"喂-喂-好"那么简单。直到期末考试时被问到"为什么不能两次握手&#xff1f;"&#xff0c;我才意…...

零基础5分钟上手:Wan2.2-T2V-A5B文本生成视频保姆级教程

零基础5分钟上手&#xff1a;Wan2.2-T2V-A5B文本生成视频保姆级教程 1. 为什么选择Wan2.2-T2V-A5B 如果你正在寻找一个快速、轻量级的文本生成视频工具&#xff0c;Wan2.2-T2V-A5B绝对值得考虑。这个50亿参数的模型专为快速内容创作优化&#xff0c;能在普通显卡上实现秒级出…...

文件搜索效率低下?FSearch让Linux文件定位速度提升10倍的技术实现与应用指南

文件搜索效率低下&#xff1f;FSearch让Linux文件定位速度提升10倍的技术实现与应用指南 【免费下载链接】fsearch A fast file search utility for Unix-like systems based on GTK3 项目地址: https://gitcode.com/gh_mirrors/fs/fsearch 在Linux系统管理中&#xff0…...

Smithbox终极指南:5个技巧让你轻松掌握魂系列游戏修改艺术

Smithbox终极指南&#xff1a;5个技巧让你轻松掌握魂系列游戏修改艺术 【免费下载链接】Smithbox Smithbox is a modding tool for Elden Ring, Armored Core VI, Sekiro, Dark Souls 3, Dark Souls 2, Dark Souls, Bloodborne and Demons Souls. 项目地址: https://gitcode.…...

Python实战:用PyWavelets实现小波降噪(附软硬阈值函数对比代码)

Python实战&#xff1a;用PyWavelets实现小波降噪&#xff08;附软硬阈值函数对比代码&#xff09; 在信号处理领域&#xff0c;噪声就像不请自来的客人&#xff0c;总是干扰着我们想要获取的真实信息。想象一下医生试图从嘈杂的心电图中诊断病情&#xff0c;或是摄影师处理夜间…...

OFA图像语义蕴含模型实战:基于Python的英文图文关系判断

OFA图像语义蕴含模型实战&#xff1a;基于Python的英文图文关系判断 用AI看懂图片和文字之间的关系&#xff0c;原来这么简单 你有没有遇到过这样的情况&#xff1a;看到一张图片和一段英文描述&#xff0c;想要快速判断它们是否匹配&#xff1f;比如电商平台需要自动审核商品图…...