由浅入深的了解进程(6)---地址空间

news2025/7/8 13:15:41

地址空间

  • 进程的地址空间
    • 1、直接代码展示的现象
    • 2、基本理解
    • 3、细节问题
      • 3、1、独立性细节
      • 3、2、地址空间细节
    • 4、问题回溯
    • 5、Linux2.6内核进程调度队列

进程的地址空间

1、直接代码展示的现象

在这里插入图片描述
其中当父子进程之间的g_val改变之后,为什么即使是不同的值了之后,两个进程中的g_val的地址还是一样的?
虽然不能够确认这是什么意思,但是这个绝对不是物理地址,如果是物理地址的话,一个地址修改过值了之后不可能还能表示另外一个值,所以这个应该是虚拟地址。

2、基本理解

由于硬盘中存在可执行的程序,当我们开始运行程序的时候,就会把代码和数据放在内存中,由前面所学到的一切的有关进程的知识之中,我们知道在操作系统中有着进程task_struct来帮助管理这些数据和代码以及别的一些状态。同时此次介绍的将是进程中的另一部分,地址空间。
地址空间能够被进程中的指针找到,在32位的操作系统之下,地址空间通常都是4GB的。这些都是在OS内部的在这里插入图片描述
task_struct结构体把代码和数据分开准确的存放在地址空间的栈,堆等地方,但是这个数据不是真正的保存,而是提供线性的虚拟地址最终找到真正的存在物理地址中的数据。
究竟是按照什么找到的呢?是按照分页来从虚拟地址找到物理地址。

其实首先对于子进程来说,由于会继承父进程的数据和代码,所以说子进程在开始的时候是直接浅拷贝父进程中所有的内容,地址空间,虚拟地址以及页表,但是如果直接按照页表来说找到对应的数据的话,并且修改成功,那么这次的修改就会被父进程看到,从而也改变了父进程中的数据,也就势必会导致父进程本身运行的问题。
进程本身在运行的时候应该符合独立性 ,所以就不应该子进程在修改数据的时候改变父进程中的数据。
所以回到刚刚的问题,为什么两个的地址是一样的,但是最终的结果确实代表的不同的值?
就是因为,子进程在修改这个数据之前,操作系统会在物理内存中重新开辟一个空间,开辟完空间之后,就把老的数据拷贝到新空间之中,把新的物理地址和老的物理地址相比,把新的物理地址放在子进程的页表当中,重新构成映射,此时子进程的指向就不会指向原来的地址,当这个程序执行结束之后,程序才会继续执行,修改变量的值。==这些操作都是操作系统准备的,OS自主完成写时拷贝。==所以这样的结果就是打印的地址是一样的,但是所展示的结果却是不一样的原因。
如果说每一次创建进程,就会创建一个自己的地址空间,每一个进程也都要有自己独立的页表。所以操作系统中,创建一个进程,不仅仅是创建一个进程的PCB,对于很多的地址空间,OS也要进行管理,那应该如何管理众多进程的地址空间呢?先描述,再组织。地址空间的本质就是内核中的一个结构体对象。

3、细节问题

3、1、独立性细节

独立性: 如果父子进程不写,未来一个全局变量是父子共享的,代码是共享的(只读的)。
1、问题: 为什么我们要这么做?换句话说,为什么不是直接把所有的数据都拷贝到子进程之中呢?为什么是只有在修改变量的值的时候才创建新的内存空间?
1、答案: 那是因为在父进程中有很多的数据子进程不一定会修改,比如说命令行参数和环境变量,子进程几乎都不会进行修改,所以由于这部分的数据本来改动就不大,但是占据的数据却很大的话,每次还要单独拷贝一份放在内存空间中就会相当的消耗资源空间。所以写时拷贝就是一种按需申请,不会过多的浪费空间。同时还保证了进程的独立性。
2、问题: 是不是写时拷贝的时候,由于每一都需要重新开辟空间然后再创建变量的操作,会不会降低运行的速度反而不如直接拷贝呢?
2、答案: 其实不然,如果直接进行拷贝的话,那拷贝的可不只是一点半点,而是很多的信息。反而这样才是更需要时间,降低效率的。

3、2、地址空间细节

1、什么是划分区域?
1、解释: 划分区域就是像上面图上展示的地址空间一样,一块地址空姐分为不同的功能。如何用计算机语言做到呢?

struct area
{
	int start;
	int end;
}
struct destop
{
	struct area left;
	struct area right;
}
//如果想要变换的话,就能够直接通过这样的形式进行改变
d.left.start=1;
d.left.end+=20;
d.right.begin-=20;
d.right.end=100l

所以地址空间的本质也就是内核中的一个struct的结构体,内部很多的属性都是表示start和end的范围。

