【操作系统期末速成】​内存管理|内存的装入模块在装入内存的方式|分配管理方式|页面置换算法|页面置换

news2024/11/30 5:01:20
  •   🎥 个人主页:深鱼~
  • 🔥收录专栏:操作系统
  • 🌄欢迎 👍点赞✍评论⭐收藏

推荐

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

 前言:

最近在备战期末考试,所以本专栏主要是为了备战期末操作系统这门考试,讲的比较浅显,但是都是期末常考的考点和题型,仅限于“期末不挂”的层面

​​


一、内存管理

1.内存管理的概念

计算机不可能将所有用户进程和系统所需要的全部程序和数据放入主存,因此操作系统必须对内存空间进行合理的划分和有效的动态分配

内存管理的概念就是操作系统对内存的划分和动态分配


2.内存管理功能

(1)内存空间的分配与回收:由操作系统完成主存储器空间的分配和管理

💡(2)地址转换: 将逻辑地址转换成相应的物理地址

(3)内存空间的扩充:利用虚拟存储技术或自动覆盖技术,从逻辑上扩充主存

(4)存储保护:保证各道作业在各自的存储空间内运行,互不干扰


3.将用户源程序变为可在内存中执行的程序的步骤:

(1)编译:由编译程序将用户源代码编译成若干目标模块(把高级语言翻译成机器语言)

(2)链接:由链接程序将编译后形成的一组目标模块及所需的库函数连接在一起,形成一个完整的装入模块(由目标模块生成装入模块,链接后形成完整的逻辑地址)

(3)装入:由装入程序将装入模块装入内存运行,装入后形成物理地址


程序的链接有以下三种方式:

(1)静态链接:在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开

(2)装入时动态链接:将各目标模块装入内存时,边装入边链接的链接方式

(3)运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享


💡(考选择)内存的装入模块在装入内存时,有以下三种方式:

(1)绝对装入:在程序编译时就知道程序需要放在内存中的什么地方,编译后的程序不是从0开始的逻辑地址,而是真实的物理地址按照编译程序产生的绝对地址进行装入

(2)静态可重定位装入:编译后的模块需要连续装入内存,但是在内存中的物理地址可与逻辑地址不同,可以存在一定偏移,比如逻辑地址是0-100,它可以在内存中存储在100-200的内存单元中,需要设定-个偏移量就是100,同时也需要为其分配连续的存储空间,不然通过偏移量是无法找到的,现在就可以通过作业的逻辑地址+偏移量获得作业在内存中的绝对地址(💡考大题)

(3)动态运行时装入:将不同的模块可以装入在不同的内存地址,不同模块可以不连续,但是同一模块还是要连续存放的,同一模块需要设定一个重定位寄存器,每个模块的重定位寄存器中的值就是对应的偏移量。装入程序会把模块装入内存,但是并不会立即将装入模块的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正执行时才进行

可以将程序分配到不连续的存储区


4.覆盖

覆盖技术的基本思想:将程序分为多个段,常用的段常驻内存,不常用的段在需要时调入内存。

特点:打破了必须将一个进程的全部信息装入主存后才能运行的限制,解决了程序大小超过物理内存总和的问题


5.交换

交换技术的基本思想:内存空间紧张时,系统将内存中的某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存


二、分配管理方式

1.连续分配管理方式

连续分配方式是指为一个用户程序分配一个连续的内存空间。主要包括单一连续分配、固定分区分配和动态分区分配

(1)内部碎片:分配给某进程的内存区域中,有些部分没用上

(2)外部碎片:是指内存中的某些空闲分区由于太小而难以利用


<1>单一连续分配(无外部碎片,有内部碎片)

在单一连续分配方式中,内存被分为系统区和用户区,系统区用于存放操作系统相关数据;用户区用于存放用户进程相关数据

内存中只能有一道用户程序,用户程序独占整个用户区空间


<2>固定分区分配(无外部碎片,有内部碎片)

它将用户内存空间划分为若干固定大小的分区,每个分区只装入一道作业,当有空闲分区时,便可再从外存的后备队列中选择适当大小的作业装入该分区

