一文解析为什么进程地址空间中包括操作系统?

news2024/10/6 1:46:23

今天聊聊进程地址空间这点小事。说到进程的地址空间,大家可能都知道这样一张图:

这张图就是Linux程序运行起来后所谓的进程地址空间,这里包括我们熟悉的代码区、数据区、以及堆区和栈区,今天我们不讲解这些区域,而是重点关注这个地址空间中最上面的一块区域——内核,这里的问题是:为什么进程地址空间中要包括操作系统(内核)呢?要想知道这个问题的答案,你需要知道操作系统到底是如何管理内存的。现代操作系统大都利用虚拟内存系统来管理内存,我们看的上图,这一段连续的内存区域其实只是一个假象,物理内存中并不一定真的存在这样一个内存布局,利用虚拟内存系统将一些非连续的内存块(页)映射到一段连续的地址空间——也就是我们看到的上图,这就是所谓的虚拟内存。我们看到的地址都是虚拟地址,物理内存与虚拟内存的映射关系维护在页表中,当CPU执行机器指令时需要根据页表将虚拟地址转为物理内存地址,但这个过程对程序员来说是透明的,我们看不到这样的一个转换过程。那么为什么内核要将自己映射到进程的地址空间呢?我们知道CPU在执行指令时是有权限状态的,x86处理器有4个权限状态,操作系统一般使用其中两个,这就是所谓的用户态与内核态,我们写的程序运行在用户态,操作系统运行在内核态。

在一些场景下,像我们读写文件、收发网络数据等都需要操作系统的帮助,也就是调用操作系统提供的服务,这个过程就是所谓的系统调用,关于系统调用我们在之前的文章中已经多次讲解过了,在系统调用这个场景下就涉及从用户态切换到内核态。此外还有其它场景涉及用户态与内核态的切换,像中断处理以及异常处理等。既然你知道我们的程序运行时需要频繁的进行用户态与内核态切换那么剩下的就简单了。

 资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

如果内核与用户态程序位于不同的地址空间,那么当用户态与内核态进行切换时就势必涉及页表的切换——从用户态进入内核态需要将用户进程的页表切换为内核页表,而如果从内核态退出回到用户态就涉及将内核页表切换为用户进程页表,切换页表对于计算机系统来说算是一个不小的开销。而如果内核与用户态程序位于同一个地址空间中,那么上述页表切换的开销就可以避免了,这就是为什么内核要将自己映射到进程地址空间的重要原因。好啦,这篇就到这里,希望对大家理解进程地址空间有所帮助。

 

 

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

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

相关文章

elementui的el-message重复点击,提示会一直叠加

1.问题: elementui的el-message连续点击按钮会出现一排提示,注意体验很不友好,而且也不好看 如下: 这种问题如何解决呢 ? 2.参考api elementui的官网有这个api,也就是说通过close这个方法可以解决 3.附上代码&a…

设计模式之美-结构型模式-装饰器模式

装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承。指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,装饰器模式提供了比继承更有弹性的替代方案将功能附加到对象上…

4月20日专家谈:内网突遭攻击,安全人员一招有效处理

随着网络威胁的愈加频繁,企业面临的安全问题也越来越多,传统的安全能力在面对日益增长的安全问题时显得捉襟见肘。 SOAR借助安全编排和自动化技术,将人工操作和技术集成在一起,自动化完成安全处置,帮助企业更快地响应…

JavaScript【九】JavaScript BOM(浏览器对象模型)

文章目录🌟前言🌟 Bom(浏览器对象模型)🌟window对象:🌟属性:🌟 方法:🌟 获取元素:🌟 添加点击事件:🌟 获取表单…

大数据Flink进阶(二十):Flink细粒度资源管理

文章目录 Flink细粒度资源管理 一、细粒度资源管理介绍 二、细粒度资源适用场景

关于合金电阻

合金电阻是一种具有高精度、高稳定性和高温度特性的电阻器件,广泛应用于各种电子设备中。选型合适的合金电阻并进行合理的设计,可以有效地提高电路的性能和可靠性。本文将从合金电阻的基本原理、选型方法及设计要点等方面进行详细介绍。 一、合金电阻的基…

简单认识下with和上下文管理器

with 对于系统资源如文件、数据库连接、socket,应用程序打开这些资源并执行完业务逻辑之后,必须关闭(断开)该资源。系统允许打开的最大文件数量是有限的,如果我们打开文件后没有及时关闭,极端情况下会出现…

