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

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

推荐

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

 前言:

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

​​


一、内存管理

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.hqwc.cn/news/704780.html

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

相关文章

每周一算法:恰好经过K条边的最短路

题目描述 牛站 给定一张由 M M M 条边构成的无向图&#xff0c;点的编号为 1 ∼ 1000 1\sim 1000 1∼1000 之间的整数。 求从起点 S S S 到终点 E E E 恰好经过 K K K 条边&#xff08;可以重复经过&#xff09;的最短路。 注意: 数据保证一定有解。 输入格式 第 1 …

万字长文破解 AI 图片生成算法-Stable diffusion (第一篇)

想象一下&#xff1a;你闭上眼睛&#xff0c;脑海中构思一个场景&#xff0c;用简短的语言描述出来&#xff0c;然后“啪”的一声&#xff0c;一张栩栩如生的图片就出现在你眼前。这不再是科幻小说里才有的情节&#xff0c;而是Stable Diffusion——一种前沿的AI图片生成算法—…

「AIGC」Python实现tokens算法

本文主要介绍通过python实现tokens统计,避免重复调用openai等官方api,开源节流。 一、设计思路 初始化tokenizer使用tokenizer将文本转换为tokens计算token的数量二、业务场景 2.1 首次加载依赖 2.2 执行业务逻辑 三、核心代码 from transformers import AutoTokenizer imp…

半小时搞懂STM32知识点——UART

1.UART 1.1为什么要使用UART这种协议?介绍一下UART及其特点 成本低&#xff0c;硬件简单&#xff0c;数据格式灵活&#xff1b; 低速全双工异步串行通信 1.2 UART数据帧格式&#xff1f; 起始位&#xff08;1&#xff09;&#xff0b;数据位&#xff08;5-8&#xff09; 校验位…

C语言详解:数组指针

数组指针是指针 int* p[10] 这是指针数组的写法 &#xff0c;因为【】的优先级比*高&#xff0c; 所以为了解决优先级问题&#xff0c;加&#xff08;&#xff09; int(* p)[10]&arr;//数组的地址要存起来 说明p是指针&#xff08;首先与*结合&#xff09;&#xff0c…

走进开源,拥抱开源

走进开源&#xff0c;拥抱开源 一、开源文化1.1 什么是开源1.2 为什么要开源1.3 有哪些开源协议 二、选择开源2.1 开源社区的类型与特点2.2 如何选择开源社区2.3 如何选择开源项目 三、参与开源3.1 开源社区的参与方式3.2 开源项目的参与方式 四、Apache Doris 参与示例4.1 Dor…

几个排序器的verilog及其资源占用、延时分析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 因为课题需要&#xff0c;调研了几个快速排序方法&#xff0c;并手写或者改进了若干待测试对象&#xff0c;包括记分板型冒泡排序&#xff08;这个是别人的&#xff09…

1、sql server数据库进行sql注入

靶机取自&#xff1a;墨者sql server 1、判断数据库类型 抓包知sql server&#xff0c;所以注入语句跟MySQL有些区别 2、判断注入点 “http://219.153.49.228:42514/new_list.asp?id2 ”&#xff0c;当id2 and 11时显示正确&#xff0c;id2 and 12时页面报错。 3、确定列…

基于单片机的智能安防系统设计(32+4G+WIFI版)-设计说明书

设计摘要&#xff1a; 本设计基于STM32单片机&#xff0c;旨在实现一个智能安防系统&#xff0c;主要包括烟雾和温度传感器、人体红外传感器、显示屏、按键、4G模块和WiFi模块等组件。通过这些组件的协作&#xff0c;实现了火灾检测、入侵监测、状态显示、用户交互和远程通信等…

软件工程期末复习(8)需求的表达方法和状态转换图

需求的表达方法 系统模型 需求分析的任务就是借助于当前系统的逻辑模型导出目标系统的逻辑模型&#xff0c;解决目标系统 “做什么” 的问题 通常软件开发项目是要实现目标系统的物理模型。目标系统的具体物理模型是由它的逻辑模型经实例化&#xff0c;即具体到某个业务领域而…

pytest教程-47-钩子函数-pytest_sessionfinish

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest_sessionstart钩子函数的使用方法&#xff0c;本小节我们讲解一下pytest_sessionfinish钩子函数的使用方法。 pytest_sessionfinish 钩子函数在 Pytest 测试会话结束时调用&#xff0c;…