【linux】进程地址空间(进程三)

目录

  • 快速了解:
  • 引入最基本的理解:
  • 细节:
    • 如何理解地址空间:
      • a.什么是划分区域:
      • b.地址空间的理解:
    • 为什么要有进程空间?
    • 进一步理解页表与写时拷贝:

快速了解:

先来看这样一段代码。
在这里插入图片描述
运行结果:
在这里插入图片描述
因为子进程会继承父进程的代码和数据,所以这种结果我们是可以接受并理解的
但是如果我们对这段代码进行一个小修改:
在这里插入图片描述
运行结果:
在这里插入图片描述
我们说过父子进程是有独立性的,
而就现在来说进程 = 操作系统内核数据结构 + 代码与数据,那么一个新的进程创建势必会创造新的操作系统内核数据结构 ,而代码是只读的,那么数据是怎样进行处理的呢?

对于上边的例子:
地址是一样的,但是数据却不一样!这就说明&val的地址不是真实地物理地址,是虚拟地址

引入最基本的理解:

我们在学习C语言时肯定见过这样图
在这里插入图片描述
我们申请的堆上的空间,以及上篇文章讲过的命令行参数与环境变量等等都在这里申请的。

实际上这个东西并不是真的物理内存,而是虚拟内存,
根本上是个结构体(在linux中叫做struct mm_struct),有那么多的结构体我们肯定要管理,那就用到了“先描述,在组织”的

物理内存与虚拟内存的关系如下图:
在这里插入图片描述
解释:
我们写好的可执行程序先创建一系列内核数据结构,再将代码和数据加载到内存。
我们的g_val的虚拟地址在mm_struct内,通过页表映射到物理内存。

因为我们的子程序会继承父进程的代码和数据(故虚拟地址与页表的映射关系等会被子进程完全继承),因此我们的父子进程是指向同一个物理内存。
重点来了!
因为我们说过进程之间具有独立性,那么必然父子进程之间是不能相互影响的,那我们现在指向的都是同一块物理内存空间,怎样做才能不破坏独立性的规则呢?
答案是写时拷贝
意思是在写入数据时,先开辟一块新空间,将旧空间数据拷贝过去,在进行写入。

这就解决了这个问题。

在这里插入图片描述
可能这里有人会说:
既然都要求独立性了,那我们创建子进程时能不能直接就开辟好新的空间呢?
答案是没有必要,因为有时我们并不写入,要写入时在写时拷贝,这就是按需申请,通过调整拷贝的时间达到节约空间的目的,况且我们有非常多的数据实际上是并不会发生写入操作的。

细节:

目前我们大概理解了虚拟地址,
但是我们刚刚说的只是很笼统的框架,很多细节还没有说到。

如何理解地址空间:

研究这个问题前我们需要先研究两个子问题。

a.什么是划分区域:

我们的虚拟地址空间实际上是个结构体,这个结构体里存放着很多的start和end属性进行空间划分内核源码的结构体
这就很像我们上学时划的38线,今天你多一点,明天我又夺回来。

b.地址空间的理解:

回到问题本身。

我们先来画个示意图帮助大家建立一个框架。

在这里插入图片描述
结论:32位下进程地址空间理论最大值为4GB,但实际上只占用了其中的一小部分。这是因为虽然一个进程的地址空间理论上可以达到4GB,但其中内核空间占据了1GB,剩余的3GB才是用户空间,可供进程自身使用。

为什么要有进程空间?

这个东西是随着时代发展逐渐形成的,在最开始时进程是直接指向真是物理内存的。但因为指向的物理内存是很杂乱无序的。
故我们现在引出来第一个好处:

  1. 将无序变成有序,让内存以统一的视角看待物理内存与自己运行的各个区域·。
  2. 由进程与物理地址直接相连->由虚拟地址+页表作为中转站,解耦
  3. 也是最重要的一点,对物理内存进行保护。

我们解释一下最后一点:
这就像你的压岁钱被你妈妈收走,说等你有需要了再像我要,等你缺学习用品时,你妈妈一听就给了你一点钱,
但是等你想买4399一卡通时,你妈妈就会拒绝你的请求,保护了压岁钱。

