内存管理(三)——非连续分配管理方式(分页)

简介: 内存管理(三)——非连续分配管理方式(分页)

一、概要

基本概念: 操作系统对内存的划分和动态管理。
带来的好处: 方便用户实用存储器、提高内存利用率、通过虚拟技术从逻辑上扩充内存。
OS提供的功能: ①内存空间的分配和回收 ②地址转化 ③内存扩充 ④存储保护

二、连续和非连续的比较

(1)回顾:

上期的博客中,我们梳理了,操作系统内存分配的连续分配管理方式,分别有:单一分配、固定分配、动态分配。本期我们梳理关于非连续分配管理方式
在这里插入图片描述

(2)简述:

连续分配管理方式是将程序整个装入一块连续的内存空间,如果用户需要1GB的内存空间,连续分配方式就是在内存空间中为用户分配一块连续的1GB内存。但是如果没有连续的1GB的空间,则该作业仍然是无法运行的。所以我们引入非连续分配管理方式,使得该作业可以分散地在内存地各个区域,当然,也需要额外地空间区存储它们(分散区域)的索引。这也导致连续分配管理方式的存储密度相比连续更低。

(3)分类:

根据运行作业是否要把作业的所有页面装入内存才能运行,又细分为:基本分页和请求分页。

三、分页?

(1)引入:

固定分区会产生内存碎片,动态分区会产生外部碎片,这两种技术对内存的利用率都比较低。我们希望内存的使用能够尽量避免碎片的产生,就引入了分页的思想:把内存划分为大小相等且固定的“块”,“块”相对较小,作为主存的基本单位。把进程也分为以“块”为单位进行划分,进程在执行时,以块为单位逐个申请内存空间。 (注意这里的块在后续叫法有变)

(2)区分:块、页、页框、页帧、内存块、物理页面、物理块?

区分:
进程的”称为:页(page或者页面);内存中的“块”称为页框(Page Frame或者页帧);外存中称为块(Block) ——《王道考研》
进程的地址空间被划分为若干个相等大小的区域,称为:页或页面;内存的存储空间也分为与页面大小相等的区域,称为:块或物理块;在为作业分配存储空间时,以块为单位来分配,可以将作业中的任意一页放到内存的任意一块中。内存中与页面大小相等的块也可以称为:页框 ——《天勤考研》
在这里插入图片描述

(3)页表:

为了将逻辑地址上连续的页号映射到物理地址上,需要将页面和每个物理块一一对应,这就有操作系统建立页表 来体现这种映射关系。
在这里插入图片描述

1) 每个页表项多大?占几个字节?

块号: 必须满足能够存放块号的所有范围。
页号: 页表项连续存放, 因此页号可以是隐含的,不占存储空间(类比数组) 【重点后续会用到】
在这里插入图片描述
页表项中块号起记录作用,但是它本身也需要存放在内存中,并且连续存放。
在这里插入图片描述
如果每个页表项占 4字节,则每个页框刚好可存放 1024个页表项1024 号页表项虽然是存放在下一个页框中的,但是它的地址依然可以用 X + 41024 得出:
*结论
:理论上,页表项长度为 3B 即可表示内存块号的范围,但是,为了方便页表的查询,常常会让一个页表项占更多的字节,使得每个页面恰好可以装得下整数个页表项。
在这里插入图片描述

2)如何通过页表实现逻辑地址到物理地址的转换?

首先我们需要找到逻辑地址对应的页号和偏移量。
在这里插入图片描述

3)如何确定一个逻辑地址对应的页号、页内偏移量?

在这里插入图片描述
重要结论:
①在计算机内部,地址是用二进制表示的,如果页面大小 刚好是 2 的整数幂,则计算机硬件可以很快速的把逻辑地址拆分成(页号,页内偏移量)。
②如果每个页面大小为 2(K次)B,用二进制数表示逻辑地址,则末尾 K 位即为页内偏移量,其余部分就是页号。
在这里插入图片描述
重要结论:
①如果页面大小刚好是2的整数幂,则只需把页表中记录的物理块号拼接上页内偏移量就能得到对应的物理地址。
②根据页号可以查询页表,而页表中记录的只是内存块号,而不是内存块的起始地址!J 号内存块的起始地址 = J * 内存块大小

在这里插入图片描述

4)为何页面大小要取2的整数幂?

在这里插入图片描述

(3)逻辑地址结构:

