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

news2024/9/23 7:26:39

今天聊聊进程地址空间这点小事。

说到进程的地址空间,大家可能都知道这样一张图:

这张图就是Linux程序运行起来后所谓的进程地址空间,这里包括我们熟悉的代码区、数据区、以及堆区和栈区,今天我们不讲解这些区域,而是重点关注这个地址空间中最上面的一块区域——内核,这里的问题是:为什么进程地址空间中要包括操作系统(内核)呢?

要想知道这个问题的答案,你需要知道操作系统到底是如何管理内存的。

现代操作系统大都利用虚拟内存系统来管理内存,我们看的上图,这一段连续的内存区域其实只是一个假象,物理内存中并不一定真的存在这样一个内存布局,利用虚拟内存系统将一些非连续的内存块(页)映射到一段连续的地址空间——也就是我们看到的上图,这就是所谓的虚拟内存。

我们看到的地址都是虚拟地址,物理内存与虚拟内存的映射关系维护在页表中,当CPU执行机器指令时需要根据页表将虚拟地址转为物理内存地址,但这个过程对程序员来说是透明的,我们看不到这样的一个转换过程。

那么为什么内核要将自己映射到进程的地址空间呢?

我们知道CPU在执行指令时是有权限状态的,x86处理器有4个权限状态,操作系统一般使用其中两个,这就是所谓的用户态与内核态,我们写的程序运行在用户态,操作系统运行在内核态。

在一些场景下,像我们读写文件、收发网络数据等都需要操作系统的帮助,也就是调用操作系统提供的服务,这个过程就是所谓的系统调用,关于系统调用我们在之前的文章中已经多次讲解过了,在系统调用这个场景下就涉及从用户态切换到内核态。

此外还有其它场景涉及用户态与内核态的切换,像中断处理以及异常处理等。

既然你知道我们的程序运行时需要频繁的进行用户态与内核态切换那么剩下的就简单了。

如果内核与用户态程序位于不同的地址空间,那么当用户态与内核态进行切换时就势必涉及页表的切换——从用户态进入内核态需要将用户进程的页表切换为内核页表,而如果从内核态退出回到用户态就涉及将内核页表切换为用户进程页表,切换页表对于计算机系统来说算是一个不小的开销。

而如果内核与用户态程序位于同一个地址空间中,那么上述页表切换的开销就可以避免了,这就是为什么内核要将自己映射到进程地址空间的重要原因。

好啦,这篇就到这里,希望对大家理解进程地址空间有所帮助。

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

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

相关文章

Vue生态及实践 - SSR(上)

目录 目标 理论 Rendering 你真的需要SSR亦或是同构吗? 同构实践 通用代码 同构第一步:避免单例 src/app.js src/store.js src/router.js 同构第二步:Server entry【服务端进入】;Client entry【客户端进入】 src/entry…

ESP32设备驱动-AS5600磁性旋转位置传感器

AS5600磁性旋转位置传感器 文章目录 AS5600磁性旋转位置传感器1、AS5600介绍2、硬件准备3、软件准备4、驱动实现1、AS5600介绍 AS5600 是一款可编程的 12 位高分辨率非接触式磁性旋转位置传感器。 AS5600可以作为磁性电位器或磁性编码器使用,具有出色的可靠性和耐用性。 与传…

网页版代码编辑器实现

接着前几天写的博客https://blog.csdn.net/woyebuzhidao321/article/details/131495855,提到了涉及vscode网页版工作区创建的api,这两天一时兴起,搞了一个网页版的代码编辑器,如果在2020年10月之前,实现一个网页版代码…

活动笔记 | 「企业人效提升路径」之数字化实践

6月27日,由人力资源智享会联合盖雅工场等机构主办的2023中国人力资源数字化论坛在北京顺利举办。盖雅工场高级解决方案顾问谷天毅先生发表了主题为 《企业人效提升路径之数字化实践》 的分享。 以下是分享内容,enjoy~ △ 盖雅工场高级解决方案顾问谷天…

httpx 返回都是乱码问题,非编码问题。

因为python 的requests 不能使用抓http2 的报文。所以看了一些httpx的使用。但是发现httpx 不能自动解压,text打印出来的都是乱码。一开始以为是编码格式的bug ,但是使用chardet 确认了确实是utf-8.然后怀疑是压缩的问题。先去官网搜了一些文档 文档说会…

opencv4.7.0编译opencv-contrib-4.7.0以及CUDA

0、引言 最近工作中需要用到使用CUDA加速后的opencv进行传统算法的开发,在编程之前,需要先解决环境编译和lib库问题,本文就是记录自己编译opencv-4.7.0的全过程。 1、CUDA下载和安装 可参考我之前的博客WIN10安装配置TensorRT详解中的前几…

达尔文——生物医疗科学领域大模型

赛灵力官网 1. 生物医疗领域的挑战 1.1 复杂性 生物系统和生物过程非常复杂,包含大量的相互作用和调控机制,理解和解析这些复杂性是一项巨大的挑战。 举例来说,单单一个人类,体内的生物信息就非常复杂: 人类体内体内…

