九 内存管理(2)

1.存储空间的分配与回收

        页式存储管理分配内存空间以物理页面为单位:简单的内存分配表可以用一张“位示图”构成。位示图中的每一位与一个内存块对应,每一位的值可以是0或1,0表示对应的内存块为空闲,1表示已占用。在进行内存分配时,先查看空闲块数是否能满足程序要求。若不能满足,则不进行分配,程序就不能装入内存:若能满足,则根据需求从位示图中找出一些为0的位,把这些位置成 1,并从空闲块数中减去本次分配的块数,然后按照找到的位计算出对应的块号。当找到一个为0的位后,根据它所在的字号、位号,按如下公式就可计算出对应的块号:

块号=字号x字长+位号

把程序装入到这些内存块中,并为该程序建立页表。

2.页式存储管理的地址转换

        为实现页式存储管理,系统要提供页表起始地址寄存器和页表长度寄存器以及要高速缓冲存储器的支持。页表指出该程序逻辑地址中的页号与所占用的内存块号之间的对应关系。页表的长度由程序拥有的页面数而定,页表是硬件进行地址转换的依据,每执行一条指令时按逻辑地址中的页号查页表。若页表中无此页号,则产生一个“地址错”的程序性中断事件。若页表中有此页号,则可得到对应的内存块号,按计算公式可转换成访问的内存的物理地址。

        物理地址的计算公式为:物理地址=内存块号x块长+页内地址
        根据二进制乘法运算的性质,一个二进制数乘以 2^n结果实际上是将该数左移n位。所以,实际上是把内存块号作为绝对地址的高位地址,而页内地址作为它的低地址部分。

3.页表

3.1 多级页表

        当系统支持 32位的逻辑地址空间时,若页面大小为4KB,则页表将包含1M个表项。假设每个表项由4字节组成,那么仅仅是为了存储页表就要为每个进程分配 4MB 的物理地址空间。假设用户地址空间为 2GB,页面大小为 4KB,则一个进程最多可以有219页。若用4字节表示一页的物理页号,则页表本身就占用2MB,即需要512个页面存放。存放页表的页面为页表页。

        一般来说,页表页可以不连续存放,因此需要对页表页的地址进行索引。在大多数操作系统中采用二级页表,即由页表页和页目录一起构成进程页表。第一级表示页目录,保存页表页的地址;第二级表示页表页,保存物理页面号(即内存块号)。在 Windows操作系统中,页目录被称为页目录项(Page Directory Entry,PDE),页表被称为页表项(Page Table Entry,PTE)。

3.2 散列页表

        当地址空间大于32位时,一种常见的方法是使用以页号为散列值的散列页表。其中每个表项都包含一个链表,该链表中元素的散列值都指向同一个位置。这样,散列页表中的每个表项都包含3个字段:①虚拟页号,②所映射的页框号,③指向链表中下一个元素的指针。

3.3 反置页表

        在反置页表中,每个物理页框对应一个表项,每个表项包含与该页框相对应的虚拟页面地址以及拥有该页面进程的信息。因此,整个系统中只存在一个页表,并且每个页框对应其中一个表项。由于一方面系统中只有一个页表,而另一方面系统中又存在着多个映射着物理内存的地址空间,因此需要在反置页表中存放地址空间标志符。这样就保证了一个特定进程的逻辑页面可以映射到相应的物理页框上。

4.快表

        为了提高存取速度,在地址映射机制中增加一个小容量的联想寄存器(相联存储器),它由高速缓冲存储器组成。利用高速缓冲存储器存放当前访问最频繁的少数活动页面的页号,这个高速缓冲器被称为“快”也称为转换检测缓冲器(Translation Lookaside Buffer, TlB)。快表只存放当前进程最活跃的少数几页,随着进程的推进,快表的内容动态进行更新。

        更新原理:当某一用户程序需要存取数据时,根据该数据所在的逻辑页号在快表中找出对应的内存块号,然后拼接页内地址,以形成物理地址。如果在快表中没有相应的逻辑页号,则地址映射仍然通过内存中的页表进行;在得到内存块号后需将该块号填到快表的空闲单元中;若快表中没有空闲单元,则根据置换算法置换某一行,再填入新得到的页号和块号。查找快表和查找内存页表是并行进行的,一旦发现快表中有与所查页号一致的逻辑页号就停止查找内存页表,而直接利用快表中的逻辑页号。

        例:假定访问内存的时间为 200ns,访问高速缓冲存储器的时间为40ns,高速缓冲存储器为 16个单元时,查快表的命中率为90%。于是,按逻辑地址转换成绝对地址进行存取的平均访问时间为:(200+40)x90%+(200+200)X10%=256(ns)
        不使用快表需两次访问内存的时间为 200X2=400ns。可见使用快表与不使用快表相比,访问时间下降736%。

