操作系统复习3.1.0-内存

news2024/12/23 0:32:27

内存

程序是由内存放到CPU才可处理,前面一直有提到外存、内存,外存I/O速度十分慢,而内存I/O速度快,CPU I/O速度也快。
因此内存是缓和外存和CPU间I/O速率差异问题
为区分并发环境下程序数据存放地方,就给内存的存储单元编址,单位为存储单元
按字节编址,每个存储单元为1字节,1B,8bit
按字编址,每个存储单元为1字,16bit

2^10 = 1 k
2^20 = 1 M
2^30 = 1 G

进程运行基本原理

指令结构

在这里插入图片描述
操作码+取数据地址+存数据地址,这里给出了实际物理地址,实际上应为逻辑地址

逻辑地址和物理地址

绝对地址就是物理地址,相对地址就是逻辑地址,如起点为101110,101111则为下一个单元的物理地址,相对地址写为N+1

写程序到程序运行

编译–>链接–>装入

编译

编译程序将用户源代码编译成若干个目标模块 (高级语言–>机器语言)

链接

链接程序将目标模块与所需库函数链接在一起,形成完整的装入模块

装入/装载

装入程序 将装入模块装入内存运行

程序装入内存

装入模块中的指令地址变成相对地址,有三种装入方式:绝对装入、静态重定位、动态重定位

绝对装入

得知程序放入内存位置,编辑程序产生绝对地址的目标代码,但实际上不可能,因为这只适用于单道程序环境

静态重定位

编译、链接后的装入模块的地址都从0开始,地址都为逻辑地址,装入时对地址进行重定位,将逻辑地址转换为物理地址
但缺点在必须要内存有能够完整装入作业的空间,运行期间也不能再移动和申请内存空间

动态重定位

动态运行时装入,编译、链接后的装入模块的地址都是从0开始的,当程序要真正执行时才进行地址转换,由于装入内存时的地址为逻辑地址,这是需要个重定位寄存器,用于记录模块存放的起始地址

程序运行前只需装入部分代码,并可将程序分配到不连续的存储区中,运行时动态申请分配内存,允许程序在内存中移动

链接的三种方式

静态链接:装入前将所有模块和对应的库函数连接成一个完整的可执行模块
装入时动态链接:将各目标模块装入内存时,边装入边链接
运行时动态链接:执行时需要目标模块时才进行链接

内存管理

内存空间分配和回收

操作系统负责内存空间分配和回收,记录哪些内存区域分配出去了,判断哪些内存可被回收和如何回收

单一连续分配

在这里插入图片描述

在此方式下,内存分为系统区和用户区
系统区位于内存的低地址部分,用于存放操作系统相关数据
用户区位于内存的高地址部分,用户程序独占整个用户区空间
内存中只能有一道用户程序

优点:实现简单,不存在外存碎片,可采用覆盖技术扩存,不一定需要内存保护
缺点:只能用于单用户、单任务的操作系统中,会有内存碎片,内存利用率不高

固定分配

在这里插入图片描述
按比例分区,若干个固定大小的分区,每个分区只装入一道作业,但内存利用率依旧不高
系统利用分区说明表,记录分区的分配状态来管理
优点:实现简单,无外部碎片
缺点:大小已经被定好,只能使用覆盖解决,但牺牲性能
产生内部碎片

动态分区分配

在这里插入图片描述
不预先分配,根据进程大小动态建立分区,产生外部碎片,产生某些空闲分区过小而难以利用,需要通过拼凑解决外部碎片

系统通过空闲分区表/空闲分区链
空闲分区表:记录分区大小,起始地址,状态
空闲分区链:每个分区起始部分和末尾部分分别设置前后指针,并记录分区大小

这里就涉及了如何选择空闲分区和回收分区的方法了

内存分配

连续分配和非连续分配

空闲内存的管理

空闲分区表:从被选择的空闲分区首地址起分配,若仍有空闲则更新表项起始地址和大小,否则就直接删除表项
空闲分区链则雷同

首次适应 First Fit

每次从低地址开始查找,使用第一个符合的空闲分区
低地址部分会产生很多空闲分区

最佳适应 Best Fit

优先使用更小的,符合的空闲分区
但这造成了产生外部碎片,且是十分难利用的碎片

