📅  最后修改于: 2020-12-13 15:42:24             🧑  作者: Mango
内存管理是操作系统的功能,该操作系统处理或管理主内存,并在执行过程中在主内存和磁盘之间来回移动进程。内存管理跟踪每个内存位置,而不管它是分配给某个进程还是空闲的。它检查要为进程分配多少内存。它决定哪个进程在什么时候获取内存。每当某些内存被释放或未分配时,它就会进行跟踪,并相应地更新状态。
本教程将教您与内存管理有关的基本概念。
进程地址空间是进程在其代码中引用的逻辑地址集。例如,当使用32位寻址时,地址范围可以从0到0x7fffffff;也就是2 ^ 31个可能的数字,理论总大小为2 GB。
操作系统负责在将内存分配给程序时将逻辑地址映射到物理地址。分配内存前后,程序中使用三种地址:
S.N. | Memory Addresses & Description |
---|---|
1 |
Symbolic addresses The addresses used in a source code. The variable names, constants, and instruction labels are the basic elements of the symbolic address space. |
2 |
Relative addresses At the time of compilation, a compiler converts symbolic addresses into relative |
3 |
Physical addresses The loader generates these addresses at the time when a program is loaded into main memory. |
在编译时和加载时地址绑定方案中,虚拟地址和物理地址相同。虚拟地址和物理地址在执行时地址绑定方案上有所不同。
程序生成的所有逻辑地址的集合称为逻辑地址空间。对应于这些逻辑地址的所有物理地址的集合称为物理地址空间。
从虚拟地址到物理地址的运行时映射是由作为硬件设备的内存管理单元(MMU)完成的。 MMU使用以下机制将虚拟地址转换为物理地址。
基址寄存器中的值被添加到用户进程生成的每个地址中,该地址在发送到内存时被视为偏移量。例如,如果基本寄存器值为10000,则用户使用地址位置100的尝试将动态重新分配到位置10100。
用户程序处理虚拟地址;它永远看不到真实的物理地址。
在开发计算机程序时应在静态或动态加载之间进行选择。如果必须静态加载程序,则在编译时,将编译和链接完整程序,而不会留下任何外部程序或模块依赖性。链接器将目标程序与其他必要的目标模块组合成一个绝对程序,其中还包括逻辑地址。
如果要编写动态加载的程序,则编译器将编译该程序,并且对于要动态包含的所有模块,将仅提供引用,其余工作将在执行时完成。
在加载时,通过静态加载,绝对程序(和数据)被加载到内存中以便开始执行。
如果使用动态加载,则库的动态例程以可重定位的形式存储在磁盘上,并且仅在程序需要它们时才加载到内存中。
如上所述,当使用静态链接时,链接器将程序所需的所有其他模块组合到单个可执行程序中,以避免任何运行时依赖性。
使用动态链接时,不需要将实际模块或库与程序链接,而是在编译和链接时提供了对动态模块的引用。 Windows中的动态链接库(DLL)和Unix中的共享对象是动态库的良好示例。
交换是一种机制,在该机制中,可以将进程暂时从主内存中交换(或移动)到辅助存储(磁盘),并使该内存可用于其他进程。在以后的某个时间,系统将进程从辅助存储换回到主内存。
尽管性能通常受交换过程的影响,但它有助于并行运行多个大型进程,因此,交换也被称为内存压缩技术。
交换过程所花费的总时间包括将整个过程移至辅助磁盘,然后将其复制回内存所花费的时间,以及该过程恢复主内存所花费的时间。
让我们假设用户进程的大小为2048KB,并且在进行交换的标准硬盘上,数据传输速率约为每秒1 MB。从内存实际转移1000K的过程将花费
2048KB / 1024KB per second
= 2 seconds
= 2000 milliseconds
现在考虑进出时间,整个过程将花费4000毫秒以及其他开销来竞争重新获得主内存的开销。
主内存通常有两个分区-
内存不足-操作系统驻留在此内存中。
高内存-用户进程保存在高内存中。
操作系统使用以下内存分配机制。
S.N. | Memory Allocation & Description |
---|---|
1 |
Single-partition allocation In this type of allocation, relocation-register scheme is used to protect user processes from each other, and from changing operating-system code and data. Relocation register contains value of smallest physical address whereas limit register contains range of logical addresses. Each logical address must be less than the limit register. |
2 |
Multiple-partition allocation In this type of allocation, main memory is divided into a number of fixed-sized |
在从内存中加载和删除进程时,可用内存空间会分成几小块。考虑到有时由于无法将进程分配给存储块而导致其无法使用,因此有时无法将其分配给存储块。此问题称为碎片。
碎片有两种类型-
S.N. | Fragmentation & Description |
---|---|
1 |
External fragmentation Total memory space is enough to satisfy a request or to reside a process in it, but it is not contiguous, so it cannot be used. |
2 |
Internal fragmentation Memory block assigned to process is bigger. Some portion of memory is left unused, as it cannot be used by another process. |
下图显示了碎片如何导致内存浪费,并且可以使用压缩技术从碎片内存中创建更多可用内存-
可以通过压缩或改组内存内容以将所有可用内存放在一个大块中来减少外部碎片。为了使压缩可行,重定位应该是动态的。
通过有效分配最小的分区,但对于该过程足够大,可以减少内部碎片。
一台计算机可以分配的内存量大于系统上实际安装的内存量。这种额外的内存实际上称为虚拟内存,它是硬盘的一部分,用于模拟计算机的RAM。分页技术在实现虚拟内存中起着重要作用。
分页是一种内存管理技术,其中,进程地址空间被分成大小相同的块(称为页面) (大小为2的幂,介于512字节和8192字节之间)。进程的大小以页数为单位。
类似地,将主存储器分为称为帧的(物理)存储器的固定小块,并且将帧的大小与页面的大小保持相同,以最佳利用主存储器并避免外部碎片。
页面地址称为逻辑地址,由页面号和偏移量表示。
Logical Address = Page number + page offset
帧地址称为物理地址,由帧号和偏移量表示。
Physical Address = Frame number + page offset
称为页面映射表的数据结构用于跟踪进程的页面与物理内存中的框架之间的关系。
当系统将框架分配给任何页面时,它将逻辑地址转换为物理地址,并在页面表中创建条目,以在整个程序执行过程中使用。
当要执行一个进程时,其相应的页面将被加载到任何可用的存储帧中。假设您有一个8Kb的程序,但是您的内存在给定的时间点只能容纳5Kb,那么分页概念就会浮出水面。当计算机内存不足时,操作系统(OS)将空闲或不需要的内存页面移至辅助内存,以释放RAM供其他进程使用,并在程序需要时将它们带回。
在程序的整个执行过程中,此过程将继续进行,在此过程中,操作系统会不断从主内存中删除空闲页面,并将其写入辅助内存中,并在程序需要时将它们带回。
这是分页的优缺点列表-
分页减少了外部碎片,但仍然遭受内部碎片的困扰。
分页易于实现,并被视为一种有效的内存管理技术。
由于页面和框架的大小相等,所以交换变得非常容易。
页表需要额外的内存空间,因此对于RAM较小的系统可能不是很好。
分段是一种内存管理技术,其中将每个作业划分为不同大小的多个段,每个模块一个段,每个模块包含执行相关功能的部分。每个段实际上是程序的不同逻辑地址空间。
当要执行一个进程时,尽管每个段都被加载到一个可用内存的连续块中,但是它对应的分段被加载到非连续的内存中。
分段内存管理的工作原理与分页非常相似,但是分段的长度是可变的,而分页中的页是固定大小的。
程序段包含程序的主要函数,实用程序功能,数据结构等。操作系统为每个进程维护一个段映射表,以及一个空闲内存块列表以及段号,它们的大小以及主内存中的相应内存位置。对于每个段,该表存储段的起始地址和段的长度。对存储位置的引用包括标识段和偏移量的值。