页面的大小由机器的地址结构决定。在确定地址结构时,若选择的页面较小,可使页面内碎片较小,提高内存利用率;但是也会导致进程要求的页面过多,从而页表过长,占用内存过多,还会减低页面换进换出的效率。
在这里插入图片描述

四、基本分页存储

(1)基本地址变化机构

1)基本地址转化

在这里插入图片描述
在这里插入图片描述

2)练习题

在这里插入图片描述
注意: 在分页存储管理(页式管理)的系统中,只要确定了每个页面的大小,逻辑地址结构就确定了。 因此,页式管理中地址是一维的。即,只要给出一个逻辑地址,系统就可以自动地算出页号、页内偏移量 两个部分,并不需要显式地告诉系统这个逻辑地址中,页内偏移量占多少位

五、具有快表的地址变换机构

(1)什么是快表?

简单地说:是基本地址变换机构的改进版本。
在这里插入图片描述

(2)升级了那些?

流程对比:
在这里插入图片描述
表格对比:
在这里插入图片描述

(3)局部性原理:

在这里插入图片描述

(4)引入快表后地址的变化:

在这里插入图片描述
在这里插入图片描述

(5)能否把整个页表都放在TLB中?

那肯定不行,但是在快表满了的时候,我们可以通过置换算法将一些页表项进行替换。
在这里插入图片描述

六、两级页表

(1)单级页表存在的问题:

从页表大小的计算公式可知,页表大小和页表长度成正比,而页表长度又随着页号位数的增长而呈指数式增长。所以,如果系统的逻辑地址的位数比较多,页表会很大,而整张页表要求需要连续地存放在内存中,这是一件很困难地事情。所以引出两级页表。
在这里插入图片描述

(2)如何解决单级页表的问题?

①问题一:页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框。

解决办法: 把页表再分页并离散存储,然后再建立一张页表记录页表各个部分的存放位置,称为页目录表,或称外层页表,或称顶层页表。这样解决了需要给它分配一块很大的连续空间问题
在这里插入图片描述
在这里插入图片描述

②问题二:没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问某几个特定的页面。在这里插入图片描述

(3)如何实现地址变换?

先用一级页号在一级页表上查找,找出单元内容是二级页表地首地址,页表地首地址加二级地址就是页表项地地址,取出里头数值,就是物理块号。然后物理块号与页内地址拼接就得到了物理地址。
在这里插入图片描述

(4)页的共享与保护

在这里插入图片描述
到改页面对应的块号,同时还要检查本次操作与存取控制字段允许的操作是否相符,若不相符由硬件捕获并发出保护中断。

七、分页存储管理方式的优缺点

在这里插入图片描述

相关文章
|
4天前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
30 12
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
65 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
1月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
53 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
3月前
|
关系型数据库 MySQL
MySQl优化:使用 jemalloc 分配内存
MySQl优化:使用 jemalloc 分配内存
|
3月前
|
缓存 Java 编译器
Go 中的内存布局和分配原理
Go 中的内存布局和分配原理
|
4月前
|
存储 缓存 算法
(五)JVM成神路之对象内存布局、分配过程、从生至死历程、强弱软虚引用全面剖析
在上篇文章中曾详细谈到了JVM的内存区域,其中也曾提及了:Java程序运行过程中,绝大部分创建的对象都会被分配在堆空间内。而本篇文章则会站在对象实例的角度,阐述一个Java对象从生到死的历程、Java对象在内存中的布局以及对象引用类型。
127 8
|
4月前
|
NoSQL Redis C++
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
|
4月前
|
Java 运维
开发与运维内存问题之在堆内存中新创建的对象通常首先分配如何解决
开发与运维内存问题之在堆内存中新创建的对象通常首先分配如何解决
24 1
|
3月前
|
存储 NoSQL Java
Tair的发展问题之Tair对于不同存储介质(如内存和磁盘)的线程分配是如何处理的
Tair的发展问题之Tair对于不同存储介质(如内存和磁盘)的线程分配是如何处理的
|
4月前
|
存储 安全 Java
Java面试题:Java内存管理、多线程与并发框架:一道综合性面试题的深度解析,描述Java内存模型,并解释如何在应用中优化内存使用,阐述Java多线程的创建和管理方式,并讨论线程安全问题
Java面试题:Java内存管理、多线程与并发框架:一道综合性面试题的深度解析,描述Java内存模型,并解释如何在应用中优化内存使用,阐述Java多线程的创建和管理方式,并讨论线程安全问题
45 0