Linux 内存 pt.1

哈喽大家好,我是咸鱼

今天我们来学习一下 Linux 操作系统核心之一:内存

跟 CPU 一样,内存也是操作系统最核心的功能之一,内存主要用来存储系统和程序的指令、数据、缓存等

关于内存的学习,我会尽量以通俗易懂的方式且分成多篇文章去讲解

那么今天在 pt.1 文章中,我们来学习一下 Linux 中的虚拟内存、物理内存和内存映射

在这里插入图片描述
只有内核才可以直接访问物理内存,进程是无法直接访问物理内存的

  • 那么进程是如何访问物理内存?

Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个空间是连续的,这样进程就可以很方便的访问到内存,准确来说是访问到虚拟内存

又因为这个虚拟地址空间(虚拟内存)与物理内存相关联,进程则是通过虚拟内存去访问物理内存的

在这里插入图片描述
虚拟地址空间又被分成内核空间用户空间,进程在用户态时只能访问虚拟用户空间地址,在内核态可以访问虚拟内核空间地址

对于不同位数字长(单个 CPU 指令可以处理数据的最大长度)的处理器(32位系统、64位系统),地址空间的范围也不同

在这里插入图片描述
由上图可以看到,32 位系统的内核空间占 1G,位于最高处;剩下的 3G 是用户空间

而 64 位系统的内核空间和用户空间都是 128T,分别占据整个内存空间的最高和最低处,剩下的中间部分是未定义的

虽然每个进程都有虚拟内核空间,但每个进程的虚拟内核空间内存关联的都是相同的物理内存,方便进程切换到内核态后去访问物理内存

在这里插入图片描述
物理地址空间是物理内存的范围,虚拟地址空间是虚拟内存的范围,物理地址空间中的每个物理地址都是实打实地指向了具体的存储单元

虚拟地址空间中每个虚拟地址指向哪里有 3 种情况:

  • 未分配,这个虚拟地址仅仅是个数字而已,没有任何指向

  • 未缓冲,这个虚拟地址指向了磁盘的某个字节存储单元,里面存储了指令或者数据

  • 已缓冲,这个虚拟地址指向了物理内存的某个字节存储单元,里面存储了指令或者数据。

  • 虚拟内存的好处:

    • 避免用户直接访问物理内存,防止一些破坏性操作,保护操作系统
    • 每个进程都被分配了 4GB 的 虚拟地址空间,用户可使用比实力物理内存更大的地址空间(用的时候才分配)

在这里插入图片描述
那么当进程实际使用的时候,进程的虚拟内存是怎么分配到物理内存的呢?

1.内存映射

并不是所有的虚拟内存都会被分配物理内存,只有那些实际使用的虚拟内存才分配物理内存,并且分配后的物理内存,是通过内存映射来管理的

内存映射,其实就是将虚拟内存地址映射到物理内存地址

为了完成内存映射,内核为每个进程都维护了一张页表,用来记录虚拟内存与物理内存的映射关系

页表实际上存储在 CPU 的内存管理单元 MMU 中。这样,正常情况下,CPU 就可以直接通过硬件,找出要访问的内存

在这里插入图片描述
这张页表里面有很多页表项,每个页表项的大小为 4KB。当进程访问的虚拟内存被分配了物理内存之后,系统就会更新页表,在页表项中添加虚拟内存与物理内存的映射关系

  • 缺页异常

如果进程要访问的虚拟内存没有被分配物理内存(即在页表中找不到映射关系),就会产生一个缺页异常中断

这时候系统会进入内核空间分配物理内存、然后更新进程页表,最后再返回用户空间,恢复进程的运行