21天学会C++:Day2----命名空间的那些事儿

CSDN的uu们,大家好。这里是C入门的第二讲。 座右铭:前路坎坷,披荆斩棘,扶摇直上。 博客主页: 姬如祎 收录专栏:C专题 目录 1. 为什么要有命名空间 2. 命名空间的定义 3. 访问命名空间域中成员的三种方…

基于Java+SpringBoot+vue的人职匹配推荐系统设计与实现【源码(完整源码请私聊)+论文+演示视频+包运行成功】

博主介绍:专注于Java技术领域和毕业项目实战 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 Java项目精品实战案例(300套) 目录 一、效果演示 二、…

virtualbox如何配网

配网搞了一天!!! 百度到的所有教程都是垃圾!! 就没有一个写全的!!写明白怎么配的!!! 我自己来!!!不会配的看我&#xf…

浅析 Queue 和 Deque

终于开始了 LeetCode 的练习,看到 102. 二叉树的层序遍历 有种解法利用到了队列,想着挨个看看基础队列中的方法,便有了这篇文章。 基于 Java 对 Queue 以及 Deque(double ended queue) 实现进行学习介绍,JD…

Vue之代码传送(teleport)

代码传送是啥 在Vue中,代码传送就是将某部分的代码从Vue的template标签下传送到指定的地方,这个地方通常是body标签下。在使用Vue编写界面时,我们都是在html的Body中写一个div,然后指定一个id,然后在Vue的实例中的tem…

2023春招offer收割机,阿里架构师耗时半月写的《Java面试手册》

程序猿在世人眼里已经成为高薪、为人忠诚的代名词。 然而,小编要说的是,不是所有的程序员工资都是一样的。 世人所不知的是同为程序猿,薪资的差别还是很大的。 众所周知,目前互联网行业是众多行业中薪资待遇最好的,包…

Java语法理论和面经杂疑篇《九. 网络编程》

目录 1. 网络编程概述 1.1 软件架构 1.2 网络基础 2. 网络通信要素 2.1 如何实现网络中的主机互相通信 2.2 通信要素一:IP地址和域名 2.2.1 IP地址 2.2.2 域名 2.3 通信要素二:端口号 2.4 通信要素三:网络通信协议 2. 谈传输层协议…

时间序列教程 四、自回归和移动平均模型

一、本节目标 了解自相关函数(ACF)。 了解部分自相关函数(PACF)。 了解自回归和移动平均模型是如何工作的。 使用Python来拟合自相关模型。 二、ACF和PACF 1、自相关函数(ACF) 测量信号与自身延迟数据的相关性。 它用于发现信号中的重复模式,例如周期性信号的存…

Spring相关概念

Spring家族 官网:Spring | Home,从官网我们可以大概了解到: Spring能做什么:用以开发web、微服务以及分布式系统等,光这三块就已经占了JavaEE开发 的九成多。Spring并不是单一的一个技术,而是一个大家族,可以从官网的…

.NET基础加强第七课--文件流

序列化 JSON序列化 例子 using Nancy.Json; Person p1 new Person(); p1.Name “zs”; // json 序列化 JavaScriptSerializer javaScriptSerializer new JavaScriptSerializer(); string json javaScriptSerializer.Serialize(p1); Console.WriteLine(json); Console.…

linux-创建子进程的过程与原理(fork讲解)

我们知道,子进程可以被命令行创建,被fork函数创建,但是子进程创建了什么呢,是完全拷贝父进程函数?还是继承父进程数据呢? 首先我们要知道,进程的构成:进程内核数据结构可运行程序载…

二维差分【算法推导,图文讲解清晰】

798. 差分矩阵 - AcWing题库 算法推导 二维差分相对一维差分会复杂一点,而且还要结合二维前缀和的一些细节处理 A、B数组角色问题 在差分思想中,构造并不是那么重要,而是其中A、B数组的角色。 我们假想存在一个数组B,输入的A…

论文阅读《NeRF-Supervised Deep Stereo》

论文地址:https://arxiv.org/pdf/2303.17603.pdf 源码地址:https://nerfstereo.github.io/ 概述 针对深度估计的标签数据难以获取,自监督方法在病态(遮挡、非朗伯面)区域的表现差,跨域泛化能力弱的问题&…