5.虚拟存储器

        (1)实现虚拟存储器需要以下的硬件支持:①系统有容量足够大的外存。②系统有一定容量的内存。③硬件提供实现虚-实地址映射的机制。④缺页中断处理程序。⑤页表

        (2)在一个虚拟存储系统中,决定虚拟存储空间最大容量的要素是计算机系统地址位宽。虚拟存储技术是动态的扩充内存容量。

        (3)虚拟存储器的工作原理如下:当进程开始运行时,先将一部分程序装入内存,另一部分暂时留在外存;当要执行的指令不在内存时,由系统自动完成将它们从外存调入内存的工作,当没有足够的内存空间时,系统自动选择部分内存空间,将其中原有的内容交换到磁盘上,并释放这些内存空间供其他进程使用。

6.页表增加项

        在使用虚拟页式存储管理时需要在页表中增加以下的表项:

页号页面的编号
有效位又称驻留位、存在位或中断位,表示该页是在内存还是在外存
页框号页面在内存中时所对应的内存块号
访问位又称引用位或参考位,表示该页在内存期间是否被访问过
修改位表示该贞在内存中是否被修改过
保护位是否能读/写/执行
禁止缓存位采用内存映射 I/0的机器中需要的位

        其中,访问位和修改位可以用来决定置换哪个页面,具体由页面置换算法决定

7. 缺页中断

        若在页表中发现所要访问的页面不在内存,则产生缺页中断。 当发生缺页中断时,操作系统必须在内存中选择一个页面将其移出内存,以便为即将调入的页面让出空间。

        整个缺页处理过程简单阐述如下:①根据当前执行指令中的逻辑地址查页表的驻留位,判断该页是否在内存。②该页标志为 “0 ”,形成缺页中断。保留现场。中断装置通过交换 PSW 让操作系统的中断处理程序占用处理器。③操作系统处理缺页中断,寻找一个空闲的页面。④若有空闲页,则把磁盘上读出的信息装入该页面中。⑤修改页表及内存分配表,表示该页已在内存。⑥如果内存中无空闲页,则按某种算法选择一个已在内存的页面,把它暂时调出内存。若在执行中该页面已被修改过,则要把该页信息重新写回到磁盘上,否则不必重新写回磁盘。当一页被暂时调出内存后,让出的内存空间用来存放当前需要使用的页面。页面被调出或装入之后都要对页表及内存分配
表作修改。⑦恢复现场,重新执行被中断的指令。当重新执行该指令时,由于要访问的页面已被装入内存,所以可正常执行下去。

8. 页面调度3个策略

        虚拟存储器系统通常定义3种策略进行页面调度:调入策略,置页策略和置换策略

8.1 调入策略

        虚拟存储器的调入策略决定了什么时候将一个页由外存调入内存之中。 在虚拟页式管理中有两种常用调入策略:①请求调页(Demand Paging)Paging):只调入发生缺页时所需的页面。实现简单,但易产生较多的缺页中断,容易产生抖动现象。②预调页(Prepaging):在发生缺页需要调入某页时,一次调入该页以及相邻的几个页。

8.2 置页策略

        当线程产生缺页中断时,内存管理器还必须确定将调入的虚拟页放在物理内存的何处。用于确定最佳位置的一组规则称为 “置页策略 ”。选择页框应使 CPU 内存高速缓存不必要的震荡最小。

8.3 置换策略

        如果缺页中断发生时物理内存已满,“置换策略 ” 被用于确定哪个虚页面必须从内存中移出,为新的页面腾出空位。