2、如何理解地址空间?
2、解释: 举个例子来说,就像是一个漂亮国中的有一个大富豪,手里有10亿dollar。他悄悄咪咪有4个私生子,每一个私生子都差不多到20多的岁数了,此时大富豪就对每一个人说,你们好好干,好好闯荡,要是怎么样有什么成就的话,就把我的资产全部都继承给你们。这样的话,每一个私生子都会认为只有自己的父亲只有一个孩子。如果将来遇到麻烦的事情的话,向自己的老爸要钱,他们也都会认为都有10亿能够帮助自己。可是事实并不是这样的。所以大富豪也得管理这10亿,因为不可能每一个孩子都能够花上10亿 。
所以这样的现实中存在的案例,也能够用来理解操作系统,其中大富豪的角色就是操作系统,10个亿对应的就是物理内存,私生子对应的是进程,给每一个私生子画的大饼就是进程地址空间
3、为什么要有地址空间?
3、解释: 为什么要对每一个进程构建一个地址空间呢?我们为什么不直接通过进程的task_struct中直接记录下我们存放在物理内存中的地址呢?
首先,如果是直接访问的话,可能存在着访问越界的情况,访问越界的话,可能还会导致别的进程的数据被修改,这样的话还会影响别的进程。而且实际的物理内存中,代码区,数据区,栈区,堆区,共享区,命令行参数和环境变量都是无序且杂乱的,直接访问不太方便管理。
所以地址空间加上页表的好处就能够让这些数据变得让task_struct看起来有序,方便我们的管理,能够让原本无序的物理内存中存储的数据变为一个可以连续访问的。
除此之外,操作系统并不是说每一次的进程中malloc的时候都需要再内存空间中申请一块地址,只有在使用的时候才会真正的再物理内存中申请,在没开始使用的时候,只不过是在地址空间上申请,在页表中申请了虚拟地址,这样的话能够有效的节省物理内存。进程管理模块和内存管理模块进行解耦
还有, 如果我们有地址空间的话,还能够在越界的时候在查找页表的时候直接能够找到相对应的错误,能够直接禁止访问,说明地址空间还拥有
拦截非法请求
的功能。本质的目的就是对物理内存的保护。
4、如何进一步理解页表
==4、回答:==页表不仅仅只是虚拟地址和物理内存中相互对应的关系,还有在页表中还存在判断是否存在于内存中以及对这段数据的rwx权限的描述。
所以,我们之前的一个问题现在来看的话,就能够拥有更好的解释。

char *str="hello world"
*str='H'

这段代码在之前的时候,已经讲过了是错的,因为一个指向静态常量区的不能够修改。
那有没有进一步的思考,为什么不能修改呢?其实就是因为这段代码在进程中的task_struct的进程空间中存放的页表中的虚拟地址找到的物理内存中的地址的条件中是只能够读,不能够写的,所以刚刚的代码才是错误的。
所以我们在写代码的时候即使是写错了,也不会对原本物理内存中的进程造成影响,因为检查到错误的时候就已经报错了,不会再进行下一步的写入物理内存。
5、进一步理解写时拷贝,操作系统是这么支持写诗拷贝的?
5、回答: 由于进程地址空间的在一开始的时候我们定义的那个代码,首先是只有父进程的,此时的页表对于的一开始定义的变量是有指定的物理内存的并且此时的页表中对于这个变量的权限是可读也可写的。但是当我们创建了子进程的时候,操作系统就会修改页表中变量的权限,修改为可读的,这样的话,如果我们在子进程修改的话,OS就会识别到错误,当识别到错误杀掉进程之前的话还是需要进行一些操作的,会识别1、是不是数据不在物理内存中 2、是不是数据需要写时拷贝 3、如果上面两种情况都不是的话,才会进行异常处理。
情况一表示的是缺页中断,属于正常情况。
情况二表示的是就是需要写时拷贝。怎么判断出来的?数据中存在计数数据,当计数为2,并且为可读可写的话,就会进行写时拷贝。
6、如何理解虚拟地址?
6、回答: 在一开始的时候我们是怎么得到虚拟地址的呢,或者说虚拟地址是如何写的呢?其实程序中本身就拥有代码,只要程序编译结束之后,所有原本的变量啊函数名啊,等等一些列的代码,都会变成地址,变成地址直接调用,所以在这个时候就有了地址,但是这个地址也不可能是直接把内存中空余的地址直接利用上的,所以程序中的地址就是虚拟地址,当我们加载到物理内存的时候,虚拟地址就会和真正的物理地址相互配对,形成页表,完成地址空间。—这也叫做平坦模式。

4、问题回溯

我们之前的文章提到过,当时的时候说的没有办法解决,但是现在我们学完进程空间,我们就能够解决,为什么一个变量能够返回代表两个不同的值。所以id能够既能够大于0,也能够等于0。

5、Linux2.6内核进程调度队列

