OS复习笔记ch7-1

news2024/11/17 20:17:50

存储的基本管理需求

重定位

重定位(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通过“基址+相对地址=绝对地址”计算出实际地址同界限寄存器值比较,如果越界就发生中断,反之去内存找数据。

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

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

相关文章

《我的阿勒泰》最经典的6句话

这是首部散文影视化改编的作品,剧集里的每一帧画面,都堪比电影大作。 阿勒泰壮丽广阔的风光,如同一幅幅动人的画卷展现在我们面前,让人沉醉其中。李文秀平淡朴实的生活,却溢出了蓬勃的生命力,直击心灵。只…

Yourpassword does not satisfy the current policyrequirements

mysql 新增数据库用户失败 解决方法: 修改校验密码策略等级 set global validate_password.policyLOW;

【算法】位运算算法——只出现一次的数字Ⅱ

题解:只出现一次的数字Ⅱ(位运算算法) 目录 1.题目2.题解:3.代码示例4.总结 1.题目 题目链接:LINK 要求:时间复杂度:O(N),空间复杂度:O(1) 2.题解: 3.代码示例 class Solution {…

搜维尔科技:拒绝毒品行为能力评估与训练系统应用案例

用户名称:山西医科大学 主要产品:虚拟现实复吸风险评估与干预系统 虚拟现实复吸风险评估与干预系统主要是为了解决物质使用障碍患者在临床治疗及康复回归正常生活出现的高复发现象⸺对毒品失控的渴求难以预测控制的问题。 整套系统由软件和硬件两部分…

Llama模型家族之使用 Supervised Fine-Tuning(SFT)微调预训练Llama 3 语言模型(十) 使用 LoRA 微调常见问题答疑

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…

C++的第一道门坎:类与对象(二)

一.类中生成的默认成员函数详解 0.类的6个默认成员函数 编译器会给类生成六个默认成员函数,在类中即使我们什么都不做,也会自动生成。 默认成员函数:用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。 下面我们逐…

蓝桥杯物联网竞赛_STM32L071_18_长短按键检测

长短按键的检测是国赛题里面遇到的,省赛没出过有两种实方法 定时器配置: 定时器的话要比delay准确,其中tim7定时器的准度最高 定时器预分配配置32 - 1,计数周期是10000 - 1这样做那么32MHZ/32也就是一秒钟记录10^6的数&#xf…

数组的定义、顺序存储及特殊矩阵的存储

目录 一、数组的定义 1.1概念 1.2抽象数据类型定义 二、数组的顺序存储 2.1一维数组元素的存储位置 2.2二维数组元素的存储位置 2.3三维数组元素的存储位置 三、特殊矩阵的压缩存储 3.1相关概念 3.2对称矩阵 3.3三角矩阵 3.4对角矩阵(带状矩阵&#xff0…

Java 数据类型:学习和区分Java的基本数据类型(如int、float、boolean等)和引用数据类型(如数组、类等)

Java数据类型 Java是一种强类型语言,所有变量在使用前都必须声明其类型。Java的数据类型分为基本数据类型(Primitive Data Types)和引用数据类型(Reference Data Types)。了解并区分这两类数据类型是学习Java编程的重…

PC网游、页游、手游、端游各类游戏收集整理大集合-90%以上游戏带视频架设教程

本游戏资源提供给大家学习及参考研究借鉴美工之用,请勿用于商业和非法用途,无任何技术支持! 干货列表

如何将RK R75键盘的右Alt键改为Ctrl键

打开注册表地址栏中输出 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout右键新建二进制值,名称设为ScanCode Map按下图输入数值

什么是知识中台?为什么企业需要知识中台?

如今市面上的企业数不胜数,企业的任何一个小细节都会产生很大的影响。近几年来一直很热门的知识中台备受企业关注。关于如何高效地管理、整合和运用知识,成为了每一家企业都在重点关注的问题。而知识中台,就是为了解决这一问题而诞生的一个全…

软件功能测试的类型和流程分享

在现代社会,软件已经成为人们生活中不可或缺的一部分,而在软件的开发过程中,功能测试是不可或缺的环节。软件功能测试指的是对软件系统的功能进行检查和验证,以确保软件在各种情况下能够正常运行,并且能够按照用户需求…

【设计模式】JAVA Design Patterns——Circuit Breaker(断路器模式)

🔍目的 以这样一种方式处理昂贵的远程服务调用,即单个服务/组件的故障不会导致整个应用程序宕机,我们可以尽快重新连接到服务 🔍解释 真实世界例子 想象一个 Web 应用程序,它同时具有用于获取数据的本地文件/图像和远程…

车载网络测试实操源码_使用CAPL脚本模拟发送符合协议要求(Counter和CRC)的CAN报文

系列文章目录 车载网络测试实操源码_使用CAPL脚本解析hex、S19、vbf文件 车载网络测试实操源码_使用CAPL脚本对CAN报文的Counter和CRC进行实时监控 车载网络测试实操源码_使用CAPL脚本模拟发送符合协议要求(Counter和CRC)的CAN报文 车载网络测试实操源码_使用CAPL脚本实现安全…

如何在Spring Boot中整合PageHelper实现分页功能

1.前言 在开发web应用程序时,经常会遇到需要对数据库中的数据进行分页查询的情况。为了简化分页查询的实现过程,我们可以利用PageHelper这个优秀的分页插件来实现分页功能。本文将介绍如何在Spring Boot项目中整合PageHelper,并演示如何使用它…

docker和containerd的区别

docker和containerd的区别 1、容器运行时 1.1 容器运行时概念 容器运行时(Container Runtime)是一种负责在操作系统层面创建和管理容器的软件工具或组件。它是容器化技术的核心组件之一,用于在容器内部运行应用程序,并提供隔离…

零基础,想做一名网络安全工程师,该怎么学习?

​ 相比IT类的其它岗位,网络工程师的学习方向是比较明亮的。想要成为网络工程师,华为认证就是最好的学习方法。而网络工程师的从零开始学习就是从华为认证的初级开始学起,也就是HCIA,也就是从最基本的什么是IP地址、什么是交换机这…

IDEA2024创建maven项目

1、new->project 2、创建后展示 3、生成resources文件夹 4、测试--编写一个hello文件

STM32——定时器

一、简介 *定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 *16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 *不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入…