(1)固定分配局部置换 (Fixed AllocationAllocation,Local Replacement) 。①可基于进程的类型,为每一进程分配固定的页数的内存空间,在整个运行期间都不再改变。②采用该策略时,如果进程在运行中出现缺页,则只能从该进程的 W个页面中选出一个换出,然后再调入一页,以保证分配给该进程的内存空间不变。

(2)可变分配全局置换 (Variable AllocationAllocation,Global Replacement) 。①采用这种策略时,先为系统中的每一进程分配一定数量的物理块,操作系统本身也保持一个空闲物理块队列。②当某进程发生缺页时,由系统的空闲物理块队列中取出一物理块分配给该进程。③但当空闲物理块队列中的物理块用完时,操作系统才从内存中选择一块调出。④该块可能是系统中任意一个进程的页。

(3)可变分配局部置换 (Variable AllocationAllocation,Local Replacement) 。①同样基于进程的类型,为每一进程分配一定数目的内存空间。②但当某进程发生缺页时,只允许从该进程的页面中选出一页换出,这样就不影响其他进程的运行。③如果进程在运行的过程中频繁地发生缺页中断,则系统再为该进程分配若干物理块,直到进程的缺页率降低到适当程度为止。

9.“抖动”现象

        如果刚被调出的页面又立即要用,因而又要把它装入,而装入不久又被选中调出,调出不久又被装如此反复,使调度非常频繁。这种现象称为“抖动”或称“颠”。

10.先进先出页面置换算法(First-In First-0ut,FIFO)

        FIFO算法简单,容易实现。把装入内存的那些页面的页号按进入的先后次序排好队列,每次总是调出队首的页,当装入一个新页后,把新页的页号排入队尾。由操作系统维护一个所有当前在内存中的页面的链表,最老的页面在表头,最新的页面在表尾。当发生缺页时,置换表头的页面并把新调入的页面加到表尾。

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

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

相关文章

【其他】简易代码项目记录

1. KeypointDetection 1.1. CharPointDetection 识别字符中的俩个关键点。 1.2. Facial-keypoints-detection 用于检测人脸的68个关键点示例。 1.3. Hourglass-facekeypoints 使用基于论文Hourglass 的模型实现人体关键点检测。 1.4. Realtime-Action-Recognition containing:…

【Java万花筒】从开发到测试:嵌入式数据库与键值存储库全方位指南

嵌入式数据库与键值存储库:探索高效数据存储和访问的先进工具 前言 在当今数字化时代,数据的存储和访问是任何应用程序的关键需求。为了满足不同的需求,开发人员需要选择适合其应用场景的数据库和存储库。本文将介绍一些常用的嵌入式数据库…

opencv基础 python与c++

question: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib Opencv 一、读取图片 (1).imshow Mat imread(const string& filename, intflags1 );flags: enum { /* 8bit, color or not */CV_LOAD_IMAGE_UNCHANGED -1, /* 8bit, gray */CV_LOAD_I…

Vue3 exceljs库实现前端导入导出Excel

前言 需求场景 最近在开发项目时需要批量导入和导出Excel数据,在实现这个需求时,我们既可以在前端完成数据解析和文件生成工作,也可以通过前端发起导入以及导出请求后,后端实现解析文件流解析文件内容以及生成文件并提供下载链接…

中科大计网学习记录笔记(十五):可靠数据传输的原理

前前言:看过本节的朋友应该都知道本节长度长的吓人,但其实内容含量和之前的差不多,老师在本节课举的例子和解释比较多,所以大家坚持看完是一定可以理解透彻的。本节课大部分是在提出问题和解决问题,先明确出现的问题是…

python自动化管理和zabbix监控网络设备(有线网络配置部分)

目录 一、拓扑图 二、core-sw1 三、core-sw2 四、sum-sw1 五、sum-sw2 一、拓扑图 二、core-sw1 sys sysname core-sw1 vlan batch 10 20 30 40 50 60 100 vlan batch 200 210 220 230 240 250 stp region-configuration region-name huawei revision-level 1 instance…

学习python的第7天,她不再开放她的听歌榜单

我下午登录上小号,打开聊天消息看到了她的回复,我很开心兴奋,可是她不再开放她的听歌榜单了,我感觉得到,我要失恋了。 “因为当年电视上看没有王菲版本的” “行”。 “那你以后还会开放听歌榜单吗?”我…

Python入门必学:reverse()和reversed()的区别

Python入门必学:reverse()和reversed()的区别 📅2024年02月25日 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程…

支付功能、支付平台、支持渠道如何测试?

作为一个支付平台,接入了快钱、易宝或直连银行等多家的渠道,内在的产品流程是自己的。业内有什么比较好的测试办法,来测试各渠道及其支持的银行通道呢? 作为产品,我自己办了十几张银行卡方便测试,但QA和开…

openGauss学习笔记-229 openGauss性能调优-系统调优-配置Ustore

文章目录 openGauss学习笔记-229 openGauss性能调优-系统调优-配置Ustore229.1 设计原理229.2 核心优势229.3 使用指导 openGauss学习笔记-229 openGauss性能调优-系统调优-配置Ustore Ustore存储引擎,又名In-place Update存储引擎(原地更新&#xff09…

【前端素材】推荐优质医院后台管理系统I-Health平台模板(附源码)

一、需求分析 后台管理系统是一种用于管理和监控网站、应用程序或系统的在线工具。它通常是通过网页界面进行访问和操作,用于管理网站内容、用户权限、数据分析等。后台管理系统是网站或应用程序的控制中心,管理员可以通过后台系统进行各种管理和配置操…

java和python的区别

Java和Python是两种不同的编程语言,各自有其特点和用途。 语法差异:Java采用强类型语言,要求变量必须先声明后使用,并且要指定变量的数据类型。而Python是一种动态类型语言,变量可以直接赋值并且不需要指定数据类型。 …

数据结构(算法竞赛、蓝桥杯)--线段树+懒标记

1、B站视频链接:C02【模板】线段树懒标记 Luogu P3372 线段树 1_哔哩哔哩_bilibili 题目链接:P3372 【模板】线段树 1 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) void build(int p,int l,int r){tr[p]{l,r,w[l],0};if(lr)return;//叶子节点返回int…

安卓相机慢动作的软件实现要点

本文首发地址 https://h89.cn/archives/201.html 本文最新更新地址 https://gitee.com/chenjim/chenjimblog 慢动作英文称呼SlowMotion,也就是高帧率录像,如果以正常30帧播放,就能看到慢动作效果,可以用来拍摄快速移动物体的瞬间&…

SpringBoot -【BeanFactory】基础使用及应用场景

1.介绍 在 Spring 框架中,BeanFactory 是 Spring IoC 容器的核心接口,负责管理 bean 的创建、配置和装配。它是 Spring IoC 容器的基础。BeanFactory 接口定义了一系列方法,用于管理和访问容器中的 bean 对象。 BeanFactoryAware 用于在 Sp…

C++学习规划“的 PPT 大纲设计

以下是一个关于"C学习规划"的 PPT 大纲设计: 幻灯片 1:引言 欢迎参加 C学习之旅介绍 C的重要性和应用领域 幻灯片 2:C基础知识 C编程语言概述数据类型与变量控制流语句函数定义与调用 幻灯片 3:面向对象编程 类与…

matlab悬臂梁有限元分析

1、内容简介 略 47-可以交流、咨询、答疑 2、内容说明 略 建模说明 设计一个长方体的悬臂梁,长宽高分别为100m、10m和15m,材料特性为杨氏模量2e5,泊松比0.3, Matlab有限元分析(截图) 上图为悬臂梁的扰度…

Autosar 开篇

背景 AUTOSAR(Automotive Open System Architecture)是一个跨汽车行业的标准化软件架构,旨在促进汽车电子系统的开发和部署。下面是AUTOSAR发展的一些关键点: 起源和背景: AUTOSAR最初于2003年由汽车制造商宝马、戴姆…

从私人客户转变为教练会员网站

教练和顾问可以做出的最令人兴奋的转变之一就是通过教练会员网站扩大业务规模。 一对多优惠的类型有很多种,但与任何其他选择相比,教练和顾问的会员资格拥有最多的机会和灵活性,可以与你和你的客户一起发展。 世界正在转向更容易获得和更…

Atomic-tutorial

上一节介绍了 C11 中最简单的原子类型 std::atomic_flag,但是 std::atomic_flag 过于简单,只提供了 test_and_set 和 clear 两个 API,不能满足其他需求(如 store, load, exchange, compare_exchange 等),因此本文将介绍功能更加完…