固定分区分配分为分区大小相等分区大小不等两种方式


<3>动态分区分配(没有内部碎片,但有外部碎片)

动态分区分配不预先分配内存,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。(某些空闲分区由于太小而难以利用)


动态分区分配的策略有以下几种算法:

(1)首次适应算法First-Fit

每次都从低地址开始查找,选择第一个能够满足大小的空闲分区

优点:综合看性能最好。算法开销小,回收分区后一般不需要对空闲分区队列重新排序

(2)最佳适应算法Best-Fit

优先使用更小的空闲分区,将空闲分区按照容量递增链接,每次寻找大小能够满足的第一个空闲分区
优点:会有更多的大分区被保留下来,更能满足大进程需求
缺点:开销大,产生很多小碎片

(3)最坏适应算法Worst-Fit

为了防止留下太多细碎的空闲空间,每次分配时优先使用最大的空闲分区。可以将空闲分区按照容量递减链接

缺点:由于每次都使用最大的空闲分区,因此较大的连续分区会很快被利用完,导致大进程到来时可能不足以分配

优点:可以减少难以利用的小碎片

(4)邻近适应算法Next-Fit

由于首次适应算法每次都从链头开始查找,可能导致低地址 部分出现很多小的空闲分区,而每次查找时都会遍历这些分区,增加了查找开销。因此将空闲分区按照地址递增的顺序排成一个循环链表,每次都从上次结束的位置开始查找,使用第一个满足的空闲分区

优点:不用每次都从低地址的小分区开始检索


2.非连续分配管理方式

非连续分配概念

如果可以将一个进程分散的装入到许多不相邻的分区中,便可以充分的利用内存

<1>基本分页存储的管理方式(💡考大题:根据页表求地址)

将用户进程的地址空间也分为与页框大小相等的一个个区域,称为页、或称页面,每个页面也有一个编号,即页号,页号也是从0开始的

各个页面不必连续存放,也不必按先后顺序来,可以放到不相邻的各个页框中

 

<2>基本地址变换机构

步骤:
(1)根据逻辑地址计算出页号、页内偏移量
(2)判断页号是否越界
(3)查询页表,找到页号对应的页表项,确定页面存放的内存块号
(4)用内存块号和页内偏移量得到物理地址
(5)访间目标内存单元

(💡考大题)例题:

例:若页而大小L为1K字节,页号2对应的内存块号b=8,将逻辑地址A=2500转换为物理地址E

答:1KB=1024B,说明页内偏移量占10位

页号2对应的内存号b=8

第一步:计算页号、页内偏移量

页号P=A/L=2500/1024=2

页内偏移量W=A%L=2500%1024=452

第二步:求块号

页号为2,对应的内存块号为8

第三步:求物理地址

E=b*L+W=8*1024+452=8644

<3>分段存储管理方式

进程的地址空间,按照程序程序自身的逻辑关系划分为若干个段,每个段都有一个段名,每段从0开始编址

<4>段页式管理方式

先分段,再将各段分页,再将内存空间分为大小相同的内存块,然后进程内各个分页装入各个内存块中


局部性原理

时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果某个数据被访问过,不久之后该数据很可能再次被访问。(因为程序中存在大量的循环)

空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。因为很多数据在内存中都是连续存放的)


虚拟内存的基本概念

基于局部性原理,在程序装入时,可以将程序中很快会用到的部分装入内存,暂时用不到的部分留在外存,就可以让程序开始执行。

在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。在操作系统的管理下,在用户看来似乎有一个比实际内存大得多的内存,这就是虚拟内存


虚拟内存技术的实现

虚拟内存技术的实现需要建立在离散分配的内存管理方式的基础上

虚拟内存的实现有以下三种方式:

1.请求分页存储管理

2.请求分段存储管理

3.请求段页式存储管理


缺页中断

在请求分页系统中,每当要访问的页面不在内存中时,便产生一个缺页中断,请求操作系统将所缺的页调入内存。此时应将缺页的进程阻塞(调页完成唤醒),若内存中有空闲块,则分配一个块,将要调入的页装入该块 ,若此时内存中没有空闲块,则要淘汰某页,若被淘汰的页在内存期间被修改过,则要将其写回外存


快表

快表就是存放在[高速缓冲存储器]的部分页表。作为页表的Cache,它的作用与页表相似,但是提高了访问速率。由于采用页表做地址转换,读写内存数据时CPU要访问两次主存。有了快表,有时只要访问一次高速缓冲存储器,一次主存,这样可加速查找并提高指令执行速度。

地址转换流程

1.按照逻辑地址中的页号查快表

2.若该页*己存在*快表中,则由页架号和单元号形成绝对地址

3.若该页*不在*快表中,则再查主存页表,与单元号形成绝对地址,同时将该页登记到快表中

4.当快表填满后,又要登记新页时,则需要按照一定替换策略淘汰一个旧的登记项


💡 页面置换算法

最佳置换算法(OPT)

最佳页面置换算法选择的被淘汰页面是以后永不使用的页面,或是在最长时间内不再被访问的页面,以便保证获得最低的缺页率,但是,人们无法预知进程在内存下的若干页面中的哪个是未来最长时间内不再被访问的,因为该算法无法实现

先进先出页面置换算法(FIFO)

优先淘汰最早进入内存的页面,即再内存中驻留时间最久的页面

最近最久未使用置换算法(LRU)

选择最近最长时间未访问过的页面予以淘汰,它认为过去一段时间内未访问过的页面,在最近的将来可能也不会被访问。该算法为每个页面设置一个访问字段,来记录页面自上次被访问以来所经历的时间,淘汰页面时选择现有页面中值最大的予以淘汰

近期最少使用算法(LFU算法

选择近期最少访问的页面作为被替换的页面


页面抖动

概念:刚刚换出到外存的页面马上要调入内存,刚刚调入内存的页面马上要调出到外存

原因:系统为进程分配的物理块大小不足。内存驻留的进程太多


页面置换策略

固定分配局部置换:

系统为每个进程分配一定数量的内存块(物理块),在整个运行期都不改变。若进程在运行过程中发生了缺页,则只能在本进程的内存页面中选出一个进行调出,再调回需要的页面

缺点:不好确定一个进程到底应该分配多大的实际内存才合理

可变分配全局置换:

系统为每个进程分配一定数量的内存块。操作系统还会保持一个空闲物理块的队列。若某个进程发生缺页,可以从空闲物理块中取出一块分配给该进程。如果空闲物理块没有了,那么会选择一个未锁定(不那么重要,可能是其它进程的)的页面换出到外存,再将物理块分配给缺页的进程

缺点:在空闲物理块没有的情况下,如果将其它进程的页面调出外存,那么这个进程就会拥有较小的驻留集(即拥有的物理块),如此会导致该进程的缺页率(访问某个页面,这个页面不在内存中的概率)上升

可变分配局部置换:

刚开始为每个进程分配一定数量的物理块。当进程发生缺页时,只允许从当前进程的物理块中选出一个换出内存。如果当前进程在运行的时候频繁缺页,系统会为该进程动态增加一些物理块,直到该进程缺页率趋于适中程度;如果说一个进程在运行过程中缺页率很低或者不缺页,则可以适当减少该进程分配的物理块。通过这些操作可以保持多道程序的并发度较高

与可变分配全局置换 区别:

可变分配全局置换:只要发生缺页,就会分配新的物理块

可变分配局部置换:根据缺页率动态增加或者减少物理块的数量


真题速通

💡1.根据页表求地址

由页表可知,绝对页号是8,物理地址=E=b(块号)*L(页面大小)+W(偏移量)=1Kx8+451=1024x8+451=8643


💡2.页面置换

在一个请求分页存储管理系统中,一个作业的页面走向4,3,2,1,4,3,5,4,3,2,1,5.当分配给作业的物理块数为3时,试计算采用下述页面淘汰算法时的缺页率(假设开始执行时主存中没有页面),并比较结果

1) 最佳置换算法(从左往右看,第一次出现的地方,最远的那个被替换)

当页面走向为第一个1的时候,向后找第一次出现的地方最远的那个(4,3,2中2离的最远),后面如果有,说明没有缺页,就不用管,下一个就是5;然后再走到2,这个时候发现后面没有3,4,那么默认3,4都在最后一个位置(即最后一个5的后面),所以随机置换一个3/4都可以

缺页率=7/12

2)先进先出置换算法(看这行元素出现的次数,淘汰掉次数最大的)

当页面走向为第一个1的时候,看物理页这行,4出现3次,3出现2次,2出现1次,那么就需要置换出现最多次数的那个(也就是4)

缺页率=9/12

3)最近最久未使用算法(从右往左看,第一次出先的地方,最远的那个被替换)

当页面走向为第一个1的时候,看页面走向这行,从右往左看,4出现的最远,置换4 

缺页率=10/12

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

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

相关文章

Django开发实战之定制管理后台界面及知识梳理(上)

不知道不觉写博客已经半个月了&#xff0c;涨了164个粉丝&#xff0c;在一边分享笔记的过程&#xff0c;一边收获粉丝&#xff0c;感觉很开心也很幸福&#xff0c;希望看我博客的小伙伴都能有所收获&#xff0c;大家共同成长进步&#xff0c;好拉&#xff0c;话不多说&#xff…

hcip实验6:BGP综合实验

实验拓扑&#xff1a; 实验配置&#xff1a; ip地址配置&#xff1a; #R1 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 12.1.1.1 24 [R1-GigabitEthernet0/0/0]int l0 [R1-LoopBack0]ip add 172.16.0.1 32 [R1-LoopBack0]int l1 [R1-LoopBack1]ip add 192.168.1.1 24#R2…

回归预测 | Matlab实现GA-LSSVM遗传算法优化最小二乘支持向量机多输入单输出回归预测

回归预测 | Matlab实现GA-LSSVM遗传算法优化最小二乘支持向量机多输入单输出回归预测 目录 回归预测 | Matlab实现GA-LSSVM遗传算法优化最小二乘支持向量机多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 Matlab实现GA-LSSVM遗传算法优化最小…

【RAG论文】RAG中半结构化数据的解析和向量化方法

论文简介 论文题目&#xff1a; 《A Method for Parsing and Vectorization of Semi-structured Data used in Retrieval Augmented Generation》 论文链接&#xff1a; https://arxiv.org/abs/2405.03989 代码: https://github.com/linancn/TianGong-AI-Unstructure/tree/m…

阮怀俊参与五龙乡黄沙村村企联办“强村公司”

为走好海岛县高质量发展共同富裕特色之路&#xff0c;探索村级集体经济发展新路径、扶持新模式、运行新机制&#xff0c;嵊泗县五龙乡黄沙村股份经济合作社与杭州山舍乡建乡村产业发展有限责任公司联办成“强村公司”。 创始人阮怀俊表示&#xff0c;双方就融合乡域发展和文旅产…

Linux 操作系统MySQL 数据库1

1.MySQL 数据库 数据库是“按照数据结构来组织、 存储和管理数据的仓库”。 是一个长期存储在计算机内的、 有组织的、 可共享的、 统一管理的大量数据的集合。 它的存储空间很大&#xff0c; 可以存放百万条、 千万条、 上亿条数据。 但是数据库并不是随意地将数据进行…

python如何单步调试

Python怎么单步调试&#xff1f;下面给大家介绍一下单步调试&#xff1a; 方法一&#xff1a;执行 python -m pdb myscript.py (Pdb) 会自己主动停在第一行。等待调试&#xff0c;这时你能够看看帮助。 方法二&#xff1a;在所调试程序的开头中&#xff1a;import pdb 并在你…

MySQL中逗号分隔字段查询方法

MySQL中逗号分隔字段查询 select * FROM th_work_gand_up where FIND_IN_SET(11,lane_code) ; select * from th_work_gand_up where lane_code regexp (^|,)(11|1)(,|$);

金融业开源软件应用 管理指南

