Linux进程地址空间

文章目录

  • 背景
  • 进程地址空间
    • 分页和虚拟地址空间
  • 写时拷贝

背景

研究背景:我们在之前通过fork函数创建子进程的时候,我们发现fork的返回值有两个,且值不相同但地址确实相同的,我们知道在物理空间上这种情况是不可能存在的,同一个地址的变量怎么会有两个值呢?
把原来的代码再拿来感受一下:
在这里插入图片描述

在这里插入图片描述
上述代码,返回值有两个,因为分别为父子进程的返回值,且父子进程共用同一份代码和数据,这个我们在之前就了解过了,没什么问题,再来看下面的代码,稍加改动
在这里插入图片描述
在这里插入图片描述
结果输出不同,因为我们这里把子进程的g_val改为了100,且在修改的过程中发生了写实拷贝,新开辟了一块空间给子进程存储了这个数据,这个我们似乎也可以理解,那么又要怎么解释他们的地址相同呢?通过上述例子我们可以得出以下结论:
这个地址一定不是真正的地址(物理地址),在Linux下这种地址叫做虚拟地址,我们在C/C++语言中所看到的地址也全部都是虚拟地址,物理地址用户一概看不到,全部都由OS统一进行管理。
因此OS必须负责把虚拟地址转换为物理地址

进程地址空间

程序地址空间其实是一种不准确的表达,准确的应该说成进程地址空间,那么该如何理解?
此时可能你还会有些疑问,为什么要有虚拟地址?直接使用物理地址不是更简单吗?
我们在语言层面上经常会听到静态区,常量区,栈区,堆区等概念,现在我们先来对地址空间进行一个划分。

#include<stdio.h>                                                                  
#include<stdlib.h>
int g_unval;//未初始化
int g_val = 100;//初始化
int main(int argc,char *argv[],char *env[])
{printf("code addr:           %p\n",main);//代码区起始地址const char* p1 = "hello world";//p1是指针变量(栈区),p指向字符常量h(字符常量区)printf("read only :          %p\n",p1);printf("global val:          %p\n",&g_val);printf("global uninit val:   %p\n",&g_unval);char *p2 = (char *)malloc(10);printf("heap addr:           %p\n", p2);char *p3 = (char *)malloc(10);printf("heap addr:           %p\n", p3);printf("stack addr:          %p\n",&p1);//p1先定义先入栈printf("stack addr:          %p\n",&p2);printf("args addr            %p\n",argv[0]);//命令行参数printf("args addr            %p\n",argv[argc-1]);printf("env addr:            %p\n",env[0]);//环境变量return 0;
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
main函数开始地址空间由低向高增长,且栈区地址由高向低增长,堆区地址由低向高增长

1.进程地址空间不是内存
2.进程地址空间,会在进程的整个生命周期内一直存在,直到进程退出

分页和虚拟地址空间

在这里插入图片描述
我们来解释一下为什么需要虚拟地址空间?为什么不能让进程直接访问物理内存呢?
保护物理内存不受任何进程内地址的直接访问,在虚拟地址到物理地址的转化过程中方便进行合法性检验。
比如野指针导致物理内存中的数据被修改,即使操作系统让该段内存是可读的,也会有风险,比如密码,可能会被别人读取到。
那么虚拟地址空间是如何解决进程直接访问物理内存可能会出现的问题呢?
每一个进程都有它对应的task_struct,地址空间,页表,页表中有虚拟地址和物理内存的映射关系,有了页表的存在,就有了虚拟地址到物理地址的对应转化关系,这个转化过程由操作系统完成,同时也可以帮助系统进行合法性检测。
我们在写代码时经常会出现指针越界,那么指针越界就一定会出现错误吗?
不一定,
1.越界可能它还是在自己的合法区域,比如他本来指向的就是栈区,越界后他依然指向栈区,编译器的检查机制就会认为它是合法的,当你本来是指向数据区,结果指针后来指向了字符常量区,编译器就会根据mm_struct里面的struct,end区间来判断你有没有越界,此时发现你越界了就会报错
2.页表也有一种权限管理,当你对数据区进行映射时,数据区是可以读写的,相应的在页表映射关系就是可读可写的,但是当你对代码区和字符常量区进行映射时,因为这两个区域只是可读的,相应的在也表中的映射关系中的权限就是可读的,如果你对这个区域进行了写,通过页表中的权限管理,操作系统就会直接将这个进程杀掉。
所以,进程地址空间的存在也使得可以通过start和end以及页表的管理权限来判断指针是否具有合法性
虚拟地址空间的存在使得所有的进程以统一的视角去看待内存,然后OS会把虚拟地址空间中的虚拟地址映射到真实的物理地址上去
因为地址空间和页表的存在,将进程管理模块和内存管理模块进行解耦合

写时拷贝

通常,父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本
在这里插入图片描述
子进程继承于父进程,数据段只是可读的,当有一方想要写入时,OS会通过一系列的管理机制,让它进行写实拷贝,在页表中重新去映射对应的关系,从而做到而不去修改原来的数据,此处还有一些疑问,OS是怎么知道哪些数据是可以进行写实拷贝的呢?这个问题比较复杂,以后再来说

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

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

相关文章

SQL中:语法总结(group by,having ,distinct,top,order by,like等等)

语法总结&#xff1a;group by&#xff0c;distinct ...... 1.分组group by、条件havinggroup byhaving 2.聚集函数count 3.order by4.对表中数据的操作&#xff1a;增insert、删delete、改update增insert删delete改update 5.对表中数据的操作&#xff1a;查select嵌套查询不相…

如何防范AI等技术带来的诈骗风险?从技术、法律、教育等多方面入手

文章目录 前言什么是AI诈骗案例案例一案例二 AI诈骗的特点如何预防和应对AI诈骗建议后记 前言 互联网是一把双刃剑&#xff0c;这是我们常说的一个问题。 随着人工智能技术的快速发展&#xff0c;AI诈骗成为当今社会面临的新兴威胁。不法分子利用人工智能技术&#xff0c;以更…

8.自定义组件布局和详解Context上下文

pages/index.vue layout布局运行在服务端 1、在项目的目录下新建layout文件夹&#xff0c;并新建一个blog.vue布局文件 2、在页面中的layout函数里&#xff0c;返回刚才新建布局文件的名字blog就可以使用了 export default {...layout (context) {console.log(context)retu…

在3分钟内使用AI-Chat生成精美PPT(附AI工具)

前言 在人工智能的大趋势下&#xff0c;AI-Chat是一款令人惊叹的技术。它用强大的自然语言处理技术帮助我们快速生成PPT&#xff0c;提高工作效率。本文将介绍使用ChatAI-Chat生成PPT的方法&#xff0c;以及使用Mindshow转换为炫酷的演示文稿。让技术为我们节省时间&#xff0c…

Ubuntu中使用yum命令出现错误提示:Command ‘yum‘ not found, did you mean:

Ubuntu中使用yum命令出现错误提示:Command ‘yum’ not found, did you mean: command ‘gum’ from snap gum (0.12.0) command ‘num’ from deb quickcal (2.4-1) command ‘yum4’ from deb nextgen-yum4 (4.5.2-6) command ‘uum’ from deb freewnn-jserver (1.1.1~a021…

Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作

文章目录 Stable Diffusion安装AnimateDiff插件适配sdxl模型适配 Stable Diffusion使用插件安装界面设置基础文生图加入lora的文生图 Stable Diffusion安装 我的情况比较特殊&#xff0c;显卡版本太老&#xff0c;最高也就支持cuda10.2&#xff0c;因此只能安装pytorch1.12.1&…

计算机网络【CN】介质访问控制

信道划分介质访问控制 FDMTDMWDMCDM【掌握eg即可】 随机介质访问控制 CSMA 1-坚持CSMA 非坚持CSMA p-坚持CSMA 空闲时 立即发送数据 立即发送数据 以概率P发送数据&#xff0c;以概率1-p推迟到下一个时隙 忙碌时 继续坚持侦听 放弃侦听&#xff0c;等待一个随机的时…

车载音频项目

加我微信hezkz17进数字音频系统研究开发交流答疑群(课题组) ー 1&#xff0e;负责此项目的音频链路的设计及其实现 在ADSP21375上实现音频链路的处理。如噪声门&#xff0c;压限器&#xff0c;高低通&#xff0c;PEQ、各种效果等。 2&#xff0e;负责DSP与MCU端SPI协议实现。M…

Builder 请进:波卡最新开发入门指南

撰文&#xff1a;Dennis Zoma 编译&#xff1a;OneBlock 社区 本文更新于 2023 年 10 月 3 日&#xff0c;来源&#xff1a;https://wiki.polkadot.network/docs/build-guide Polkadot 是一个区块链协议&#xff0c;有两个目标&#xff1a;在所有连接的平行链之间提供共享安全…

【操作系统】进程的控制和通信

文章目录 一. 实验目的二. 实验内容三. 实验步骤四. 实验结果 一. 实验目的 &#xff08;1&#xff09;加深对进程概念的理解&#xff0c;进一步认识并发执行的实质。 &#xff08;2&#xff09;掌握Linux 操作系统中进程的创建和终止操作。 &#xff08;3&#xff09;理解进程…

计算机网络-应用层(2)

一、DHCP 当需要跨越多个网段提供DHCP 服务时必须使用DHCP 中继代理&#xff0c; 就是在DHCP 客户和服务器之间转发DHCP 消息的主机或路由器。 DHCP 服务端使用UDP 的67号端口来监听和接收客户请求消息&#xff0c; 保留UDP 的68号端口用于接收来自DHCP 服务器的消息回复。 在…

基于 Python 的豆瓣电影分析、可视化系统,附源码

文章目录 1 简介2 技术栈具体实现1.设计豆瓣电影自动化爬虫程序&#xff0c;自动获取电影数据2.对爬取到的数据进行清洗和预处理&#xff0c;包括多维度数据字段清洗和扩充3.将清洗好的数据存储到MySQL数据库中 4 具体效果图5 推荐阅读 1 简介 基于Python flask 的豆瓣电影分析…

win11 右键菜单默认 显示更多选项

win10升级至win11后&#xff0c;一个很大的变化就是右键菜单&#xff0c;其不再显示所有的菜单项&#xff0c;而是默认只显示主要的几项&#xff0c;点击“显示更多选项”后&#xff0c;才会显示所有菜单项。 这对于经常需要用到右键其他菜单项的人来说明&#xff0c;非常的不…

【C++】C++入门(下)--内联函数 auto关键字 nullptr

目录 一 内联函数 1 内联函数概念和定义 2 内联函数特性 二 auto关键字 1 auto概念 2 auto 的使用细则 (1) auto与指针和引用结合起来使用 (2) 在同一行定义多个变量 3 auto不能推导的场景 (1) auto不能作为函数的参数 (2) auto不能直接用来声明数组 4 基于范围的fo…

关于深度学习中Attention的一些简单理解

Attention 机制 Attention应用在了很多最流行的模型中&#xff0c;Transformer、BERT、GPT等等。 Attention就是计算一个加权平均&#xff1b;通过加权平均的权值来自计算每个隐藏层之间的相关度&#xff1b; 示例 Attention 机制 Attention应用在了很多最流行的模型中&am…

C# 海康威视平台API接入 和网页摄像头部署

文章目录 前言相关网址综合安防管理平台网址获取Appkey和Secret/密码和密钥测试个人魔改工具类 海康视频接入获取摄像头Id下载海康Web插件原生Html导入网页设置 JS封装封装代码使用设置成功&#xff01; 前言 最近有个需求是将海康的摄像头视频画面传到我们平台上&#xff0c;…

C# OpenCvSharp Yolov8 Face Landmarks 人脸特征检测

效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Dnn; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace OpenCvSharp_Yolov8_Demo {public partial class frmMain…

FL Studio21.2演示版下载

FL Studio 21.2 带有 stem 分离和 FL Cloud&#xff0c;这是一项专为 FL Studio 打造的具有里程碑意义的新服务。其他新功能包括 FL Studio Fruity Edition 的 Audio Clips&#xff08;音频剪辑&#xff09;和一个新的模拟建模合成器 Kepler。 为庆祝 FL Studio 21.2 的发布&am…

Vue实现首页导航和左侧菜单,介绍mock.js并实现登录注册间的跳转,实现左侧栏折叠效果,优化Main.vue组件,使用mock.js生成随机响应数据

目录 1. mockjs 1.1 mockjs介绍 1.2 mockjs使用步骤 1.2.1 安装mockjs依赖 1.2.2 在项目中引入mockjs 1.2.3 创建目录和文件 1.2.4 为每个组件准备模拟数据 1.2.5 测试 1.2.6 前端调试 1.2.7 mockjs生成随机响应数据 1.2.8 根据不同响应&#xff0c;给出不同提示 2…

二进制搭建 Kubernetes+部署网络组件+部署CornDNS+负载均衡部署+部署Dashboard

二进制搭建 Kubernetes v1.20 k8s集群master01&#xff1a;20.0.0.50 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群master02&#xff1a;20.0.0.100k8s集群node01&#xff1a;20.0.0.110 kubelet kube-proxy docker etcd k8s集群node02&#xff1a;20.…