操作系统(11)----内存管理1

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介: 操作系统(11)----内存管理

内存管理分类如下:

一.地址转换

在上一小节中,我们讲到的模块装入方式,就是从逻辑地址转换为物理地址的方式,我们来回顾一下:

1.绝对装入

绝对装入:在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。(也就是将编译程序中各变量的地址修改为正确的绝对地址)

例如:如果直到装入模块要从地址为100的地方开始存放

装入内存,从100开始装入:

缺点:灵活性很差,只适用于单道程序环境。

2.可重定位装入(静态重定位)

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


与绝对装入的区别在于,静态重定位是在程序装入内存时,再进行地址转换,将逻辑地址转为物理地址。

静态重定位的特点:

•在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。

•作业一旦进入内存后,在运行期间就不能再移动,也不能再申请内存空间。

•一般用于早期的多道批处理操作系统。

3.动态运行时装入(动态重定位)

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


重定位寄存器:


存放了装入模块存放的起始位置,例如下图,起始位置为100。


当CPU访问指令0时,会将其中的逻辑地址79,与重定位寄存器的起始位置相加,得到其访问的地址。


与静态重定位的区别在于,动态重定位装入时依旧保持使用逻辑地址。

动态重定位的特点:

•采用动态重定位时允许程序在内存中发生移动。

•可将程序分配到不连续的存储区中;

•在程序运行前只需装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;

•便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。


二.内存保护

内存保护即操作系统需要保证各进程在各自存储空间运行互不干扰。

这里假设进程1的逻辑地址空间0~179;实际物理地址空间为100~279;

1.设置上、下限寄存器



在CPU中设置一对上、下限寄存器,存放进程的上、下限地址。进程的指令要访问某个地址时,CPU检查是否越界。

CPU会根据上下限寄存器中存储的数据,来判断进程访问某个地址时是否越界。

2.重定位寄存器和界地址寄存器

采用重定位寄存器(又称基址寄存器)和界地址寄存器(又称限长寄存器)进行越界检查。重定位寄存器中存放的是进程的起始物理地址。界地址寄存器中存放的是进程的最大逻辑地址。


加入进程1想要访问逻辑地址为80的内存单元,首先逻辑地址会与界地址寄存器中的数据对比,若没有超过这一数据,就认为没有越界,再与重定位寄存器中的数据相加,就可以得到实际要访问的物理地址。

三.内存空间的扩充

1.覆盖技术

早期的计算机内存很小,比如 IBM 推出的第一台PC机最大只支持 1MB 大小的内存。因此经常会出现内存大小不够的情况。后来人们引入了覆盖技术,用来解决“程序大小超过物理内存总和”的问题。


覆盖技术将程序分为多个段(多个模块)常用的段常驻内存,不常用的段在需要时调入内存。

内存中分为一个“固定区”和若干个“覆盖区。需要常驻内存的段放在“固定区”中,调入后就不再调出(除非运行结束)。不常用的段放在“覆盖区”,需要用到时调入内存用不到时调出内存。


若程序X中,模块A会依次调用B和C模块,B模块可能会调用D模块,C模块可能会调用E,F模块。因为A不可能同时访问B,C模块,所以可以将B,C模块设置在同一个覆盖区,同理也可以将D,E,F模块设置在一个覆盖区。


所以,采用覆盖技术可以按照自身逻辑结构,让那些不可能同时被访问的程序段共享同一个覆盖区。


采用覆盖技术中用:8K+10K+12K=30K的大小

必须由程序员声明覆盖结构,操作系统完成自动覆盖。

缺点:对用户不透明,增加了用户编程负担。覆盖技术只用于早期操作系统,现在已经不使用这一技术。

2.交换技术

交换(对换)技术就是指,内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)


内存紧张时,内存就会将某些进程放入外存,而这些进程的PCB会保留在内存中,并插入到挂起队列中。当内存不紧张了,就可以将这些进程调入内存中。


PCB保留在内存中的原因是用于保存该进程在外存中存放的位置,操作系统根据PCB中存放的信息就可以对进程进行管理了。


补充:


暂时换出外存等待的进程状态为挂起状态(挂起态,suspend)


挂起态又可以进一步细分为就绪挂起、阻塞挂起两种状态:


当就绪态被换出内存就称为就绪挂起态,当阻塞态被换出内存就称为阻塞挂起态。

我们之前有讲过高级调度,中级调度和低级调度,那么交换技术就是中级调度使用的一种交换策略,忘记了可以回顾一下:

中级调度就是用来决定哪个处于挂起状态的进程将被重新调入。


1.应该在外存(磁盘)的什么位置保存被换出的进程?


具有对换功能的操作系统中,通常把磁盘空间分为文件区和对换区两部分。


文件区主要用于存放文件,主要追求存储空间的利用率,因此对文件区空间的管理采用离散分配方式;