MMU 中有一个高速缓存 TLB((Translation Lookaside Buffer,转译后备缓冲器),TLB 访问速度要比 MMU 快得多

通过提高 TLB 缓存使用率,可以提高 CPU 的内存访问性能

总结

  • 在 Linux 中,为了提高内存利用率和系统可靠性,同时也为了不同进程之间的内存隔离,进程不能直接访问到物理内存

  • Linux 为每一个进程都分配了一个虚拟内存,当进程实际使用的时候,虚拟内存才会被分配物理内存

  • Linux 通过内存映射的方式来实现通过虚拟内存去访问物理内存,为了完成内存映射,内核为每个进程都维护了一张页表,用来记录虚拟内存与物理内存的映射关系

  • 如果进程要访问的虚拟内存没有被分配物理内存(即在页表中找不到映射关系),就会产生一个缺页异常中断

  • 这时候系统会进入内核空间分配物理内存、然后更新进程页表,最后再返回用户空间,恢复进程的运行

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

适合学生的平价蓝牙耳机有哪些?学生平价蓝牙耳机推荐

随着蓝牙耳机的使用越来越频繁,近几年也出现了很多优质的蓝牙耳机,不仅有着超高的性价比,而且使用体验也有了很大的突破。接下来,我来给大家推荐几款适合学生使用的平价蓝牙耳机,可以当个参考。 一、南卡小音舱Lite2蓝…

C4D的GPU渲染器Octane和Redshift的渲染对比

对CG圈创作人员来说,除制作软件外渲染器是平时接触最多的一类软件,用渲染器进行渲染的过程,就是把制作软件里的预览效果变到融合材质、光照、物理特性的最终效果的这个过程,这是CG制作中最重要的一步,关乎着最终效果的…

新手必看!ChatGPT常见问题总整理,你遇到了几个?

随着ChatGPT火爆全球,使用人数以指数型成长,许多使用上的问题呈现在网路上。 今天这篇文章会用实作的方式带大家了解ChatGPT有哪些常见问题,以此减少踩坑的机会。 并用简单的示例让大家感受GPT-3.5与GPT-4的能力差异,希望对大家有所帮助。 大家会有这些问题,其实就是希望…

HashMap底层源码解析及红黑树分析

HashMap线程不安全,底层数组链表红黑树 面试重点是put方法,扩容 总结 put方法 HashMap的put方法,首先通过key去生成一个hash值,第一次进来是null,此时初始化大小为16,i (n - 1) & hash计算下标值&a…

8 年后端开发,API 设计的学习方法分享

笔者目前在参与一个开源项目,平时接触多的也是 API 相关的核心功能开发,经常会有读者私信我,对于开发新人而言,如何快速学习 API 设计,我简单总结了一下: 1. 学习基础知识:学习HTTP、RESTful AP…

有哪家台灯好又便宜的适合学生党使用?真正合格的小学生台灯

都说眼睛是心灵的窗户,但是现在很多小朋友还没上初中,可能就早早的近视了。究其原因,除了和频繁观看电子屏幕密不可分之外,不良的用眼习惯也是一大关键。孩子写作业时不时揉眼睛的动作,其实只要时间一长,眼…

GWO灰狼优化算法以及Matlab代码

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 GWO灰狼算法原理进化更新位置更新(紧随3只头狼) GWO灰狼算法流程图GWO优化算法matlab代码main函数适应度函数GWO主体代码测试结果F1~ F6测试…

如何正确选择集体渲染(云渲染)和gpu离线渲染

在数字娱乐领域,渲染是制作高质量影像的关键步骤之一。随着技术的不断发展和应用的广泛普及,渲染方式也在不断演进。目前,集体渲染(云渲染)和GPU离线渲染是两种比较流行的渲染方式。那么,哪种方式会更快呢&…

Docker-compose

目录 第一章.Docker-compose 概述 1.1.Docker-compose使用场景 1.2.简介 第二章.compose 部署 2.1.Docker Compose 环境安装 2.2.YAML 文件格式及编写注意事项 2.3.Docker Compose配置常用字段 2.4.Docker Compose 常用命令 2.5.Docker Compose 文件结构 第三章.实验…

Koordinator 一周年,新版本 v1.2.0 支持节点资源预留,兼容社区重调度策略

作者:佑祎、吕风 背景 Koordinator 是一个开源项目,基于阿里巴巴在容器调度领域多年累积的经验孵化诞生,可以提升容器性能,降低集群资源成本。通过混部、资源画像、调度优化等技术能力,能够提高延迟敏感的工作负载和…

3个月,从功能测试进阶到自动化测试涨薪10k,我悟了....

因为我最近在分享自动化测试技术,经常被问到: 功能测试想转自动化,请问应该怎么入手?有没有好的资源推荐? 那么,接下来我就结合自己的经历聊一聊我是如何在工作中做自动化测试的。(学习路线和…

macOS 13.4Beta 3(22F5049e)With OpenCore 0.9.2开发版 and winPE双引导分区原版镜像

镜像特点 完全由黑果魏叔官方制作,针对各种机型进行默认配置,让黑苹果安装不再困难。系统镜像设置为双引导分区,全面去除clover引导分区(如有需要,可以自行直接替换opencore分区文件为clover引导文件)备注…

云服务器使用jenkins+docker自动化部署SpringBoot项目

docker 安装jenkins,就这一步都恶心死了 //拉取镜像,踩了很多坑,用其它版本的镜像插件一直安装失败,最后用的是lts版本(基础版) 用其它版本要么是连不上插件的下载地址,要么是插件下载不成功 d…

【应急响应】后门攻击检测指南Rookit内存马权限维持WINLinux

文章目录 Windows实验常规后门: 网络对外连接查看 自启动测试:隐藏账户映像劫持屏保&登录 Linux实验常规后门:Rootkit后门:GScan rkhunter权限维持后门:GScan rkhunter Web层面:通用系统层面 主机层面后…

大数据技术之SparkCore

第1章 RDD概述 1.1 什么是RDD RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象。 代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。 RDD代表的是弹性、…

【Pytorch】六行代码实现:特征图提取与特征图可视化

前言 之前记录过特征图的可视化:Pytorch实现特征图可视化,当时是利用IntermediateLayerGetter 实现的,但是有很大缺陷,只能获取到一级的子模块的特征图输出,无法获取内部二级子模块的输出。今天补充另一种Pytorch官方…

数字孪生新能源智慧充电桩Web3D可视化运维系统

放眼全球,近十年来,新能源汽车赛道堪称“热得发烫”。伴随着进入成年期的新能源汽车行业对相关配套设备支撑水平的提升,作为其“新基建”的充电桩领域表现更为突出的价值势能。过去,在一系列补贴政策和资本刺激下,充电…

插装式两位两通电磁阀DSV-080-2NCP、DDSV-080-2NCP

特性 压力4000 PSI(276 Bar) 持续的电磁。 硬化处理的提升阀和柱塞可获得更长的寿命和低泄漏量。 有效的混式电磁铁结构。 插装阀允许交流电压。可选的线圈电压和端子。 标准的滤网低泄漏量选择 手动关闭选择。 工业化通用阀腔。 紧凑的尺寸。 两位两通常闭式双向电磁…

vue element-ui web端 引入高德地图,并获取经纬度

发版前接到一个临时新需求 ,需要在web端地址选择时用地图,并获取经纬度。 临阵发版之际加需求,真的是很头疼,于是赶紧找度娘,找api。 我引入的是高德地图,首先要去申请key , 和密钥,…

在安装docker配置端口时 centos7 防火墙规则失效

一、问题 1、做端口映射管理的时候,自己关闭了防火墙,或者开启防火墙,或者指定开关端口,但是都不影响端口的使用,这就很奇怪,也就是本文的内容! 2、思路,确认是请求到了防火墙的那…