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

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

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

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

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

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

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

 

 


http://www.niftyadmin.cn/n/229154.html

相关文章

8.3 总体分布的假设检验

学习目标: 如果我要学习总体分布的假设检验,我会采取以下步骤: 掌握基础概念:学习和掌握统计学中基础的概念,如总体、样本、假设检验、p值等等。 学习检验方法:了解和学习不同的总体分布假设检验方法&…

【百日冲大厂】第九篇,牛客网选择题+编程题另类加法+走方格的方案数(动规+递归)

前言: 大家好,我是良辰丫,刷题的第九篇,牛客网选择题编程题另类加法走方格的方案数(动规递归).💞💞💞不太纠结于当下,也不必太忧虑于未来,人生没有无用的经历,当你经历过…

BGP路由优选实验

一,实验要求及其拓扑图 二:划分好IP的拓扑 三: 实验分析 1、使用 Preval 策略,确保R4通过R2到达192.168.10.0/24 1、抓取流量 [r4]ip ip-prefix PV permit 192.168.10.0 24 2、配置策略 [r4]route-policy PV permit node 10 [r4…

公派访问学者申请CSC,如何通过审核?

申请留学基金委公派的访问学者非常多,越来越多的人有机会申请公派,但是每个名额的申请依然存在着不同程度的竞争。那么首先需要了解什么样的申请资料容易通过留学基金委的审批?也就是清楚的了解对方要什么,不要什么,所谓知己知彼…

#详细介绍!!! 造成死锁的原因以及解决方案!

本篇主要是介绍什么是死锁,已经死锁产生的原因,如果避免死锁。根据上述的几个问题让我们来阅读本篇文章。 目录 1. 什么是死锁 2. 形成死锁的原因(四个必要条件) 3. 如果有效避免死锁 1. 什么是死锁 死锁主要是锁彼此间进行锁等…

解决vue-print-nb打印时多出一页空白,vue-print-nb打印有空白页

项目场景: 提示:这里简述项目相关背景: 打印table表格,需要用到vue-print-nb插件,使用该插件可以一键弹窗打印页面 效果如图 问题描述 提示:这里描述项目中遇到的问题: 查了一下&#xff…

MySQL函数的使用

MySQL函数的使用 一、数字函数 ABS(x) 返回x的绝对值 SELECT ABS(-1); //1AVG(expression) 返回一个表达式的平均值,expression 是一个字段 SELECT AVG(score) FROM sc;CEIL(x)/CEILING(x) 返回大于或等于 x 的最小整数 SELECT CEIL(1.5);//2 SELECT CEILING(1…

基于Vue3封装一个好用的Websocket

在Vue3中使用Websocket可以让我们轻松地实现实时数据传输。为了方便使用,我们可以封装一个好用的Websocket类。 安装依赖 首先我们需要安装 ws 库来处理Websocket连接,使用以下命令进行安装: npm install ws --save封装Websocket类 我们可…