18 分页:介绍

目录

简单例子

页表存在哪里

列表中究竟有什么

分页:也很慢

内存追踪

小结


在解决大多数空间管理问题上面,操作系统有两种方法:

第一种就是将空间分割成不同长度的分片,类似于虚拟内存管理中的分段,但是这个方法存在一个问题,就是当长时间之后,因为碎片化的空间,导致后面的分配会存在问题。

第二种方法:将空间分割成固定大小的分片,这被称为分页。因为是固定大小,所以也就解决了上面存在的问题,每个分片被称为一页,同样,在物理内存中,奖定长槽块的阵列,叫做页帧。

简单例子

在这里首先划分出64字节的虚拟空间,然后再有128字节的物理空间地址,可以看出,在物理空间中有一部分是给操作系统保留的,通过分页的方法,可以分成大小相同的页,然后在获取或者是保存的时候,可以随机拿出来,不需要有特定的顺序,所以大大的提高了灵活性。

然后为了方便记录地址空间的每个虚拟页在物理内存中的位置,每个进程都有一个数据结构,被称为页表,这个页表可以用来虚拟页到地址之间的转换。

接下来通过完成一个地址转换的例子,说明整个流程。

因为是64字节,所以虚拟地址需要6位(2^6=64)。Va5 是虚拟地址的最高位,Va0 是最低位。因为我们知道页的大小(16 字节),

所以可以进一步划分虚拟地址

                                     

每个页的大小是16字节,在64字节中一共有4个页,那前两位的虚拟页号就是用来判断的,后面的偏移量是用来确定该页的哪个字节。

假设加载的虚拟地址是21,二进制也就是010101

01也就是页号,后面的就是字节处。然后检索页表,找到虚拟页1所在的物理页面,然后进行替换,将这个地址发送给物理内存,获取数据。这里的偏移量是不需要发生改变的。

                        

页表存在哪里

在实际中,以经典的32位为例,是4KB的页,虚拟内存被分为20位的VPN和12位的偏移量。那也就是为每个进程管理2^20个地址转换,如果每个页表格条目需要4字节来保存信息,那算下来每个页表就是要4MB,这个是比较大,如果是100个进程,那你就无法想象你的机器是怎样的。

所以将每个进程的页表存储在内存中(在后面会更加详细)

列表中究竟有什么

页表的结构,页表就是将虚拟地址(或者实际上,是虚拟页号)映射到物理地址(物理帧号)。任何的数据结构都是可以采用的,最简单的就是数组,将两个号一一对应,然后通过所以查找页表项(PTE),后面会介绍到高级的结构。

对于每个PTE有什么位,是需要了解的

  • 有效位:通常用于指示特定地址转换是否有效。在进程中,由于中间空间是没有被使用的,所以标记为无效。如果访问的话,会陷入操作系统。

  • 保护位:表明页是否可以读取、写入或执行。

  • 存在位:表示该页是在物理存储器还是在磁盘上(即它已被换出,swapped out)。

  • 参考位(访问位):用于追踪页是否被访问,也用于确定哪些页很受欢迎,因此应该保留在内存中。

               

分页:也很慢

在上面中了解了页表,那接下来就具体看一下怎么获取数据,如果执行:movl 21, %eax

想要获取数据,系统首先要将虚拟地址转化的物理地址。所以,在获取数据前,系统要在进程的页表中拿到页表项没然后进行转换,最后在加载数据。

要运行这个过程,那硬件必须知道运行的进程的页表的位置。假设一个页表基址寄存器(page-table base register)包含页表的起始位置的物理地址。

那怎么操作呢?比如是:0x30,(二进制11000),为了拿到VPN,右移4位,得到4。假如虚拟地址是21(二进制010101),将其转化为010000,然后移位变成01,,然后在使用这个值作为页表机制寄存器指向PTE数组的索引。

那接下来就可以利用页表项获取物理帧号了,最后和偏移量结合,形成物理地址。

最后就可以拿到数据,放入到寄存器里面。这里面整个过程是比较复杂的。所以有时候运行起来也是比较慢的。

