博客
关于我
读懂操作系统之内存管理总结(八)
阅读量:403 次
发布时间:2019-03-05

本文共 1874 字,大约阅读时间需要 6 分钟。

前言

内存由大量的字或字节组成,每个字或字节都有自己的地址。CPU根据程序计数器的值从内存中提取指令,这些指令可能会导致需要从特定的存储器地址进行额外的加载并将其存储到特定的存储器地址。通常,程序以二进制可执行文件的形式驻留在磁盘上,该程序必须被带入内存并放置在一个进程中才能执行。执行过程可能会在磁盘和内存之间进行交互,磁盘上等待被带入内存以供执行的进程的集合形成了输入队列。将程序加载到进程中执行势必要进行内存管理,那么我们如何才能有效地进行内存管理呢?

内存管理

主内存必须同时容纳操作系统和各种用户进程。因此,我们需要以最有效的方式在主内存中分配不同部分。内存通常分为两个分区:一个分区用于驻留操作系统,另一个分区用于用户进程。操作系统可能会被放置在低内存或高内存中。每个进程都包含在内存的单个连续部分中。在早期的内存管理中,采取了连续分配方式,但我们必须解决两个主要问题:空间分配和地址转换。空间分配意味着如何以连续的方式存储数据,而地址转换意味着CPU生成的逻辑地址如何转换为物理地址以访问主存储器。因此,我们首先将了解空间分配策略。

固定大小分区

连续内存空间分配是将内存划分为几个固定大小的分区。每个分区可能只包含一个进程。在这种多分区方法中,当一个分区空闲时,将从输入队列中选择一个进程并将其加载到空闲分区中。当进程终止时,该分区可用于另一个进程。例如,假设辅助存储器中有进程P1,要将P1带入主存储器,则P1将以连续方式分配空间。如果有10KB的内存,我们将分区划分为固定大小的分区,但大小可能并不相同。这种分区方法称为固定大小分区。在固定大小分区中,我们对内存进行分区,并且每个分区的大小都是固定的,无法更改。

举个栗子:餐馆有多个餐桌,供不同人数就餐。若一个人来,一个两人座会剩下一个座位;若接下来来了两人以上,剩余的那个座位将无法满足需求,这就是我们所说的“碎片问题”。在固定大小分区中,如果要在第2张图片中放置大小为4KB的进程P,则只能放置在一个5KB的分区中。当在5KB槽中放置4KB的进程时,剩余1KB将导致内部碎片。这种方法无法重用分区,并且会浪费内部空间。当进程从辅助存储器移动到主存储器时,由于固定大小分区的限制,进程无法被分成几部分,而是必须整体加载。连续内存分配的一个例子是访问数组,因为数组中的元素是连续内存分配的,CPU只需记住数组第一个元素的基地址即可快速访问各个元素。连续分配的优点是访问时间非常短。

如上,如果我们有5KB的数据并将其放置在上述存储块中,则无法放置。即使有8KB的可用空间,但该8KB空间也是非连续的。这就是为什么不能在内存中放置5KB数据的原因。这将导致外部碎片。外部碎片意味着我们可以插入内存中的数据大小可用,但由于空间不连续,我们无法放置它们。在连续内存分配的情况下,这也是一个非常普遍的问题。

可变大小分区

为了消除固定大小分区的缺点,引入了可变大小分区。在可变大小分区中,我们不对内存进行分区。只要有内存,进程就会到来,我们就会在内存中分配空间。假设内存大小为10KB,若进程P1需要4KB,那么我们将为P1分配4KB,剩余6KB。假设P2需要3KB,那么我们将为P2分配3KB,剩余3KB。在可变大小分区中,我们不会遇到内部碎片。

连续内存分配算法

无论我们使用【首次适配】、【最优适配】还是【最差适配】算法,都会引起上述外部碎片的问题。因此,这三个算法在这里不再详细阐述。

非连续内存分配

由于连续内存分配或多或少都会引起内部或外部碎片,同时为了更好的对内存进行利用和管理,所以才有了我们前面所讲解过的非连续内存分配的分段和分页。分段和分页的优点除了支持动态加载和动态链接外,还允许共享代码和数据。在这种情况下,当进程从辅助存储器移动到主存储器时,我们可以将其分为几部分并放置在主存储器中。例如,链表只能从第一个节点开始访问,必须遍历到最后一个节点才能访问最后一个节点的数据。在非连续内存分配中,数据会分散在内存中,并且我们只能访问该数据的开头。非连续内存分配的缺点是访问速度较慢,因为我们必须依赖指针逐个遍历,但它的好处远胜于此。例如,在非连续内存分配的情况下,可以在上图中插入5KB数据,因为5KB可以分为几部分(第一部分为4KB,第二部分为剩余1KB)。非连续内存分配完全不会受到外部碎片的影响。

总结

内存管理的基本内容已经讲解完毕。这一节也是内存管理的最后一小节内容。接下来,我们将进入程序执行操作、线程、进程等内容的详细讲解。感谢您的阅读,我们下节见。

转载地址:http://axlzz.baihongyu.com/

你可能感兴趣的文章
node全局对象 文件系统
查看>>
Node出错导致运行崩溃的解决方案
查看>>
Node响应中文时解决乱码问题
查看>>
node基础(二)_模块以及处理乱码问题
查看>>
node安装卸载linux,Linux运维知识之linux 卸载安装node npm
查看>>
node安装及配置之windows版
查看>>
Node实现小爬虫
查看>>
Node提示:error code Z_BUF_ERROR,error error -5,error zlib:unexpected end of file
查看>>
Node提示:npm does not support Node.js v12.16.3
查看>>
Node搭建静态资源服务器时后缀名与响应头映射关系的Json文件
查看>>
Node服务在断开SSH后停止运行解决方案(创建守护进程)
查看>>
node模块化
查看>>
node模块的本质
查看>>
node环境下使用import引入外部文件出错
查看>>
node环境:Error listen EADDRINUSE :::3000
查看>>
Node的Web应用框架Express的简介与搭建HelloWorld
查看>>
Node第一天
查看>>
node编译程序内存溢出
查看>>
Node读取并输出txt文件内容
查看>>
node防xss攻击插件
查看>>