哈工大李治军老师OS课程笔记(4)——内存管理

news2024/9/22 11:28:05

一 内存使用与分段(实验六)

内存是如何用起来的?
内存使用:将程序放在内存中,PC指向开始地址

重定位:修改程序中的地址(是相对地址)

在这里插入图片描述
什么时候完成重定位?
编译时加基址
缺点:编译的时候就得知道哪段内存是空闲的,但是在实际的系统中很难做到,比如编译的时候1000处是空闲的,但是执行的时候就不一定了。
载入时加基址更灵活

  • 编译时重定位的程序只能放在内存固定位置
  • 载入时重定位的程序一旦载入内存就不能动了

编译是将源代码转换为可执行代码的过程。它包括以下步骤:
1.词法分析:将源代码分解为词法单元(tokens),如标识符、关键字、运算符等。
2.语法分析:根据语法规则将词法单元组织成语法树(syntax tree)。
3.语义分析:检查语法树的语义正确性,进行类型检查和语义规则验证。
4.中间代码生成:生成中间表示形式,如抽象语法树(AST)或中间代码。
5.优化:对中间代码进行优化,提高程序的性能和效率。
6.目标代码生成:将优化后的中间代码转换为目标机器的汇编代码或机器代码。
编译器负责执行以上步骤,将源代码转换为可执行代码或可加载的目标文件。编译产生的目标文件可能包含可执行代码、库函数、符号表等。

加载是将目标文件或可执行代码加载到内存中并执行的过程。它包括以下步骤:
1.内存分配:为程序分配足够的内存空间,包括代码段、数据段、堆和栈等。
2.符号解析:解析目标文件中的符号表,建立符号与内存地址之间的关联。
3.重定位:如果目标文件中存在地址引用,进行地址修正,将相对地址转换为实际的内存地址。
4.加载到内存:将目标文件的代码和数据加载到相应的内存段中。
5.初始化:执行程序的初始化代码,如全局变量的初始化、运行时库的初始化等。
6.执行:跳转到程序的入口点,开始执行程序的指令。
加载器(Loader)负责执行以上步骤,将目标文件加载到内存中并启动程序的执行

重定位最合适的时机——运行时重定位
进程再执行过程中会发生变化,不一定每次执行都放在同一块内存空间,程序的基址存放在PCB中。当一次运行时程序被放在内存1000的位置,PCB中的base为1000,换出再换入到地址2000的地方,PCB中的base为2000。执行指令时第一步 先从PCB中取出这个基地址。基地址加上程序中的逻辑地址就得到了这条指令真正的物理地址。
在这里插入图片描述
找到空闲内存,将这段空闲程序基地址放到PCB中,然后将程序放入空闲内存

分段

在编译过程中,源代码会经过一系列的编译器处理,其中的一个重要步骤是将源代码转换为可执行的机器代码。这个过程中,编译器会将程序按照功能或作用划分为不同的段,通常包括代码段、数据段和堆栈段。

1.代码段(Code Segment):
代码段包含程序的指令(机器代码),用于执行程序的操作。在程序执行时,代码段会被加载到内存中,并按照指令的顺序依次执行。
2.数据段(Data Segment):
数据段存储程序的静态变量和全局变量等数据。这些变量在程序运行过程中会保持不变,存储在数据段中的数据在整个程序执行期间都是可访问的。
3.堆栈段(Stack Segment):
堆栈段用于存储程序执行期间的局部变量、函数调用信息和函数返回地址等。每当程序调用函数或进入一个新的作用域时,相关的数据会被压入堆栈中,当函数返回或作用域结束时,相关数据会被弹出。堆栈的管理由程序在运行时负责

分段符合用户观点:用户可独立考虑每个段(分治)
在这里插入图片描述
在这里插入图片描述

操作系统对应的段表就是GDT表,每个进程对应的段表是LDT表。段表形式如下图所示:
在这里插入图片描述

把程序分成多个段,在内存中找到空闲的地方,把段放进去,记录这个段在内存中的基址放入LDT表,把LDT表中赋给PCB,将PC指针设为程序初值,每次取值执行都去查LDT表,根据LDT表找到该条指令的基址,再加上程序中的偏移地址获得该条指令的物理地址。在这里插入图片描述
内存使用三部走:分段+找空闲分区+映射表