金融业开源软件应用 管理指南 1 范围 本文件提供了金融机构在应用开源软件时的全流程管理指南&#xff0c;对开源软件的使用和管理提供了配套 组织架构、配套管理规章制度、生命周期流程管理、风险管理、存量管理、工具化管理等方面的指导。 本文件适用于金融机构规范自身对开…

HDFS- DataNode磁盘扩缩容

HDFS- DataNode磁盘扩缩容 背景: 缩减/增加节点磁盘 方案介绍: 采用hdfs dfsadmin -reconfig 动态刷新配置实现,不停服扩缩容。 注意事项: 请在进行缩容之前,务必了解实际的数据量,并确保磁盘有足够的空间来容纳这些数据。还需要考虑未来的使用需求,要预留一定数量的空间…

Jboss 反序列化 CVE-2017-12149

一、漏洞简介 JBoss是一个管理EJB的容器和服务器&#xff0c;支持EJB 1.1、EJB 2.0和EJB3的规范。在/invoker/readonly路径下&#xff0c;攻击者可以构造序列化代码传入服务器进行反序列化,由于没有对反序列化操作进行任何检测&#xff0c;导致攻击者可以执行任意代码。 而jbo…

chmod -R 777 / 抢救,看这篇就够了

chmod -R 777抢救全过程记录 背景 在两台Ubuntu 20.04的服务器上错误执行了chmod -R 777 /命令&#xff0c;结果非常酸爽&#xff0c;sudo权限失效&#xff0c;而且ssh也没有用了。在经过了10多个小时的踩坑以后最后在不重装系统的情况下解决了问题&#xff0c;以下记录只记录…

C++ requires关键字简介

requires 是 C20 中引入的一个新关键字&#xff0c;用于在函数模板或类模板中声明所需的一组语义要求&#xff0c;它可以用来限制模板参数&#xff0c;类似于 typename 和 class 关键字。 requires关键字常与type_traits头文件下类型检查函数匹配使用&#xff0c;当requires后…

Selenium操作对象的方法汇总(如click/clear/submit/sendKeys/getText/getSize等)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

景源畅信:抖音小店的商品怎么同步到橱窗?

在数字营销的海洋中&#xff0c;抖音小店与橱窗的同步操作无疑是商家们关注的焦点。这不仅能增加商品的曝光度&#xff0c;还能提高交易的可能性。那么&#xff0c;如何将抖音小店的商品同步到橱窗呢? 一、核心步骤解析 要实现商品从抖音小店同步到橱窗&#xff0c;你需要确保…

Windows快速部署DCNv4(成功版)

文章目录 一、介绍二、编译DCNv42.1 下载源码2.2 编译DCNv4 三、报错提示3.1 Cuda is not available3.2 需要Microsoft Visual C 14.0 一、介绍 论文链接&#xff1a;[https://arxiv.org/pdf/2401.06197.pdf] (https://arxiv.org/pdf/2401.06197.pdf)   在这篇文章中介绍了一…

UnitTest / pytest 框架

文章目录 一、UnitTest框架1. TestCase使用2. TestSuite 和 TestRunner3. TestLoader4. Fixture装置5. UnitTest断言1. 登录案例 6. 参数化1. parameterized插件 7. unitTest 跳过 二、pytest 框架1. 运行方式3.读取配置文件(常用方式) 2. pytest执行用例的顺序1. 分组执行(冒烟…

基于springboot+vue+Mysql的校园闲置物品租售系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

Multisim 14单管放大电路静态分析

multisim multisim&#xff0c;即电子电路仿真设计软件。Multisim是美国国家仪器&#xff08;NI&#xff09;有限公司推出的以Windows为基础的仿真工具&#xff0c;适用于板级的模拟/数字电路板的设计工作。它包含了电路原理图的图形输入、电路硬件描述语言输入方式&#xff0…

【优选算法】——双指针——15. 三数之和

目录 1.题目 2.解法&#xff08;排序双指针&#xff09;&#xff1a; 算法思路&#xff1a; 3.代码实现 1.题目 15. 三数之和 提示 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足…