这也就避免你错误的修改数据等等操作而改变了真正的物理内存而造成错误,在页表阶段就给你拦截下来。

进一步理解页表与写时拷贝:

页表其实更加复杂一些,在这里插入图片描述
这里图示只是简单说明了一下,他的功能其实更加全面。

进程专题到此全部讲解完毕了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法系列--两个数组的dp问题(1)

💕"低头要有勇气,抬头要有底气。"💕 作者:Mylvzi 文章主要内容:算法系列–两个数组的dp问题(1) 大家好,今天为大家带来的是算法系列--两个数组的dp问题(1),两个数组的dp问题在动态规划问题中属于较难的部分…

c++之旅第八弹——多态

大家好啊,这里是c之旅第八弹,跟随我的步伐来开始这一篇的学习吧! 如果有知识性错误,欢迎各位指正!!一起加油!! 创作不易,希望大家多多支持哦! 一&#xff0…

AI研报:从Sora看多模态大模型发展

《从Sora看多模态大模型发展》的研报来自浙商证券,写于2024年2月。 这篇报告主要探讨了多模态大模型的发展趋势,特别是OpenAI发布的视频生成模型Sora,以及其对行业发展的影响。以下是报告的核心内容概述: Sora模型的发布&#x…

【C++航海王:追寻罗杰的编程之路】queue

目录 1 -> queue的介绍和使用 1.1 -> queue的介绍 1.2 -> queue的使用 1.3 -> queue的模拟实现 1 -> queue的介绍和使用 1.1 -> queue的介绍 queue的文档介绍 1. 队列是一种容器适配器,专门用于在FIFO(先进先出)上下文中操作,其…

C语言例4-4:putchar()函数的调用格式和使用的例子

代码如下&#xff1a; //putchar()函数的调用格式和使用的例子 #include<stdio.h> //编译预处理命令&#xff0c;即文件包含命令 int main(void) {char ch1N, ch2E, ch3W;putchar(ch1);putchar(ch2);putchar(ch3); //输出变量c1、c2和c3中的字符putchar(\n);putcha…

Protocol Buffers设计要点

概述 一种开源跨平台的序列化结构化数据的协议。可用于存储数据或在网络上进行数据通信。它提供了用于描述数据结构的接口描述语言&#xff08;IDL&#xff09;&#xff0c;也提供了根据 IDL 产生代码的程序工具。Protocol Buffers的设计目标是简单和性能&#xff0c;所以与 XM…

长安链共识算法切换:动态调整,灵活可变

#功能发布 长安链3.0正式版发布了多个重点功能&#xff0c;包括共识算法切换、支持java智能合约引擎、支持后量子密码、web3生态兼容等。我们接下来为大家详细介绍新功能的设计、应用与规划。 随着长安链应用愈加成熟与广泛&#xff0c;一些在生产中很实用的需求浮出水面。长安…

MySQL进阶-----索引的结构与分类

目录 前言 一、认识索引 二、索引结构 1.概述 2. 二叉树 3 .B-Tree 4.BTree 5.Hash 三、索引的分类 1 .索引分类 2 .聚集索引&二级索引 前言 索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维…

基于nginx 动态 URL反向代理的实现

背景&#xff1a; 我们在项目中在这样一个场景&#xff0c;用户需要使用固定的软件资源&#xff0c;这些资源是以服务器或者以容器形式存在的。 资源以webAPI方式在内网向外提供接口&#xff0c;资源分类多种类型&#xff0c;每种类型的资源程序和Wapi参数都一样。这些资源部属…

javaWeb在线考试系统

一、简介 在线考试系统是现代教育中一项重要的辅助教学工具&#xff0c;它为学生提供了便捷的考试方式&#xff0c;同时也为教师提供了高效的考试管理方式。我设计了一个基于JavaWeb的在线考试系统&#xff0c;该系统包括三个角色&#xff1a;管理员、老师和学生。管理员拥有菜…

ubuntu2004自动更新内核导致nvidia驱动无法正常启动的问题