二、内存分区与分页

1、内存分区

一个程序分成多个段(编译干的事儿),在内存中找到一个空闲区域(算法数据结构),通过磁盘读写把程序载入进来(设备驱动),建立映射表和PCB关联(进程管理)
在这里插入图片描述

如何找出一段空闲的分区?内存怎么分割?
可变分区的管理过程
在这里插入图片描述

首先适配(350,150)速度快 O(1)
最佳适配(200,50) 碎片多
最差适配(350,150)O(n)

2、内存分页

物理内存要使用分页

内存碎片太太多,将空闲分区合并,这个时候需要移动内存,这个操作叫内存紧缩,在这个过程中,计算机中其他进程也无法运行。内存紧缩需要花费大量的时间,如果复制速度1M/1秒,则1G内存的紧缩时间为1000秒。内存紧缩管理内存碎片太消耗时间了,在实际情况中不可行。

让面包没有谁都不想要的碎末——将面包分成片,类比可以将内存分成页。

内存分页
针对每个段的内存请求,系统一页一页的分配给这给段。
在这里插入图片描述
将每个段分页,并编页号,将每页放入空闲的页面中,并将页框号与段页号的对应关系放入页表中,当CPU取值执行时,根据页表和程序中的偏移地址找到该条指令的物理地址。
在这里插入图片描述

通常,计算机存储中的 “K” 表示 1024,即 1K = 1024 字节。因此,12K 表示 12 * 1024 字节,即 12,288 字节。接下来,将 12,288 转换为十六进制。12,288 的十六进制表示为 0x3000。因此,将 12K 转换为十六进制为 0x3000。

三、多级页表与快表

32位地址空间+4K页面+页号必须连续 => 2^20个页表项 => 大页表占用内存,造成浪费。

如果用一个变量标识该页有没有使用,用到的逻辑页才有页表项,页表中的页号不连续,就需要比较、查找、折半,降低效率。如果页表连续,只需要一次查找就能找到需要的页。

既要连续又要让页表占用内存少,怎么办?

多级页表 页目录表+页表

多级页表提高了空间效率,使用快表提高效率

四、 段页结合的内存管理

段页同时存在:段面向用户/页面向硬件。虚拟内存是一块地址空间
页表是一个数据结构,用于存储虚拟地址和物理地址之间的映射关系。页表中的每一项存储了一个虚拟页号到物理页框号的映射。
在这里插入图片描述

虚拟内存是计算机操作系统中的一种技术,它提供了一种抽象的、相对较大的内存空间,使得程序可以访问比物理内存更大的地址空间。虚拟内存的主要目的是扩展计算机系统的内存容量,使得运行大型程序和处理大量数据时更加高效。它通过将物理内存和硬盘上的存储空间结合起来,创建一个逻辑上连续且更大的地址空间供程序使用。

在虚拟内存的机制下,每个程序都被分配了一块连续的虚拟内存空间,该空间被划分为固定大小的块,称为页面(或页)。物理内存也被划分为与页面大小相同的块,称为物理页面(或页框)。当程序需要访问虚拟内存中的某个页面时,操作系统会将该页面从硬盘加载到物理内存中的一个空闲页框中,并建立虚拟内存与物理内存之间的映射关系。虚拟内存的使用带来了以下几个主要的好处
1.内存扩展:虚拟内存使得程序能够使用比实际物理内存更大的地址空间,从而能够运行更大的程序或处理更多的数据。
2.内存隔离:每个程序都有自己独立的虚拟内存空间,相互之间不会干扰。这提供了更好的安全性和稳定性,一个程序的崩溃不会影响其他程序的运行。
3.虚拟内存管理:操作系统负责管理虚拟内存和物理内存之间的映射关系,根据程序的需求进行页面的加载和卸载。它可以将不常用的页面置换(交换)到硬盘上,从而释放物理内存供其他程序使用。
4.内存保护:虚拟内存允许操作系统为每个页面设置访问权限,例如只读、读写、执行等。这样可以防止程序对其它程序或操作系统的内存空间进行非法访问。

