当前位置: 首页 > news >正文

操作系统原理 —— 内存管理的概念(十八)

为什么要有内存管理

为什么要对内存进行管理,需要解决什么问题?

要回答这个问题,首先我们需要明白:进程运行时,需放在内存才能运行。比如在执行一个程序时,需将该程序的相关数据与指令装入内存才能运行。但是内存是有限的,如果多个进程同时运行,就会出现内存不够用的情况。操作系统这时就帮我们做出抉择,并决定当前内存中应该存放哪几个进程,以及存放在内存中的什么位置。

总的来说,需要对内存进行管理的原因是:内存空间有限,不能无限使用。引入内存管理能够解决的问题:进程在内存空间中怎么放,什么时候该放哪个进程进入内存。这一过程由操作系统帮助管理。

以上内容原文链接:https://blog.csdn.net/qq_40359223/article/details/122218539

内存管理它又做了哪些事呢? 一共分了四个部分,我们接着往下看:

内存空间的分配和回收

首先内存管理主要做的事就是内存空间的分配和回收,在一个操作系统中,内存中同时存放了很多个进程,操作系统要怎么记录哪些内存被分配出去了?哪些又是空闲的状态? 开启一个新的进程,又该分配到内存中哪一块? 进程结束之前分配的内存空间又该如何回收?

这些问题都是由操作系统内存管理来实现,具体在这个章节中不详细展开来讲,只是讨论操作系统内存管理需要做哪些事。

内存空间的扩充

内存管理第二个要做的事就是对内存空间的扩充,假设目前一台操作系统它的运行内存只有 4GB 大小,但是运行了很多个程序,比如假设:QQ 使用了 500M 内存、QQ 飞车占用了 3G内存,QQ 音乐又占了 1 GB,从数据上来看,这三个进程所需要的运行内存相加是超过了计算机中 4 GB 的内存,那为什么他们三个软件还能够同时执行呢?

这个就是虚拟技术,操作系统需要提供某种技术从逻辑上对内存空间进行扩充,这也是内存管理的一部分。

地址转换

地址转换这个就比较抽象,先问大家一个问题,在多个程序运行环境下,操作系统中会有很多个程序并发的执行,也就是说会有很多个程序需要同时放到内存中,那么,如何区分各个程序的数据时放在什么地方呢?

这个就和酒店道理一样,酒店每个房间都会有编号,内存中每一个小房间叫做存储单元,如果计算机按字节编址,则每一个存储单元大小为1字节,即 8 个bit,内存地址从1开始,每一个地址对应一个存储单元。

程序经过编译、链接后生成的指令中,对应的是内存的逻辑地址,而并非内存存储空间的物理地址,所以程序在执行过程中,是需要将逻辑地址,转换成对应的物理地址,才能够最终获取到想要的数据。

那么如何将指令的逻辑地址转换为物理地址呢?

我们先来看这张图:
在这里插入图片描述

当程序员写的代码经过编译、链接,最后转入模块到内存,在这个转入的时候,就可以做地址转换,

地址转换三种方式:

1、绝对转入:在编译的时候,如果知道程序将放到内存中哪个位置,编译程序将产生绝对地址的目标代码。

在这里插入图片描述

2、可重定位转入(静态重定位)
编译、链接后的装入模块的地址都是从 0 开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址,可根据内存的当前情况,将装入模块装入到内存的适当位置,装入时对地址进行 “重定位”,将逻辑地址变换为物理地址。
在这里插入图片描述

3、动态运行时转入(动态重定位)

编译、链接后的装入模块的地址都是从 0 开始的,装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址,这种方式需要一个重定位寄存器的支持。
在这里插入图片描述

内存保护

什么是内存保护? 在内存中同时装入了多个程序,每个程序都有属于自己的内存空间。假设进程 2 可以访问、修改进程 1 的内存空间内容,你们觉得这个合理吗? 如果可以那岂不是很不安全,病毒程序就可以随意读取和篡改其他程序内容了,所以有两种机制做到内存保护:

方法一:在 CPU 设置一对上、下限寄存器,存放进程上限、下限地址,进程的指令要访问某个地址的时候,CPU 需要去检查当前访问的地址,是否越界了。

在这里插入图片描述

方法二:采用重定位寄存器和界地址寄存器进行越界检查。重定位寄存器中存放的是进程的起始物理地址,界地址寄存器存放的是进程最大逻辑地址。

在这里插入图片描述

本章总结

在这里插入图片描述

http://www.lryc.cn/news/89131.html

相关文章:

  • GPT-4国内怎么用
  • 搭建LightPicture开源免费图床系统「公网远程控制」
  • shell编程lesson06
  • 国内免费可用的ChatGPT网页版
  • 用同样的关键词测试不同的人工智能
  • shell变量类型含义 长方形面积计算 截取相应字段方法
  • Java:从单线程计数器到多线程数据同步synchronized和原子类Atomic
  • 提前进入行业顶尖阵营:高性能计算实习的竞争优势
  • Java程序设计入门教程--标识符和关键字
  • 国产IC芯片自动化测试系统ATECLOUD,助力芯片测试自动化
  • BeanFactory和ApplicationContext有什么区别?
  • js的BOM对象中的window、location使用
  • DAY 68 redis高可用的主从复制、哨兵、cluster集群
  • leetcode 1209 学会删除字符串
  • JavaScript6
  • 轻松安装Redis:不用担心配置问题
  • ChatGPT学习研究总结
  • SpringBoot枚举入参实战
  • Ansible介绍
  • GPT-4的免费使用方法分享
  • 一个产品的诞生
  • MQTT与传统的HTTP协议对比,优势在哪里呢?
  • 热榜!阿里出品2023版Java架构师面试指南,涵盖Java所有核心技能
  • 【小程序】封装时间选择组件:用单元格van-cell和插槽slot,包括起始时间和终止时间
  • 华为OD机试真题B卷 Java 实现【猜密码】
  • 沉淀-MYSQL
  • OJ练习第116题——二进制矩阵中的最短路径(BFS)
  • 2023上半年软件设计师真题评析
  • (汇编) 基于VS的x86汇编基础指令
  • 算法Day16 | 104.二叉树的最大深度,559.n叉树的最大深度, 111.二叉树的最小深度,222.完全二叉树的节点个数