在这里插入图片描述
Linux系统中,每一个CPU都有一个运行队列。
其中蓝色的区域中的queue[140]表示的前99个都不需要利用,只有从100开始到139是我们存放于优先级的时候用到的。全名叫做task_struct * queue[140]。每一个指针都维护着相同优先级的进程。正如图上所示。优先级是从60到99的,所以queue中的100的位置相当于是优先级的60,往后一次类推。
其中的bitmap[5]的全称是long bitmap[5],5 * 32=160>140,4 * 32=128<140,所以就选择5个元素。虽然其中有160个bit位,但是只是用140个。所以拥有这个就能够不需要遍历queue中的位置,去找那个优先级是存在的,哪个是不存在的。大大的提高了效率。其中的nr_active表示的就是一共有多少个进程。
此时所介绍的都是在处理已经拥有的进程,但是我们在运行的时候,进程也可以继续再添加啊。
其中蓝色和红色两个结构体内容是一样的,在图上的active的指针默认是指向蓝色的,expired指针默认是指向红色的。CPU找进程的时候不是直接找到相对应的队列的,而是找到刚刚说的指针在找到指针中的queue[140]中进行寻找。并且找到相对应的队列进程只进不出,另外一个队列就是只出不进,这个就包括了在运行的时候有别的进程加入的情况。在进行结束一个队列之后,我们就需要swap(active,expired),相互转换一下,然后继续执行,这样CPU就开始转起来,运行起来了。

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

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

相关文章

网络通信模型

网络IO的通信原理 首先&#xff0c;对于TCP通信来说&#xff0c;每个TCP Socket的内核中都有一个发送缓冲区和一个接收缓冲区 接收缓冲区把数据缓存到内核&#xff0c;若应用进程一直没有调用Socket的read方法进行读取&#xff0c;那么该数据会一 直被缓存在接收缓冲区内。不管…

防火墙基础配置

需求&#xff1a; AR1可ping防火墙FW1的G0/0/0口 AR1、AR2、AR3在不同区域 AR1可访问AR2 实现&#xff1a; 配置各路由器的IP地址、静态路由 FW配置策略并将端口加入相关区域 防火墙代码如下&#xff1a; interface GigabitEthernet0/0/0undo shutdownip address 1.1.1.…

通俗易懂!495页看漫画学Python入门教程(全彩版)Git首发破万Star

前言 在编程的世界里&#xff0c;Python无疑是一颗璀璨的明星。从最初作为打发圣诞节闲暇时间的项目&#xff0c;到如今成为最受欢迎的程序设计语言之一&#xff0c;Python以其简洁、易学、强大的特点吸引了无数编程爱好者。然而&#xff0c;对于初学者来说&#xff0c;编程的…

高效转换,尽在掌握 —— 介绍这款免费的PDF转Word在线工具

引言 在日常工作中&#xff0c;我们经常会遇到需要将PDF文件转换成Word文档的情况。无论是为了编辑文档内容还是进行格式调整&#xff0c;一款好用的转换工具都是必不可少的。今天&#xff0c;我们将为大家推荐一款简单易用、功能强大的在线PDF转Word工具——AI智慧引擎&#…

浅谈KMP算法(c++)

目录 前缀函数应用【模板】KMP题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示样例 1 解释数据规模与约定 思路AC代码 本质不同子串数 例题讲解[NOI2014] 动物园题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路AC代码 [POI2006] OKR-Periods of …

使用 vLLM 为多个 LoRA 适配器提供服务

欢迎来到雲闪世界。使用 LoRA 适配器&#xff0c;我们可以针对某项任务或领域专门设计大型语言模型 (LLM)。适配器必须加载到 LLM 之上才能用于推理。对于某些应用&#xff0c;为用户提供多个适配器可能会很有用。例如&#xff0c;一个适配器可以执行函数调用&#xff0c;另一个…

【Android Studio】 创建第一个Android应用HelloWorld

文章目录 创建项目查看AndroidManifest.xml&#xff08;清单&#xff09;查看MainActivity.java&#xff08;Activity&#xff09;查看activity_main.xml(布局) 创建项目 查看AndroidManifest.xml&#xff08;清单&#xff09; 查看MainActivity.java&#xff08;Activity&…

HarmonyOS NEXT Developer Beta2 端云一体化 运行报错

HarmonyOS NEXT Developer Beta2 端云一体化 运行报错 1 错误提示&#xff1a;Before launch task execute failed! details: npm install failed! 如上图所示&#xff1a; 错误原因&#xff1a; 右击“cloudfunctions”目录&#xff0c;选择“Debug Cloud Functions” 或 “…

锂离子电池健康状态预测(Part1,Python)

所用数据集&#xff1a;Oxford dataset:https://ora.ox.ac.uk/objects/uuid:03ba4b01-cfed-46d3-9b1a-7d4a7bdf6fac/files/m5ac36a1e2073852e4f1f7dee647909a7 # importing libraries import matplotlib.pyplot as plt import pandas as pd import scipy.io import math impor…