地址翻译
在这里插入图片描述
段页式内存下程序如何载入内存:

  • 找到空闲段
  • 把段程序“假装”放在虚拟内存上,建立段表
  • 在物理内存中找空闲页
  • 建立页表
  • 利用重定位使用内存

五、 内存换出换出

1、内存换入——请求调页

没有换入换出,虚拟内存实现不了。
用换入换出实现“大内存”
在这里插入图片描述
假设虚拟内存有4G大小,但是对应的实际物理内存只有1G大小,如何给用户大内存的感觉呢?

在这里插入图片描述
将虚拟内存比作仓库,物理内存比作门店
缺页引起内存的换入

2、内存换出

算法评价准则:缺页次数

(1)FIFO

(2)MIN算法

选择最远将使用的页淘汰

(3)LRU页面置换

用过去的历史预测将来。LRU:选最近最长一段时间没有使用的页淘汰(最近最少使用)。
实现方法

  • 时间戳,每页维护一个时间戳,选具有最小时间戳页淘汰。
    缺点:每次地址访问都需要修改时间戳,需要维护一个全局的时钟,找到最小值,实现代价较大。
  • 维护一个页码栈
    在这里插入图片描述

每次地址访问都需要修改栈(修改10次左右栈指针),实现代价大。

LRU近似实现 ——clock算法

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

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

相关文章

航空航天之归零报告

归零报告 1.技术归零报告1.1技术归零报告模板1.2撰写技术归零报告注意事项 2.管理归零报告2.1管理归零报告模板2.2撰写管理归零报告注意事项 归零报告通常指的是将项目、任务或系统的状态重置为初始状态,进行数据清零、状态复位或问题总结的报告文档。 在航空航天、…

spring揭秘02-springbean生命周期(实例化过程)

文章目录 【README】【1】spring构建应用系统分2个阶段【1.1】spring容器启动阶段【1.2】springbean实例化阶段 【2】springbean生命周期概述【3】springbean生命周期过程【3.1】**第1步-实例化bean对象**【3.2】**第2步-设置对象属性**【3.3】 第3步-检查Aware接口并设置相关依…

深入理解计算机系统 CSAPP 实验lab:Attack Lab

资源下载地址:CS:APP3e, Bryant and OHallaron CTARGET objdump -d ctarget >ctarget.txt 反汇编我们下载的ctarget打开看看 touch1: 我们期望的是getbuf执行完之后直接跳到touch1,利用缓存区溢出达到找个目的. 汇编显示call Gets之前 sub $0x28,%rsp,栈指针减小了 0x28 …

JMeter高效管理测试数据-参数化

文章目录 1.什么是参数化2.定义变量3.CSV数据文件设置 1.什么是参数化 在JMeter中,参数化是一种常用的技术,用于使测试场景更加灵活和动态。通过参数化,你可以让JMeter在每次请求中使用不同的值,这在模拟真实用户行为或测试不同输…

【mybatis-plus@Select注解联表查询实现分页】

前言 MybatisPlus对于单表的操作很方便,但是多表查询等复杂的操作还是需要在xml中写sql语句来完成。那么,在MybatisPlus中如何实现多表联查、分页查询呢。 一、数据库表设计 我们模拟一个购物的情况,在数据库创建两个表,一个用户…

MeterSphere接口测试脚本断言

MeterSphere接口测试脚本断言 我们在接口自动化测试过程中,经常遇到无论我们传入什么数据信息,只要响应体报文中某个字段为不固定的特定信息(如:或1或2或3),就符合预期,流程就可以继续&#xf…

通过JPA映射数据库

在 JPA (Java Persistence API) 中,实体类通常通过一系列注解来配置,以便与数据库表进行映射,与Mybatis-plus在功能上,具有一定的相似性,都是持久化框架。 package com.plumcarefree.demo.entity.user; import javax.persistence.*; impor…

用Python爬取高德地图地铁站点数据——Python程序及详解

0. 准备工作 在使用以下Python程序爬取高德地图地铁站点数据前,需要先在“高德开放平台”(网站:高德开放平台 | 高德地图API)申请一个API Key。具体操作为:注册一个“高德开放平台”账号,找到右上角的控制…

