OS复习笔记ch7-1

2024-05-28 23:12
文章标签 笔记 复习 os ch7

本文主要是介绍OS复习笔记ch7-1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

存储的基本管理需求

重定位

重定位(Relocation):需要解决可执行文件中地址(指令和数据)和内存地址的对应。

一般有两种比较常见的重定位方式:

  • 静态重定位(static relocation):当程序被装入内存时,一次性实现逻辑地址到物理地址的转换,以后不再转换。
    • 缺乏保护,可能会被其他程序非法访问
    • 运行时无法再次定位:无法移动、对换
  • 动态重定位(Dynamic Relocation):在程序运行过程中要访问内存时再进行地址变换
    • 需要硬件支持
    • 需要OS参与

重定位是一个比较有意思的话题,在操作系统和计算机组成原理,甚至编译原理、汇编原理都会提到。简单地说,就是把我们代码中数据和指令的相对地址重新定位到实际内存地址,后面也会涉及到。

保护

即:未经许可,进程不能访问其他进程的内存位置(范围保护)

不过,在编译时不可能检查绝对地址,只能在运行时检查。


原因很简单,因为编译的时候我们拿不到实际的绝对地址,只有在实际运行的时候才会有,一般编译是得到机器代码,链接是得到逻辑地址,装入的时候才会确定实际的物理地址。

共享

即:允许多个进程访问同一内存区域(代码、数据)
举一个很简单的例子,绝大多数OS都有的剪贴板。当你复制了一份内容,你可以粘贴到微信,也可以粘贴到WPS甚至任何可以读取它的进程。

逻辑组织

逻辑组织可以看成是一种线性组织,一般是程序员自己为了模块化编程的需要组织起来的,所以称之为“逻辑”组织。有以下几个特点

  • 有一些模块可以修改,有些不能(类似int和const int)
  • 不同模块提供的保护不同(类似private和protected)
  • 进程之间共享模块(类似公共的函数/数据区)
  • 分段存储有助于逻辑组织(比如常见的代码段、数据段等)

物理组织

物理组织的话至少就有两个层次:主存和辅存。之前学习过组原的朋友都知道,主存一般指的内存,而辅存指的是外存。
如果OS的物理组织不好,程序、数据可用内存不足,搞不好就会卡死,甚至蓝屏。
对于后端程序员来说由于内存不可见,编程的时候粗心可能就会导致服务器内存泄漏,最后宕机。

内存划分

固定分区

等大分区:
内存被切成一个个相同大小的块

  1. 程序太大,无合适分区(一份米饭男生不够吃)
  2. 内存利用率不高(同样一份米饭女生吃不完)
  3. 内碎片问题严重(每个分区利用不全,产生内部碎片)

不等分区:
小程序放入小分区,减少内碎片;大程序放入大分区,避免无法分配。
在算法实现上变得更加复杂,需要选择合适的放置算法。此外,还有一些遗留问题:

  1. 活动进程的数目受限于系统
  2. 大量小进程无法有效利用空间

动态分区

按需分配,整体上提高了利用率

  • 根据程序的运行的情况动态分区,每段内存按照程序需求的
  • 分区与分区之间的外碎片的数量很多,虽然每一个占用空间不多,浪费也不少
    →这时候就有了压缩技术,把已分配的分区向一个方向移动,将外碎片压缩。为了提高效率,还可以在分区的起始和截止地方存储分区的信息

然后,让我们来了解一下动态分区的放置算法

  1. 最佳适配算法
    image-20231009083950375

时间效率低下,由于要维护地址空间链表(B+树),每次放置之后由于需要再次排序导致复杂度高。并且由于像41KB这种不好分配的内存,可能会导致碎片更碎。

  1. 首次适配算法
    image-20231009084357227
    每次从头开始寻找第一个足够大的分区,前端重复搜索,后端空闲较多
  2. 循环首次适配算法

image.png
每次从上次放置位置往后扫描第一个满足的内存分区,最大的分区容易被分割,需要压缩来获得新的大分区。
4. 最坏适应算法(worst-fit):找到最大的空闲分区
基本不留下小空闲分区,但较大的空闲分区不被保留。
5. 快速适应算法(quick-fit):为常用长度的空闲区建立单独的空闲区链表
可快速找到所需的空闲区,但是归还时合并复杂

看一个例子
image.png
如图所示,我们此时需要16M的内存,first-fit从上往下找到第一个满足的分区(指向22M的分区),best-fit找到最接近的分区(指向中间18M分区),而next-fit找到上次分配指针之后的第一个满足的分区(指向36M分区)。

还有一种基于伙伴系统的分区算法,简单了解即可
image.png

image-20231009085720727

重定位

  • 程序加载后实际(绝对)内存地址才确定
  • 进程可能占据不同分区,即执行期间有不同绝对内存地址

首先了解一下几个概念,学过汇编的应该都知道

  • 逻辑地址:与当前数据分配到的物理内存地址无关的访问地址
  • 相对地址:表示为相对某个已知点的地址
  • 物理或绝对地址:主存中的绝对地址或实际位置
  • 地址映射:将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址。

重定位图示如下
image.png
这里的重定位就像是组原的基址变址寻址。图中有一个基址寄存器,记录了开始地址,还有界限寄存器记录了结束地址。当进程加载或换入时设置寄存器值,程序传入相对地址,OS通过“基址+相对地址=绝对地址”计算出实际地址同界限寄存器值比较,如果越界就发生中断,反之去内存找数据。

这篇关于OS复习笔记ch7-1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

python中os.stat().st_size、os.path.getsize()获取文件大小

《python中os.stat().st_size、os.path.getsize()获取文件大小》本文介绍了使用os.stat()和os.path.getsize()函数获取文件大小,文中通过示例代... 目录一、os.stat().st_size二、os.path.getsize()三、函数封装一、os

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi