进程地址空间

虚拟地址:

引子:
我们在Linux中使用fork函数创建子进程时是否会产生一下几个疑惑。
为什么一个变量id具有两个值?
学习C语言后,我们都知道一个函数是不会返回两个值的,那么我们只能猜测是fork函数return了两次。
事实也的确如此,当fork之后,父子进程就共享了一段代码,父进程return一次,子进程return一次,就当然有两个值了。
But还有一个疑问,第一次写入id的数据为什么没有被覆盖?或许我们会任务父子进程的id在两个作用域中互不影响,地址不同。
的确进程之间是具有独立性的,父子进程并不会相互影响,但两个进程中的id真的地址不同吗,实现以下就知。
在这里插入图片描述

两个地址居然一模一样,同一个地址为什么对应的数据不一样???
可以非常确定的是,物理内存上的每一个地址都对应着唯一的数据。
既然这样,我们可以断言,这里的地址绝对不是物理内存,更像是一种经过封装后的地址,我们成为虚拟地址

可以说几乎所有高级语言给我们看到地址都是虚拟地址,存储虚拟地址的容器我们成为地址空间,所谓地址空间简单地说是一种内核数据结构,在Linux下地址空间的划分非常简单,是在一个结构体中通过指针划分好几个区域,这些区域就是我们熟悉的栈区、堆区、静态区、常量区

页表:

虚拟地址与物理地址的桥梁,既然不能直接得到物理地址,那么就需要借助第三方来帮助得到,这就是页表,页表是一种映射关系。
我们以数学中的f(x)函数为例,虚拟地址是自变量,物理地址是因变量,那么页表就是对应关系。

地址空间存在的原因:

1、早期的计算机确实是没有地址空间的概念的,都是直接访问物理内存的。但是这么做有一个致命的缺陷,就是安全性问题,由于物理内存是能够任意读写的,物理内存不知道什么是权限,进程之间互相干扰的可能性极大。
有了地址空间的存在,就能够把一些非法访问拦截住,在学习C的过程,你肯定出现过访问权限冲突的问题吧,这就是操作系统把你的行为阻止了。
在这里插入图片描述
2、由于页表映射关系的存在,物理内存中的数据可以处于一种无序的状态,因为都可以直接通过页表找到。大大减低了进程管理模块和内存管理模块的相互影响,起到了解耦合的作用。

3、因为每个进程都拥有自己的页表和地址空间,进程之间的联系就减弱了,体现了进程的独立性原则。

4、提高物理内存利用率,我们在动态申请空间后可能不会马上使用,操作系统便不会直接给我们物理空间,只是给你一个声明。

解释一开始的问题:
当我们创建子进程时,子进程会拷贝父进程的地址空间和页表,但是会对页表中id的虚拟地址和物理地址间的对应关系做出调整,使它们都有自己的物理地址,但是没有修改我们所看到的虚拟地址。

了解程序计数器:

CPU给每一个进程处理的时间是有限的,一旦一个进程的规定时长达到后,它会出让资源给下一个进程,自己回到运行队列尾部等待下一次CPU访问,从而达到进程并发,但是CPU怎么知道第二次访问该进程是从它对应的代码的哪一句运行的,这就需要程序计数器来告诉CPU了,程序计数器存储了上一次该进程暂停的位置。方便CPU快速定位。

学 到 这 里‘
故而我们可以对进程的概念做进一步拓展
进程:PCB+代码数据+页表

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

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

相关文章

(16)Hive——企业调优经验

前言 本篇文章主要整理hive-3.1.2版本的企业调优经验,有误请指出~ 一、性能评估和优化 1.1 Explain查询计划 使用explain命令可以分析查询计划,查看计划中的资源消耗情况,定位潜在的性能问题,并进行相应的优化。 explain执行计划…

基于Python实现的元宵节猜灯谜兑奖软件源码,输入灯谜序号,获取谜面及谜底