ImportError: DLL load failed: 找不到指定的程序的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

mycat读写分离实现、企业架构MySQL读写分离

一、mycat读写分离实现 1. 添加一个新的虚拟主机,设置ip为10.1.1.60,主机名为mycat.yuanyu.zhangmin.关闭防火墙 SELinux NetworkManager 2. 上传jdk和mycat安装包 3. 解压并且添加到指定的位置 [rootmycat ~]# ls anaconda-ks.cfg frp initserver.sh jdk1.8.0_19…

24暑假算法刷题 | Day30 | 贪心算法 IV | LeetCode 452. 用最少数量的箭引爆气球,435. 无重叠区间,763. 划分字母区间

目录 452. 用最少数量的箭引爆气球题目描述题解 435. 无重叠区间题目描述题解 763. 划分字母区间题目描述题解 452. 用最少数量的箭引爆气球 点此跳转题目链接 题目描述 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中…

【Docker】Elasticsearch 8.12 安装与搭建

由于工作过程中硬件资源未能达到要求,现将使用 Elasticsearch 取代原 Redis MySQL Milvus 技术栈,在重新搭建的同时记录一下搭建过程(由于之前也分享过 Docker 版本 Elasticsearch 5.x 和 Elasticsearch 7.x 的部署方法,因此本文…

横看成岭侧成峰,远近高低各不同 —— 深入探讨Obfs4流量识别:特征、方法与应用

目录 引言 Obfs4流量特征 数据包大小与分布 时间间隔(IAT) 流量方向 加密特征 Obfs4流量识别方法 深度学习模型识别 示例代码 基于部分数据的多级剪枝方法 方法步骤 深度包检测与机器学习结合 应用场景 网络安全监控 Tor网络访问优化 匿…

分层神经网络(DNN)知多少?

分层神经网络作为深度学习的核心架构,已经彻底改变了我们处理复杂问题的方式。本文将带我们走进神经网络的基础知识,揭开GPT这些强大模型的神秘面纱。希望通过本文的介绍,我们不仅能够理解神经网络的基本构成,还能洞察到它们是如何…

OpenCV图像处理——轮廓的面积与弧长计算(C++/Python)

概述 轮廓面积与轮廓周长是图像分析中的两项核心统计特征,它们为理解和量化图像中的形状提供了基础。 轮廓面积:这代表了轮廓所界定区域的像素数量,是衡量区域大小的直接指标。面积的计算结果以像素平方为单位,为我们提供了一个量…

Wireshark_DNS_v7.0

Wireshark_DNS_v7.0 一、 nslookup 前置 nslookup 是一个网络命令行工具,用于查询域名系统(DNS)中的域名解析记录。通过使用 nslookup,你可以获取某个域名的IP地址,或者获取与某个IP地址关联的域名信息。 查看域名…

学校医院NTP电子钟让时间管理更加智能

在学校和医院这样的重要场所,时间的精确管理至关重要。每一分每一秒都可能关系到教学的进度、医疗的效果以及师生和患者的体验。而 NTP 电子钟的出现,为学校和医院的时间管理带来了全新的智能化变革。 一、NTP 电子钟在学校应用 NTP 电子钟,…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第五篇 文件系统构建篇-第七十八章 离线构建Yocto系统

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

【HarmonyOS】鸿蒙应用蓝牙功能实现 (一)

【HarmonyOS】鸿蒙应用蓝牙功能实现 前言 蓝牙技术是一种无线通信技术,可以在短距离内传输数据。它是由爱立信公司于1994年提出的,使用2.4 GHz的ISM频段,可以在10米左右的距离内进行通信。可以用于连接手机、耳机、音箱、键盘、鼠标、打印机…

工厂流水线MES报工一体机改善生产管理效率

作为智能制造的重要组成部分,MES系统(制造执行系统)在优化生产流程、提高生产效率、降低生产成本等方面发挥着不可替代的作用。而MES报工一体机作为MES系统的重要组成部分,更是帮助企业实现生产管理效率提升的利器。 一、MES报工一…