最坏适应 Worst Fit

优先使用更大的,符合的空闲分区
解决了内存碎片问题,但大进程进入时,无法被放入

邻里适应 Next Fit

每次开始查找适合的空闲分区时,从上一次查询结束处开始,形成循环
解决首次适应造成的低地址部分产生难以利用的内存碎片,且减少了每次都需要从头开始的查找开销
在这里插入图片描述

内存回收

空闲分区表:合并到邻接的空闲区,并更新对应分区的大小,若没有邻接的则增加表项,记录对应数据
空闲分区链则雷同

内存空间拓展

通过虚拟技术,在逻辑上拓展内存空间

覆盖技术

程序大小超过物理内存总和时需要使用覆盖技术
将程序分段,常用的段常驻内存,不常用的段在需要时调入内存
内存中分为一个固定区和若干个覆盖区
常驻内存的段放在固定区,调入后不再调出
不常用的段放在覆盖区,需要时调入,不需要时调出
在这里插入图片描述
由程序员声明覆盖结构,操作系统自动完成覆盖,增加编程负担,已被废弃

交换技术

内存空间紧张时,系统将内存中某些进程暂时换出外存,外存中某些已具备运行条件的进程换入内存,前面提及的中级调度就是,将内存中的进程放入外存,处于挂起态

磁盘空间分区为文件去和对换区
文件区主要用于存放文件,追求存储空间的利用率,对文件区空间的管理采用离散分配方式
对换区只占磁盘空间小部分,被换出的进程数据就存放在对换区。
对换区的速度影响系统整体速度,因此为了追求换入换出速度,采用连续分配方式,对换区的I/O比文件去的更快
交换通常发生在内存紧张时,不紧张时则停止
优先换出阻塞、优先级低的进程,考虑驻留时间等…
如前面提到的,PCB一直在内存中

虚拟存储技术

地址转换

逻辑地址和物理地址转换

内存保护

保证进程在各自存储空间内运行,互不干扰

  • cpu中设置一对上下限寄存器,记录进程的上下限地址,当进程访问地址时,进行越界检查
  • 重定位寄存器和界地址寄存器,前者存放进程的起始物理地址,后者存放最大逻辑地址

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

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

相关文章

前端 js 栈内存和堆内存 基本数据类型和复杂数据类型的区别?

前端 js 栈内存和堆内存 基本数据类型和复杂数据类型的区别? 先了解一下JavaScript 数据类型有哪些? javaScript 中有8种基本的数据类型:7种为基本数据类型,而Object 为复杂数据类型 基本数据类型(原始数据类型&#…

OpenMMLab-AI实战营第二期-人体关键点检测与MMPose

人体关键点检测与MMPose 课程链接:https://www.bilibili.com/video/BV1kk4y1L7Xb 这个课程的大致内容是介绍如何从给定的二维影像中恢复出人体的姿态(2D或者3D),大纲如下所示,基本上可以认为流程是:先是恢…

Spring Boot 日志配置(Slf4j)

SLF4J与Logback简介 Java日志框架众多,常用的有java.util.logging, log4j, logback,commons-logging等。 SLF4J (Simple Logging Facade For Java),它是一个针对于各类Java日志框架的统一Facade抽象。SLF4J定义了统一的日志抽象接口&#x…

Linux命令学习之pwd和ls

pwd pwd是查看当前所在目录的命令。 可以看到当前所在目录是/root。在这里需要注意/是根目录,是所有其他目录的父节点,/root目录是root用户的家(home)目录,这是两个不同的目录。 man pwd可以看一下pwd的帮助&#xf…

Power BI 如何生成动态指标散点图

前言 本文介绍如何在Power BI中创建动态散点图,可以自由切换X轴和Y轴的指标。 数据下载: 使用的是CSDN后台的单篇文章分析数据,在“作品数据”页点击“导出数据”。 因为都是累计值,所以用了两天的数据,手动添加…

[数据挖掘02] pandas的分配和聚合函数

一 说明 窗口函数是什么?窗口函数是时间序列的局部属性处理函数,比如,一维卷积滤波、移动平均、指数平均本篇我们将针对pandas对象的窗口函数展开讨论,并以示例展示他们的概念实质。 二 窗口函数、分组函数( GroupBy …

大语言模型速查表;ChatGPT发展路线图;11条市场营销ChatGPT Prompt;使用Midjourney制作专属头像 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 大语言模型速查表 Large Language Model Cheat Sheet ShowMeAI知识星球资源编码:R115 本份速查表的制作目的,是…

Linux4.2LAMP

文章目录 计算机系统5G云计算第一章 LINUX LAMP一、概述二、编译安装Apache httpd服务1.关闭防火墙,将安装Apache所需软件包传到/opt目录下2.安装环境依赖包3.配置软件模块4.编译及安装5.优化配置文件路径,并把httpd服务的可执行程序文件放入路径环境变量…

LInux-文本处理相关命令笔记

目录 文本处理相关命令正则表达式介绍BRE和ERE seqxargs常用选项常用使用方法 uniq介绍常见选项常见使用方法实例 tr常用选项常见使用方法能转换的原因 grep常见选项grep -v 选项 -v和[^..]的区别 常见使用方法使用 总结 cut介绍使用 sort介绍语法参数 使用去重 排序原则按字典…

HarmoneyOS入门--下载与安装DevEco Studio运行helloworld

下载与安装DevEco Studio 在HarmonyOS应用开发学习之前,需要进行一些准备工作,首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 下载DevEco Studio 下载完成后,双击下载的“deveco-studio-xxxx.exe”,进入DevEco S…

chatgpt赋能python:Python创建空变量的方法

Python创建空变量的方法 Python是一种非常受欢迎的编程语言,因为它易于学习和使用,并且具有动态语言的特点。不管你是新手还是有经验的开发人员,你肯定会经常遇到需要创建空变量的情况。在这篇文章中,我们将探讨Python中创建空变…

AI对话交互场景使用WebSocket建立H5客户端和服务端的信息实时双向通信

WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。 一、为什么需要 WebSock…

设计模式之~工厂系列(简单工厂、工厂方法、抽象工厂)

目录 简单工厂模式 工厂方法模式 简单工厂 VS 工厂方法 抽象工厂模式: 拓展: 利用简单工厂模式优化抽象工厂 利用反射抽象工厂 进行优化 反射配置文件抽象工厂进行优化 简单工厂模式 优点:简单工厂模式的最大优点在于工厂类包含…

Arthas-JVM相关命令使用

tip:作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。 开头: 我们先说下生产使用频率较高的有哪些:dashboard、heapdump、jvm…

【mqtt】MQTT安装与入门案例

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍MQTT的c版本入门。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习知识,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路&…

java高频面试题

集合 前言 时间复杂度 时间复杂度是用来来评估代码的执行耗时的,大O表示法:不具体表示代码的真正执行时间,而是表示代码执行时间随数据规模增长的变化趋势。 当n很大时,低阶、常量、系数并不能影响其增长趋势,因此可以…

压缩感知重构之广义正交匹配追踪法

算法的重构是压缩感知中重要的一步,是压缩感知的关键之处。因为重构算法关系着信号能否精确重建,国内外的研究学者致力于压缩感知的信号重建,并且取得了很大的进展,提出了很多的重构算法,每种算法都各有自己的优缺点&a…

RFID在工业自动化产线工艺中的应用

RFID在工业自动化产线工艺中的应用 随着工业自动化技术的不断发展,RFID(Radio Frequency Identification)技术在自动化产线数据采集方面得到了广泛应用。RFID技术是一种通过电磁波进行无线通信和识别的技术,它可以对物品进行追踪…

电子器件系列39:反激式变压器

反激式(Flyback)变压器又称单端反激式或Buck-Boost转换器。因其输出端在原边绕组断开电源时获得能量故而得名。反激式变换器以其电路结构简单,成本低廉而深受广大开发工程师的喜爱。 反激式变压器适合小功率电源以及各种电源适配器。但是反激式变换器的设计难点是变…

Oracle中的数据导出(1)

目录 1、基本语法: 2、操作步骤 3、spool作用 SPOOL命令的使用 在 Oracle 中,SPOOL 是一条 SQLPLUS 命令,用于将执行 SQL 脚本的输出结果保存到指定文件中。SPOOL 命令可以帮助用户快速导出查询结果、生成报表等常见任务。 1、基本语法&…