基于Python实现的元宵节猜灯谜兑奖软件源码,输入灯谜序号,获取谜面及谜底 核心代码: import sys from time import sleep import xlrd import os import tkintertable_listA "" table_listB ""filename os.getcwd()&…

一个简单的链接脚本,用来将两个以上的.o文件合并在一起,以及如何看机器码的含义

下面是一个简单的lds链接脚本,用来将两个以上的.o文件合并在一起,并且用来指定链接后的代码加载到内存中的起始地址。 SECTIONS 说明这是段的描述脚本 {. 0xD0020010; 加载代码到内存中的起始地址为0xD0020010.text : { 代码段mystart.o mystar…

Java图形化界面编程——五子棋游戏 笔记

2.8.5 五子棋 接下来,我们使用之前学习的绘图技术,做一个五子棋的游戏。 注意,这个代码只实现了五子棋的落子、删除棋子和动画等逻辑实现,并没有把五子棋的游戏逻辑编写完整,比较简单易上手。 图片素材 package…

[嵌入式系统-14]:常见实时嵌入式操作系统比较:RT-Thread、uC/OS-II和FreeRTOS、Linux

目录 一、实时嵌入式操作系统 1.1 概述 1.2 什么“实时” 1.3 什么是硬实时和软实时 1.4 什么是嵌入式 1.5 什么操作系统 二、常见重量级操作系统 三、常见轻量级嵌入式操作系统 3.1 概述 3.2 FreeRTOS 3.3 uC/OS-II 3.4 RT-Thread 3.5 RT-Thread、uC/OS-II、Free…

智能汽车行业产业研究报告:毫米波雷达优势明显,核心壁垒是芯片、天线阵列、波形设计

今天分享的是智能汽车系列深度研究报告:《智能汽车行业产业研究报告:毫米波雷达优势明显,核心壁垒是芯片、天线阵列、波形设计》。 (报告出品方:国泰君安证券) 报告共计:67页 毫米波雷达被广泛…

浅谈业务场景中缓存的使用

浅谈缓存 一、背景二、缓存分类1.本地缓存2.分布式缓存 三、缓存读写模式1.读请求2.写请求 四、缓存穿透1.缓存空对象2.请求校验3.请求来源限制4.布隆过滤器 五、缓存击穿1.改变过期时间2.串行访问数据库 六、缓存雪崩1.避免集中过期2.提前更新缓存 七、缓存与数据库一致性1.设…

超详细的介绍Python语句

一、 常用命令 在介绍Python语句之前,先介绍一下几个有用的Python命令。 dir(模块名或类名或变量名或表达式名):获得当前模块、变量对应类型、表达式计算值对应类的属性列表 type(变量名或表达式名):获取变量或表达式计算值的对…

ChatGPT绘图指南:DALL.E3玩法大全(一)

一、 DALLE.3 模型介绍 1、什么是 DALLE.3 模型? DALLE-3模型,是一种由OpenAI研发的技术,它是一种先进的生成模型,可以将文字描述转化为清晰的图片。这种模型的名称"DALLE"实际上是"Deep Auto-regressive Latent …

optee imx8mm

总仓库 git clone https://github.com/Xsyin/imx8mqevk.git -b container_region 替换imx8mqevk中的optee-client git clone https://github.com/nxp-imx/imx-optee-client.git -b lf-5.15.32_2.0.0 用 5.15.32 kernel 会有如下报错,需要将optee os升级到分支 lf-…

单片机学习笔记---LCD1602

LCD1602介绍 LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符(比如日文的片假名),还可以有8个自定义字符 显示容量:…

智能汽车专题:华为赋能下的车企,具备下一阶段Winner的潜质

今天分享的是智能汽车系列深度研究报告:《智能汽车专题:华为赋能下的车企,具备下一阶段Winner的潜质》。 (报告出品方:广发证券) 报告共计:27页 华为汽车业务历史沿革 基于ICT领域的深厚积累…