症状 开机后&#xff0c;nvidia-smi无法正常显示显卡状态&#xff0c;另外无法连接多个显示屏 解决 参考这个文章&#xff1a; ls /usr/src可以看到已安装的nvidia驱动版本是nvidia-535.54.03 然后运行下面的指令&#xff1a; sudo apt-get install dkmssudo dkms instal…

Mimikatz介绍

一、Mimikatz定义 mimikatz是benjamin使用C语言编写的一款非常强大的安全工具&#xff0c;它可以从机器内存中提取明文密码、密码Hash、PIN码和Kerberos票据等。它的功能非常强大&#xff0c;得到全球安全研究员的广泛使用。 Mimikatz 是一款功能强大的轻量级调试神器&#xff…

Java版直播商城免 费 搭 建:平台规划与常见营销模式,电商源码、小程序、三级分销及详解

【saas云平台】打造全行业全渠道全场景的saas产品&#xff0c;为经营场景提供一体化解决方案&#xff1b;门店经营区域化、网店经营一体化&#xff0c;本地化、全方位、一站式服务&#xff0c;为多门店提供统一运营解决方案&#xff1b;提供丰富多样的营销玩法覆盖所有经营场景…

在vue中使用echarts饼图示例

1.安装 npm install echarts --save 2.官方示例 option {title: {text: Referer of a Website,subtext: Fake Data,left: center},tooltip: {trigger: item},legend: {orient: vertical,left: left},series: [{name: Access From,type: pie,radius: 50%,data: [{ value: 104…

巧用cpl文件维权和免杀(下)

cpl文件的应用 bypass Windows AppLocker 什么是Windows AppLocker: AppLocker即“应用程序控制策略”&#xff0c;是Windows 7系统中新增加的一项安全功能。在win7以上的系统中默认都集成了该功能。 默认的Applocker规则集合,可以看到cpl并不在默认规则中: 开启Applocker规…

NVIDIA NIM 提供优化的推理微服务以大规模部署 AI 模型

NVIDIA NIM 提供优化的推理微服务以大规模部署 AI 模型 生成式人工智能的采用率显着上升。 在 2022 年 OpenAI ChatGPT 推出的推动下&#xff0c;这项新技术在几个月内就积累了超过 1 亿用户&#xff0c;并推动了几乎所有行业的开发活动激增。 到 2023 年&#xff0c;开发人员…

聊一聊常见的网络安全模型

目录 一、概述 二、基于时间的PDR模型 2.1 模型概念提出者 2.2 模型图 2.3 模型内容 2.3.1 Protection&#xff08;保护&#xff09; 2.3.2 Detection&#xff08;检测&#xff09; 2.3.3 Response&#xff08;响应&#xff09; 2.4 PDR模型思想 2.4.1 PDR模型假设 2…

【k8s】kubeasz 3.6.3 + virtualbox 搭建本地虚拟机openeuler 22.03 三节点集群 离线方案

kubeasz项目源码地址 GitHub - easzlab/kubeasz: 使用Ansible脚本安装K8S集群&#xff0c;介绍组件交互原理&#xff0c;方便直接&#xff0c;不受国内网络环境影响 拉取代码&#xff0c;并切换到最近发布的分支 git clone https://github.com/easzlab/kubeasz cd kubeasz gi…

【openGL4.x手册10】基元程序集和面部剔除

https://www.khronos.org/opengl/wiki/Face_Culling 一、说明 基元汇编是 OpenGL 渲染管道中的阶段&#xff0c;在该阶段&#xff0c;基元被划分为一系列单独的基本基元。经过一些小的处理后&#xff0c;如下所述&#xff0c;它们被传递到光栅器进行渲染。 二 早期原始组装 基…

Spring实例化Bean的三种方式

参考资料&#xff1a; Core Technologies 核心技术 spring实例化bean的三种方式 构造器来实例化bean 静态工厂方法实例化bean 非静态工厂方法实例化bean_spring中有参构造器实例化-CSDN博客 1. 构造函数 1.1. 空参构造函数 下面这样表示调用空参构造函数&#xff0c;使用p…