内存追踪

书中讲的很复杂,也就是为了体现出整个内存管理的复杂性,在后面可以使用mmap的底层原理来讲解这些知识。

小结

在这里首先讲了分页的知识,理解了为什么使用分页,之前的分段技术存在什么问题。在后面了解了分页的一些基础性原理。知道了需要有强大的机器去支持这个机制, 如果不小心考虑的话,分页会导致较慢的机器(有许多额外的内存访问来访问页表)和内存浪费(内存被页表塞满而不是有用的应用程序数据)

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

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

相关文章

电商平台自动回复脚本制作的流程!

随着电子商务的快速发展,电商平台在日常运营中面临着大量的客户咨询和服务需求,为了提高客户服务效率和质量,许多电商平台采用了自动回复脚本,以快速响应客户问题并提供准确的信息。 本文将详细介绍电商平台自动回复脚本制作的流…

证券期货市场失信记录代表什么?

证券期货市场失信记录是指参与证券期货市场的个人或机构在交易、信息披露、内部控制等方面存在违法违规失信行为的记录。 这些失信行为包括但不限于未履行承诺、拒不履行已达成的纠纷调解协议、未按期兑付本息、未按约定履行担保责任、实施犯罪行为,以及在融资融券…

SpringBoot MybatisPlus 配置动态表名多数据源

需求 业务场景: 日志、交易流水表或者其他数据量大的表,通过日期进行了水平分表,需要通过日期参数,动态的查询数据。 实现思路:利用MybatisPlus的动态表名插件DynamicTableNameInnerInterceptor ,实现Sql执行时&#…

Matten:视频生成与Mamba-Attention

Matten:视频生成与Mamba-Attention 摘要IntroductionRelated WorkMethodology Matten: Video Generation with Mamba-Attention 摘要 在本文中,作者介绍了Matten,一种具有Mamba-Attention架构的尖端潜在扩散模型,用于视频生成。在极小的计算…

带EXCEL附件邮件发送相关代码

1.查看生成的邮件 2.1 非面向对象的方式(demo直接copy即可) ​ REPORT Z12. DATA: IT_DOCUMENT_DATA TYPE SODOCCHGI1,IT_CONTENT_TEXT TYPE STANDARD TABLE OF SOLISTI1 WITH HEADER LINE,IT_PACKING_LIST TYPE TABLE OF SOPCKLSTI1 WITH HEADER LIN…

《他强由他强,清风拂山岗;他横由他横,明月照大江》之三

常见的设计模式 1.策略模式 使用场景 通俗来说,策略模式就像是让你有一个策略的工具箱,在不同的情况下选择最合适的策略来解决问题。 使用场景通常包括以下一些: 多重条件判断语句: 当一个操作包含大量的条件判断语句,并且这些分支具有不同的行为时,可以使用策略模式来…

docker runc升级1.1.12

上传runc-1.1.12制品至中控机 874e970eaa932a97de9888344ae08f24 runc.arm64 将所有节点的runc文件备份 所有节点(包括master+node) vim host [all] 10.1.0.183 ansible_password=Bigdata@Ksyun123 ansible_user=root ansible_port=22 10.1.0.249 ansible_password=Bigdata…

关于 vs2019 c++ 20规范,STL 库提供的标准分配器 alloctor 及其 traits 及涉及分配器交换的全局函数 _Pocs

(1) 我们写 c 代码,使用 STL 库中的模板,很少自己写对象的分配器。用 STL 中的分配器也够用。研究 STL 中的分配器也可以为咱们自己写分配器提供参考。 咱们会遇到这样的场景,例如交换两个容器对象: list a ,b ; a .swap (b) ; 这…

自建XXL-JOB调度平台教程

一、XXL-JOB简介 XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。它支持通过Web界面进行管理调度任务,包括任务的增删改查、执行状态监控等。同时,XXL-JOB提供了Java、Spring Boot等多种接入方式&am…

C++中向量的操作vector