对换区空间只占磁盘空间的小部分,被换出的进程数据就存放在对换区。由于对换的速度直接影响到系统的整体速度,因此对换区空间的管理主要追求换入换出速度,因此通常对换区采用连续分配方式。总之,对换区的I/O速度比文件区的更快。

操作系统(11)----内存管理2:https://developer.aliyun.com/article/1511164

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
4月前
|
存储 Linux 调度
深入理解操作系统:从进程管理到内存分配
【8月更文挑战第44天】本文将带你深入操作系统的核心,探索其背后的原理和机制。我们将从进程管理开始,理解如何创建、调度和管理进程。然后,我们将探讨内存分配,了解操作系统如何管理计算机的内存资源。最后,我们将通过一些代码示例,展示这些概念是如何在实际操作系统中实现的。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
|
30天前
|
C语言 开发者 内存技术
探索操作系统核心:从进程管理到内存分配
本文将深入探讨操作系统的两大核心功能——进程管理和内存分配。通过直观的代码示例,我们将了解如何在操作系统中实现这些基本功能,以及它们如何影响系统性能和稳定性。文章旨在为读者提供一个清晰的操作系统内部工作机制视角,同时强调理解和掌握这些概念对于任何软件开发人员的重要性。
|
29天前
|
Linux 调度 C语言
深入理解操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅,从进程管理的基本概念出发,逐步探索到内存管理的高级技巧。我们将通过实际代码示例,揭示操作系统如何高效地调度和优化资源,确保系统稳定运行。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇了解操作系统深层工作原理的大门。
|
2月前
|
算法 调度 开发者
深入理解操作系统:从进程管理到内存分配
本文旨在为读者提供一个深入浅出的操作系统知识之旅,从进程管理的基础概念出发,探索内存分配的策略与技巧。我们将通过实际代码示例,揭示操作系统背后的逻辑与奥秘,帮助读者构建起对操作系统工作原理的直观理解。文章不仅涵盖理论知识,还提供实践操作的指导,使读者能够将抽象的概念转化为具体的技能。无论你是初学者还是有一定基础的开发者,都能在这篇文章中找到有价值的信息和启发。
|
2月前
|
算法 调度 C++
深入理解操作系统:从进程管理到内存分配
【10月更文挑战第42天】本文将带你进入操作系统的神秘世界,探索其核心概念和关键技术。我们将从进程管理开始,了解操作系统如何协调和管理多个程序的运行;然后,我们将深入研究内存分配,看看操作系统如何有效地分配和管理计算机的内存资源。通过这篇文章,你将获得对操作系统工作原理的深入理解,并学会如何编写高效的代码来利用这些原理。
|
3月前
|
分布式计算 算法 大数据
探索操作系统的核心:调度与内存管理机制
【10月更文挑战第11天】 本文深入探讨了操作系统中两大核心功能——调度与内存管理机制。通过分析调度算法、进程状态转换及内存分配策略等关键方面,揭示了它们如何共同维护系统性能和稳定性。旨在为读者提供对操作系统内部运作的深刻理解,同时引起对优化策略的思考。
87 5
|
3月前
|
算法
深入理解操作系统:内存管理机制的探索之旅
【10月更文挑战第2天】在数字世界的浩瀚海洋中,操作系统犹如一艘精密的航船,承载着软件与硬件的和谐共舞。本文将揭开内存管理的神秘面纱,从基础概念到高级策略,引领读者领略操作系统内存分配的智慧。通过深入浅出的解释和生动的比喻,我们一同遨游在内存的江河之中,感受操作系统如何巧妙地协调资源,确保数据的有序流动。让我们跟随内存的脚步,探索那些隐藏在每次点击、每次命令背后的奥秘。
|
3月前
|
监控 开发者
深入理解操作系统:内存管理的艺术
【10月更文挑战第2天】在数字世界的幕后,操作系统扮演着至关重要的角色。本文将深入探索操作系统的心脏——内存管理,揭示它是如何协调和管理计算机的宝贵资源。通过浅显易懂的语言和生活化的比喻,我们将一起走进内存管理的奥秘世界,了解它的原理、机制以及为何对整个系统的性能和稳定性有着不可替代的影响。无论你是技术新手还是资深开发者,这篇文章都将为你打开新的视角,让你对日常使用的设备有更深层次的认识和尊重。
|
3月前
|
缓存 算法 调度
深入浅出操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅。我们将从进程管理的基本概念出发,逐步深入到内存管理的复杂世界,最终探索如何通过实践技巧来优化系统性能。文章将结合理论与实践,通过代码示例,帮助读者更好地理解操作系统的核心机制及其在日常技术工作中的重要性。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往操作系统深层次理解的大门。
|
3月前
|
存储 算法 C语言
MacOS环境-手写操作系统-17-内存管理算法实现
MacOS环境-手写操作系统-17-内存管理算法实现
45 0