TypeScript 类型断言、类型推论

类型断言 类型断言是一种 TypeScript 特性&#xff0c;用于告诉编译器将一个值视为特定的类型&#xff0c;即使编译器本身的类型推断可能不同。 类型断言并不会改变变量的实际运行时类型&#xff0c;而是在编译阶段告知TypeScript编译器开发者期望该表达式具有某种类型。 注…

RAG:如何与您的数据对话

ChatGPT 进行主题建模&#xff0c;我们的任务是分析客户对不同连锁酒店的评论&#xff0c;并确定每家酒店提到的主要主题。通过这种主题建模&#xff0c;我们知道每个客户评论的主题&#xff0c;并且可以轻松地过滤它们并进行更深入的研究。然而&#xff0c;在现实生活中&#…

PMP--冲刺--敏捷中的角色职责与3个工件--题干关键词

文章目录 敏 捷 中 的 角 色 职 责 与 3 个 工 件--题干关键词说明题目 敏 捷 中 的 角 色 职 责 与 3 个 工 件–题干关键词 角色职责 1、产品负责人&#xff1a;题干关键词 “优先级排序、与客户沟通、下次迭代做什么、接受或拒绝用户故事”。 2、Scrum Master&#xff1a;题…

AI测试入门:认识RAG(检索增强生成)

AI测试入门&#xff1a;认识RAG&#xff08;检索增强生成&#xff09; 前言1. RAG概述1.1 RAG的优势 2. RAG的工作原理2.1 信息检索2.2 上下文构建2.3 生成回答 3. RAG的应用场景4. 实现一个简单的RAG系统4.1 环境准备4.2 代码实现4.3 进一步优化 5. RAG的挑战与未来发展6. RAG…

[论文精读] StyleGAN2 论文代码理解 (上)

文章目录 一、前言二、简要介绍三、详细解析1、归一化的修改1.1生成器结构的修改1.2重新审视实例归一化(Instance normalization) 2、图像质量和生成器平滑(PPL相关内容)3、关于渐进式增长Progressive growing3.1采用替换结构(Alternative network)3.2不同分辨率的使用 4、图像…

未授权访问漏洞

一. Redis Redis 默认情况下&#xff0c;会绑定在 0.0.0.0:6379 &#xff0c;如果没有进⾏采⽤相关的策略&#xff0c;⽐如添加防 ⽕墙规则避免其他⾮信任来源 ip 访问等&#xff0c;这样将会将 Redis 服务暴露到公⽹上&#xff0c;如果在没有设 置密码认证&#xff08;⼀般为…

学习分享电商 API 接口接入指南:关键技术要点与实践

在当今数字化的商业环境中&#xff0c;电商 API 接口的接入对于企业拓展业务、提升运营效率以及优化用户体验具有重要意义。本文将详细探讨电商 API 接口接入的关键技术要点&#xff0c;并结合实践经验为您提供一份实用的接入指南。 一、电商 API 接口概述 电商 API 接口是电商…

【文献阅读】Accou2vec: A Social Bot Detection Model Based on Community Walk

Abstract Accou2vec。首先&#xff0c;为了切断人类账户和机器人账户之间的攻击边&#xff0c;利用类似深度自动编码器的非负矩阵分解社区检测算法将社交图划分为多个子图。然后设计了社区漫游规则&#xff0c;分别控制社区内部和社区间的漫游&#xff0c;同时考虑社区中的节点…

基于JSP、java、Tomcat三者的项目实战--校园交易网(3)主页--添加商品功能

技术支持&#xff1a;JAVA、JSP 服务器&#xff1a;TOMCAT 7.0.86 编程软件&#xff1a;IntelliJ IDEA 2021.1.3 x64 前文三篇登录和注册功能的实现 基于JSP、java、Tomcat、mysql三层交互的项目实战--校园交易网&#xff08;1&#xff09;-项目搭建&#xff08;前期准备工作…

cjson

文章目录 概述编译cjson_test 小结 概述 在网络传输中&#xff0c;网络数据序列化&#xff0c;常用的有那么几种&#xff0c;json&#xff0c;protobuf都是很常用的&#xff0c;这一篇来写下json。 Json常用的有几个&#xff0c;rapidjson&#xff0c;jsoncpp&#xff0c;还有…

HarmonyOS开发:路由容器Navigation的使用详解

​目录 前言路由容器NavigationNavigation组成路由跳转操作Navigation下的页面生命周期最后 前言 众所周知&#xff0c;HarmonyOS作为华为推出的新一代操作系统&#xff0c;其开发框架提供了全新的能力和组件&#xff0c;以支持跨平台应用开发&#xff0c;越来越多的开发者加…