3.1_5 基本分页存储管理的概念

2024-03-13 18:20

本文主要是介绍3.1_5 基本分页存储管理的概念,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 3.1_5 基本分页存储管理的概念
    • (一)什么是分页存储
    • (二)重要的数据结构——页表
    • (三)逻辑地址结构
  • 总结

3.1_5 基本分页存储管理的概念

image-20240313093337311

  连续分配:为用户进程分配的必须是一个连续的内存空间

  非连续分配:为用户进程分配的可以是一些分散的内存空间

(一)什么是分页存储

  将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个“页框”)。

  注意:页框 = 页帧 = 内存块 = 物理块 = 物理页面

  每个页框有一个编号,即“页框号”。页框号从0开始

  注意:页框号 = 页帧号 = 内存块号 = 物理块号 = 物理页号

image-20240313093644038

  将进程的逻辑地址空间也分为与页框大小相等的一个个部分,每个部分称为一个“”或“页面”。每个页面也有一个编号,即“页号”,页号也是从0开始

image-20240313093849077

  如上图进程A的逻辑地址空间为0 ~ 16K-1,即进程A的空间大小为16KB,因此,进程A可以被分成4个页。

  进程的各个,会被放到内存的各个页框当中。

image-20240313094028928

  操作系统以页框为单位为各个进程分配内存空间。进程的每个页面分别放入一个页框中。也就是说,进程的页面与内存的页框一一对应的关系。

  各个页面不必连续存放,可以放到不相邻的各个页框中。

  注意,易混淆点

  页、页面 vs 页框、页帧、物理页;

  页号、页面号 vs 页框号、页帧号、物理页号。

  左侧——指的是进程在逻辑上被划分为一个个的部分。

  右侧——指的是内存在物理上被划分为一个个的部分。

(二)重要的数据结构——页表

  为了能知道进程的每个页面在内存中的存放位置,操作系统要为每个进程建立一张页表

  注:页表通常存放在PCB(进程控制块)中。

image-20240313095126136

说明

  1.一个进程对应一张页表;

  2.进程的每个页面对应一个页表项;

  3.每个页表项由“页号”和“块号”组成;

  4.页表记录进程页面和实际存放的内存块之间的映射关系

问题1:“页表”是存放在PCB中,从而也是存放在内存中的。那么,页表中的每个页表项占多大空间?占几个字节?

  举一道题为例作为说明。

  例题:假设某系统物理内存大小为4GB,页面大小为4KB,则每个页表项至少应该为多少字节?

  1)分析

  先分析4GB大小的物理内存,到底能够在物理上分为多少个页框。

  我们知道,物理内存的页框/内存块的大小,与进程的页面大小是相等的。

  内存块大小 = 页面大小 = 4KB = 2 12 B 2^{12}B 212B

  因此,4GB的内存总共会被分为4GB / 4KB = 2 32 / 2 12 = 2 20 2^{32} / 2^{12} = 2^{20} 232/212=220个内存块。

  既然物理内存中总共有这么多个内存块,因此,要给这些内存块编号,则编号的范围自然就是0 ~ 2 20 − 1 2^{20}-1 2201

  而如果要用二进制0、1编码来表示这么多个内存块的编号,则至少需要20bit来表示。

  即,在页表的页表项当中,对于“块号”这个参数,它至少需要20bit来存放。

  但是,计算机的存储是以字节为单位的,而并不是以bit为单位的,所以要转换为多少个字节。

  至少要用3B来表示块号(3×8 = 24bit)。

  重要考点

  计算机中内存块的数量 —> 页表项中块号至少占多少字节。

image-20240313100436786

  那么“页号”又要占多少个字节呢?

  实际上,由于页表项连续存放,因此页号可以是隐含的,不占存储空间(类比数组)。

image-20240313100629693

  假设页表中的各页表项从内存地址为X的地方开始连续存放,如何找到页号为i的页表项?

  i号页表项的存放地址 = X + 3*i

  学过数据结构的线性表,此处不难理解。

  2)答

image-20240313101011230

image-20240313101046766

  注意:页表记录的只是内存块号(如:编号为8的内存块号/页框号),而不是内存块的起始地址。而对于内存块实际的物理起始地址,还需经过一个公式进行转换:
J 号内存块的起始地址 = J ∗ 内存块大小 J号内存块的起始地址=J*内存块大小 J号内存块的起始地址=J内存块大小
问题2:如何通过页表实现逻辑地址到物理地址的转换?

  补充:如果进程在内存中是连续存放的,如何进行逻辑地址到物理地址的转换。

image-20240313102712800

  接下来讨论分页存储如何实现逻辑地址到物理地址的转换。

image-20240313102830811

  特点:虽然进程的各个页面是离散存放的,但是页面内部是连续存放的。

  基于这个特点,如果要访问逻辑地址A,则:

  a.确定逻辑地址A对应的“页号”P;

  b.找到P号页面在内存中的起始地址(需要查页表);

  c.确定逻辑地址A的“页内偏移量”W;

  上述信息若均已得到,则由下述公式即可算出逻辑地址A对应的物理地址。
逻辑地址 A 对应的物理地址 = P 号页面在内存中的起始地址 + 页内偏移量 W 逻辑地址A对应的物理地址 = P号页面在内存中的起始地址 + 页内偏移量W 逻辑地址A对应的物理地址=P号页面在内存中的起始地址+页内偏移量W
  子问题:如何确定一个逻辑地址对应的页号、页内偏移量?

  还是以一道例题进行说明。

  例题:在某计算机系统中,页面大小是50B。某进程逻辑地址空间大小为200B,则逻辑地址110对应的页号、页内偏移量是多少?

  1)分析