在C中&#xff0c;std::vector 是一个非常有用的动态数组容器&#xff0c;它允许你在运行时动态添加或删除元素&#xff0c;并且提供了许多方法来操作这些元素。下面是一些常见的 std::vector 操作&#xff1a; 创建一个 vector&#xff1a; #include <vector> std::vec…

像编排容器一样编排进程

背景 当前微服务架构大行其道&#xff0c;一个业务应用往往是由多个独立的服务构成&#xff0c;通过K8S&#xff0c;Docker Compose等容器编排工具&#xff0c;以及Jekins等DevOPS工具&#xff0c;我们也能够很方便的将服务发布到容器&#xff0c;并通过配置和编排轻松部署到线…

std::async、std::future

async和future std::async和std::thread都是C11标准库中实现多线程的类。async是一种异步执行任务的方式&#xff0c;它可以在后台线程中执行一个函数或者函数对象&#xff0c;并返回一个std::future对象&#xff0c;可以用来获取函数的返回值或者异常信息。它允许线程返回fut…

40道 Nginx 高频面试题

Nginx 是一款轻量级的 Web 服务器、反向代理服务器&#xff0c;由于它的内存占用少&#xff0c;启动极快&#xff0c;高并发能力强&#xff0c;在互联网项目中广泛应用。那么关于 Nginx 的核心面试题有哪些呢&#xff1f;今天给大家整理了40道Nginx 高频面试题&#xff0c;最近…

麒麟kylin-v10系统,虚拟机kvm的使用

kvm的使用 虚拟机新建 点击选择对应的iso文件 选择相应的系统 &#xff08;注意&#xff0c;如果这里没有相应的系统比如&#xff1a;windows&#xff0c;可以直接选择Generic default这是通用默认的意思&#xff09; 选择cpu 完成即可 等待安装完毕 网络设置-ssh连接 虚拟…

Electron+Vue+pyinstaller服务打包

electron环境安装略 1. electron的入口文件配置test.js, 需要在package.json 配置文件中指定main: src/test.js const { app, BrowserWindow } require(electron)const createWindow () > {const win new BrowserWindow({width: 800,height: 600})// win.loadFile(inde…

实体类和对象之间的关系是什么

实体类&#xff08;Entity Class&#xff09;和对象&#xff08;Object&#xff09;在面向对象编程&#xff08;OOP, Object-Oriented Programming&#xff09;和ORM&#xff08;Object-Relational Mapping&#xff09;框架如Hibernate中扮演着重要的角色。以下是它们之间的关系…

守好参数之门:防止 IllegalArgumentException 入侵的七大策略

1. 原因分析 java.lang.IllegalArgumentException 是 Java 中的一个运行时异常&#xff0c;它通常表示向方法传递了一个不合法或不适当的参数。这种异常不会由 Java 虚拟机自动抛出&#xff0c;而是由程序员在编写代码时通过显式地调用 throw 语句来抛出&#xff0c;或者在某些…

如何利用python选股

使用Python进行选股是一个复杂但有趣的过程,它结合了数据分析、统计建模和机器学习等多个领域的知识。 由于篇幅限制,我将提供一个概述性的框架和关键步骤,并尽量保持内容的精炼和深入。 一、引言 背景介绍:简述股市投资的重要性和复杂性,以及利用Python进行量化选股的优…

红龙工业设备制造有限公司亮相2024杭州数字物流技术设备展

参展企业介绍 温州红龙工业设备制造有限公司成立于2015年11月。是中国先进的工业皮带设备研发制造和工业皮带整体解决方案运营服务商&#xff0c;现主营皮带接头机、皮带热压机、皮带接驳机、皮带打齿机、输送带打齿机、输送带分层级、输送带导条机、输送带裁切机、高频机等工业…

力扣HOT100 - 84. 柱状图中最大的矩形

解题思路&#xff1a; 单调栈 对于一个高度height[ i ]&#xff0c;找左右两边均严格小于它的值。 class Solution {public int largestRectangleArea(int[] heights) {int n heights.length;int[] left new int[n];int[] right new int[n];Deque<Integer> mono_st…