Django_re_path_使用正则匹配url

与path定义的路由相比,re_path 定义的路由可以使用正则表达式匹配url。 需要注意的是: 如果未定义匹配结果的变量名,匹配的结果默认传入视图的第2个形参。如果定义了匹配结果的变量名,匹配的结果会传给视图的同名字段&#xff0…

从零开始学习自动驾驶决策规划

从零开始学习自动驾驶决策规划 从入门到掌握的一系列讲解,其中涵盖的内容如下: 前言课 第一节-ros工程的创建 第一节-运行环境和工程目录简介第二节-工程运行和小车模型搭建简介 第二节-车辆里程计第三节-整体架构思路 第三节-地图路线构建方法 第三节…

Packet Tracer – 配置静态 NAT

Packet Tracer – 配置静态 NAT 目标 第 1 部分:测试不使用 NAT 的访问 第 2 部分:配置静态 NAT 第 3 部分:测试使用 NAT 的访问 拓扑图 场景 在 IPv4 配置网络中,客户端和服务器使用专用编址。 然后,在含专用编址…

MATLAB---线性规划问题求最优解(含例题)

线性规划是运筹学的基础,在现实企业经营中,如何有效的利用有限的人力、财力、物力等资源。 MATLAB 为方便大家理解,这里我们直接用一个例题为大家讲解使用matlab求解线性规划问题。 根据上图给出的线性规划问题。我们使…

SpringBoot 如何使用 @ExceptionHandler 注解进行局部异常处理

SpringBoot 如何使用 ExceptionHandler 注解进行局部异常处理 介绍 在开发 Web 应用程序时,异常处理是非常重要的一部分。SpringBoot 提供了多种方式来处理异常,其中之一是使用 ExceptionHandler 注解进行局部异常处理。使用 ExceptionHandler 注解&am…

哈工大计算网络课程数据链路层详解之:数据链路层服务

哈工大计算网络课程数据链路层详解之:数据链路层服务 在介绍完网络层的实现功能和协议之后,接下来我们继续介绍网络层的下一层:数据链路层。 本节首先对数据链路层的功能和所提供的服务进行概述。 如下图示例网络所示,标红色的部…

【二分查找】34. 在排序数组中查找元素的第一个和最后一个位置

34. 在排序数组中查找元素的第一个和最后一个位置 解题思路 使用二分查找查找到目标元素的索引之后然后向左以及向右寻找目标元素,然后记录下区间位置 然后保存下来 class Solution {public int[] searchRange(int[] nums, int target) {// 使用二分查找 数组有序…

Java使用Stream API对于数据列表经常处理

Java使用Stream API对于数据列表经常处理 先提供一些简单到复杂的常见例子&#xff0c;您可以根据这些例子进行进一步的开发和学习&#xff1a; 数据过滤筛选操作 查询表中所有数据&#xff1a; List<User> users userDao.getAllUsers();根据条件查询单个结果&#…

别测了,背锅上线!

三百六十行&#xff0c;行行都背锅。 用例千万条&#xff0c;质量第一条。 流程不规范&#xff0c;亲人两行泪&#xff01; 每次上线后多多少少都有些问题&#xff0c;每次的项目总结会总会生产一口新锅&#xff0c;等着你我他来背&#xff0c;这不又要上线了&#xff0c;这次…

华为OD机试真题 Java 实现【快递投放问题】【2023 B卷 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、Java算法源码五、效果展示1、输入2、输出 一、题目描述 有N个快递站点用字符串标识&#xff0c;某些站点之间有道路连接。每个站点有一些包裹要运输&#xff0c;每个站点间的包裹不重复&#xff0c;路上有检查站会导致部分货物无…

基于kubernetes组件初步部署k8s

基于k8s组件初步部署k8s kubernetes组件kubernetes简单化部署安装Master操作环境检查安装配置Containerd安装Containerd配置containerd启动containerd 配置Circtl安装配置Kubeadm安装Kubeadmkubeadm配置启动kubelet服务 拉取镜像初始化集群操作命令行 安装网络插件 Node操作Nod…

Dubbo分布式服务框架,springboot+dubbo+zookeeper

一Dubbo的简易介绍 1.Dubbo是什么&#xff1f; Dubbo是一个分布式服务框架&#xff0c;致力于提供高性能和透明化的RPC远程服务调用方案&#xff0c;以及SOA服务治理方案。 简单的说&#xff0c;dubbo就是个服务框架&#xff0c;如果没有分布式的需求&#xff0c;其实是不需…

N天爆肝数据库——MySQL(1)

数据库概念理解 数据库 DB 存储数据的仓库 数据库管理系统 DBMS 操纵和管理数据库的大型软件 SQL 操作关系型数据库的编程语言&#xff0c;定义了用一套操作关系型数据库同意标准 学习 SQL 的作用 SQL 是一门 ANSI 的标准计算机语言&#xff0c;用来访问和操作数据库系统。S…