image-20240313103620922

  由于计算机按字节存储,因此每1B为一个存储单元。因此,如上图所示,逻辑地址110对应的页号是2号页面,并且相对于2号页面的起始地址而言,页内偏移量应该是10

  2)如何计算

  页号 = 逻辑地址 / 页面长度(取除法的整数部分)

  页内偏移量 = 逻辑地址 % 页面长度 (取除法的余数部分)

  页号 = 110 / 50 = 2;

  页内偏移量 = 110 % 50 = 10。

  逻辑地址 可以拆分为 (页号,页内偏移量)

  通过页号查询页表,可知页面在内存中的起始地址。

  页面在内存中的起始地址 + 页内偏移量 = 实际的物理地址。

  子问题:为何页面大小要取2的整数幂?

  在计算机内部,地址是用二进制表示的,如果页面大小刚好是2的整数幂,则计算机硬件可以很快速地把逻辑地址拆分成(页号,页内偏移量)

image-20240313105237060

  结论:如果每个页面大小为 2 K B 2^KB 2KB,用二进制数表示逻辑地址,则末尾 K 位即为页内偏移量,其余部分就是页号

(熟悉二进制乘法、二进制除法,无符号左移、无符号右移等操作的话,对此处的原理就能够很轻易的理解了)

image-20240313105632084

  总结:页面大小刚好是2的整数幂有什么好处?

  1.逻辑地址的拆分更加迅速——如果每个页面大小为 2 K B 2^KB 2KB,用二进制数表示逻辑地址,则末尾K位即为页内偏移量,其余部分就是页号。因此,如果让每个页面的大小为2的整数幂,计算机硬件就可以很方便地得出一个逻辑地址对应的页号和页内偏移量,而无需进行除法运算,从而提升了运行速度。

  2.物理地址的计算更加迅速——根据逻辑地址得到页号,根据页号查询页表从而找到页面存放的内存块号,将二进制表示的内存块号和页内偏移量拼接起来,就可以得到最终的物理地址。

  提示:学有余力的可以看看二进制数的运算(计组内容),能更好的理解本质原理。

(三)逻辑地址结构

  分页存储管理的逻辑地址结构如下所示:(以地址长度32位为例)

image-20240313110420430

  地址结构包含两个部分:

  前一部分为页号P,后一部分为页内偏移量W。

  在上图所示的例子中,地址长度为32位,其中0 ~ 11位为“页内偏移量”,或称“页内地址”;12 ~ 31位为“页号”。

  如果有K位表示“页内偏移量”,则说明该系统中一个页面的大小是 2 K 2^K 2K个内存单元

  如果有M位表示“页号”,则说明在该系统中,一个进程最多允许有 2 M 2^M 2M个页面

  重要:页面大小 <------> 页内偏移量位数 ------> 逻辑地址结构

  提示

  有个别题目中,页面大小有可能不是2的整数次幂,这种情况还是得用最原始的方法计算:

  页号 = 逻辑地址 / 页面长度(取除法的整数部分)

  页内偏移量 = 逻辑地址 % 页面长度 (取除法的余数部分)

总结

image-20240313111112960

这篇关于3.1_5 基本分页存储管理的概念的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/805767

相关文章

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo

C 语言的基本数据类型

C 语言的基本数据类型 注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。 有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢? 如果写了一句: int a; 那么执行的时候在内存中会有什么变化呢? 橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。 上

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

Java 多线程的基本方式

Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

oracle分页和mysql分页

mysql 分页 --查前5 数据select * from table_name limit 0,5 select * from table_name limit 5 --limit关键字的用法:LIMIT [offset,] rows--offset指定要返回的第一行的偏移量,rows第二个指定返回行的最大数目。初始行的偏移量是0(不是1)。   oracle 分页 --查前1-9

【MRI基础】TR 和 TE 时间概念

重复时间 (TR) 磁共振成像 (MRI) 中的 TR(重复时间,repetition time)是施加于同一切片的连续脉冲序列之间的时间间隔。具体而言,TR 是施加一个 RF(射频)脉冲与施加下一个 RF 脉冲之间的持续时间。TR 以毫秒 (ms) 为单位,主要控制后续脉冲之前的纵向弛豫程度(T1 弛豫),使其成为显著影响 MRI 中的图像对比度和信号特性的重要参数。 回声时间 (TE)

JavaEE7 Servlet 3.1(JSR 340)规范中文版

http://www.iteye.com/news/27727-jinnianshilongnian     Jave EE 7中的部分规范已正式获得批准通过,其中包括JSR340 Java Servlet 3.1规范,去年翻译了该规范,在此分享出来,希望对某些朋友有所帮助,不足之处请指正。   点击直接下载    在线版目录   Servlet3.1规范翻译

Java基础回顾系列-第一天-基本语法

基本语法 Java基础回顾系列-第一天-基本语法基础常识人机交互方式常用的DOS命令什么是计算机语言(编程语言) Java语言简介Java程序运行机制Java虚拟机(Java Virtual Machine)垃圾收集机制(Garbage Collection) Java语言的特点面向对象健壮性跨平台性 编写第一个Java程序什么是JDK, JRE下载及安装 JDK配置环境变量 pathHe