Operating System 简明教程
Operating System - Memory Management
内存管理是指操作系统的功能,它会处理或管理主内存,并在执行期间在主内存和磁盘之间来回移动进程。内存管理会跟踪每个内存位置,无论它是否已分配给某个进程或它是空闲的。它检查为进程分配多少内存。它决定在什么时间将内存分配给哪个进程。它会跟踪何时释放或取消分配某个内存并相应地更新状态。
Memory management is the functionality of an operating system which handles or manages primary memory and moves processes back and forth between main memory and disk during execution. Memory management keeps track of each and every memory location, regardless of either it is allocated to some process or it is free. It checks how much memory is to be allocated to processes. It decides which process will get memory at what time. It tracks whenever some memory gets freed or unallocated and correspondingly it updates the status.
本教程将向您讲解内存管理相关基础概念。
This tutorial will teach you basic concepts related to Memory Management.
Process Address Space
进程地址空间是由进程在其代码中引用的逻辑地址集。例如,当使用 32 位寻址时,地址范围可以从 0 到 0x7fffffff;换句话说,可能共有 2^31 个编号,理论大小总计为 2GB。
The process address space is the set of logical addresses that a process references in its code. For example, when 32-bit addressing is in use, addresses can range from 0 to 0x7fffffff; that is, 2^31 possible numbers, for a total theoretical size of 2 gigabytes.
操作系统负责在将内存分配给程序时将逻辑地址映射到物理地址。在分配内存之前和之后,程序中会使用三种类型的地址 −
The operating system takes care of mapping the logical addresses to physical addresses at the time of memory allocation to the program. There are three types of addresses used in a program before and after memory is allocated −
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 addresses. |
3 |
Physical addresses The loader generates these addresses at the time when a program is loaded into main memory. |
在编译时和加载时地址绑定方案中,虚拟地址和物理地址相同。在执行时地址绑定方案中,虚拟地址和物理地址不同。
Virtual and physical addresses are the same in compile-time and load-time address-binding schemes. Virtual and physical addresses differ in execution-time address-binding scheme.
程序所生成的所有逻辑地址的集合被称为 logical address space 。相应于这些逻辑地址的所有物理地址的集合被称为 physical address space. 。
The set of all logical addresses generated by a program is referred to as a logical address space. The set of all physical addresses corresponding to these logical addresses is referred to as a physical address space.
虚拟地址到物理地址的运行时映射是由内存管理单元 (MMU) 完成的,这是一个硬件设备。MMU 使用以下机制将虚拟地址转换为物理地址。
The runtime mapping from virtual to physical address is done by the memory management unit (MMU) which is a hardware device. MMU uses following mechanism to convert virtual address to physical address.
-
The value in the base register is added to every address generated by a user process, which is treated as offset at the time it is sent to memory. For example, if the base register value is 10000, then an attempt by the user to use address location 100 will be dynamically reallocated to location 10100.
-
The user program deals with virtual addresses; it never sees the real physical addresses.
Static vs Dynamic Loading
在开发计算机程序时必须在静态或动态加载之间进行选择。如果您必须静态加载程序,那么在编译时将编译并链接完整程序,而不会留下任何外部程序或模块依赖项。链接程序将目标程序与其他必需目标模块合并为绝对程序,其中也包括逻辑地址。
The choice between Static or Dynamic Loading is to be made at the time of computer program being developed. If you have to load your program statically, then at the time of compilation, the complete programs will be compiled and linked without leaving any external program or module dependency. The linker combines the object program with other necessary object modules into an absolute program, which also includes logical addresses.
如果您正在编写一个动态加载程序,那么您的编译器将编译程序,并且对于您想要动态包含的所有模块,只会提供引用,其余工作将在执行时完成。
If you are writing a Dynamically loaded program, then your compiler will compile the program and for all the modules which you want to include dynamically, only references will be provided and rest of the work will be done at the time of execution.
在加载时,使用 static loading ,绝对程序(和数据)将加载到内存中以便执行开始。
At the time of loading, with static loading, the absolute program (and data) is loaded into memory in order for execution to start.
如果您使用 dynamic loading ,库的动态例程将以可重定位方式存储在磁盘上,并且仅当程序需要时才加载到内存中。
If you are using dynamic loading, dynamic routines of the library are stored on a disk in relocatable form and are loaded into memory only when they are needed by the program.
Static vs Dynamic Linking
如上所述,当使用静态链接时,链接器将程序所需的所有其他模块组合成一个可执行程序,以避免任何运行时依赖。
As explained above, when static linking is used, the linker combines all other modules needed by a program into a single executable program to avoid any runtime dependency.
当使用动态链接时,不需要将实际的模块或库与程序链接,而是在编译和链接时提供对动态模块的引用。Windows 中的动态链接库 (DLL) 和 Unix 中的共享对象是动态库的良好示例。
When dynamic linking is used, it is not required to link the actual module or library with the program, rather a reference to the dynamic module is provided at the time of compilation and linking. Dynamic Link Libraries (DLL) in Windows and Shared Objects in Unix are good examples of dynamic libraries.
Swapping
交换是一种机制,其中进程可以暂时从主内存(或移动)交换到辅助存储(磁盘),并使该内存可供其他进程使用。在稍后的某个时间,系统将从辅助存储器将进程换回主内存。
Swapping is a mechanism in which a process can be swapped temporarily out of main memory (or move) to secondary storage (disk) and make that memory available to other processes. At some later time, the system swaps back the process from the secondary storage to main memory.
尽管性能通常会受到交换进程的影响,但它有助于并行运行多个大型进程,这就是 Swapping is also known as a technique for memory compaction 的原因。
Though performance is usually affected by swapping process but it helps in running multiple and big processes in parallel and that’s the reason Swapping is also known as a technique for memory compaction.
交换进程所花费的总时间包括将整个进程移动到辅助磁盘以及再将进程复制回内存所需的时间,以及进程重新获取主内存所需的时间。
The total time taken by swapping process includes the time it takes to move the entire process to a secondary disk and then to copy the process back to memory, as well as the time the process takes to regain main memory.
让我们假设用户进程的大小为 2048KB,并且在交换将发生在其上的标准硬盘上,数据传输速率约为每秒 1 MB。从或到内存传输 1000K 进程的实际传输将花费
Let us assume that the user process is of size 2048KB and on a standard hard disk where swapping will take place has a data transfer rate around 1 MB per second. The actual transfer of the 1000K process to or from memory will take
2048KB / 1024KB per second
= 2 seconds
= 2000 milliseconds
现在考虑到输入和输出时间,它将花费完整的 4000 毫秒加上其他开销,其中进程竞争以重新获取主内存。
Now considering in and out time, it will take complete 4000 milliseconds plus other overhead where the process competes to regain main memory.
Memory Allocation
主内存通常有两个分区:
Main memory usually has two partitions −
-
Low Memory − Operating system resides in this memory.
-
High Memory − User processes are held in high memory.
操作系统使用以下内存分配机制。
Operating system uses the following memory allocation mechanism.
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 partitions where each partition should contain only one process. When a partition is free, a process is selected from the input queue and is loaded into the free partition. When the process terminates, the partition becomes available for another process. |
Fragmentation
当进程从内存中加载并删除时,空闲内存空间会被分成小块。有时会发生这种情况:进程无法分配给内存块,因为它们的尺寸小,而且内存块仍然未使用。此问题称为碎片。
As processes are loaded and removed from memory, the free memory space is broken into little pieces. It happens after sometimes that processes cannot be allocated to memory blocks considering their small size and memory blocks remains unused. This problem is known as Fragmentation.
碎片有两种类型:
Fragmentation is of two types −
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. |
下图显示了碎片如何导致内存浪费,以及如何使用压缩技术从碎片内存中创建更多可用内存−
The following diagram shows how fragmentation can cause waste of memory and a compaction technique can be used to create more free memory out of fragmented memory −
可以通过压缩或混洗内存内容来减少外部碎片,从而将所有可用内存集中在一个大块中。为了使压缩可行,重定位应该是动态的。
External fragmentation can be reduced by compaction or shuffle memory contents to place all free memory together in one large block. To make compaction feasible, relocation should be dynamic.
可以通过有效分配最小的分区(但足以满足进程需要)来减少内部碎片。
The internal fragmentation can be reduced by effectively assigning the smallest partition but large enough for the process.
Paging
计算机可以寻址超过系统上实际安装的内存量。此额外内存实际上称为虚拟内存,它是将硬盘的一部分设置为模拟计算机 RAM。分页技术在实现虚拟内存中扮演着重要角色。
A computer can address more memory than the amount physically installed on the system. This extra memory is actually called virtual memory and it is a section of a hard that’s set up to emulate the computer’s RAM. Paging technique plays an important role in implementing virtual memory.
分页是一种内存管理技术,其中进程地址空间被分成称为 pages 大小相同的块(大小是 2 的幂,介于 512 字节和 8192 字节之间)。进程的大小以页数来衡量。
Paging is a memory management technique in which process address space is broken into blocks of the same size called pages (size is power of 2, between 512 bytes and 8192 bytes). The size of the process is measured in the number of pages.
类似地,主内存被分成称为 frames 的小型固定大小块(物理)内存,并且帧的大小与页的大小保持相同,以便最大程度地利用主内存并避免外部碎片。
Similarly, main memory is divided into small fixed-sized blocks of (physical) memory called frames and the size of a frame is kept the same as that of a page to have optimum utilization of the main memory and to avoid external fragmentation.
Address Translation
页地址称为 logical address ,由 page number 和 offset 表示。
Page address is called logical address and represented by page number and the offset.
Logical Address = Page number + page offset
帧地址称为 physical address ,由 frame number 和 offset 表示。
Frame address is called physical address and represented by a frame number and the offset.
Physical Address = Frame number + page offset
名为 page map table 的数据结构用于跟踪进程页与物理内存中帧之间的关系。
A data structure called page map table is used to keep track of the relation between a page of a process to a frame in physical memory.
当系统将帧分配给任何页面时,它会将此逻辑地址转换为物理地址,并在页表中创建条目,以便在整个程序执行期间使用。
When the system allocates a frame to any page, it translates this logical address into a physical address and create entry into the page table to be used throughout execution of the program.
当进程要执行时,其对应的页面将加载到任何可用的内存帧中。假设您有一个 8Kb 的程序,但您的内存只能在给定时间容纳 5Kb,那么分页概念就会出现。当计算机的 RAM 用完时,操作系统 (OS) 会将空闲或不需要的内存页移动到辅助内存,以释放其他进程的 RAM 并根据程序需要将其取回。
When a process is to be executed, its corresponding pages are loaded into any available memory frames. Suppose you have a program of 8Kb but your memory can accommodate only 5Kb at a given point in time, then the paging concept will come into picture. When a computer runs out of RAM, the operating system (OS) will move idle or unwanted pages of memory to secondary memory to free up RAM for other processes and brings them back when needed by the program.
这个过程在程序的整个执行过程中继续进行,操作系统会不断从主内存中删除空闲页面并将它们写入辅助内存,并在程序需要时将它们取回。
This process continues during the whole execution of the program where the OS keeps removing idle pages from the main memory and write them onto the secondary memory and bring them back when required by the program.
Advantages and Disadvantages of Paging
以下是分页的优点和缺点列表−
Here is a list of advantages and disadvantages of paging −
-
Paging reduces external fragmentation, but still suffer from internal fragmentation.
-
Paging is simple to implement and assumed as an efficient memory management technique.
-
Due to equal size of the pages and frames, swapping becomes very easy.
-
Page table requires extra memory space, so may not be good for a system having small RAM.
Segmentation
分段是一种内存管理技术,其中每个作业被分成多个不同大小的段,每个段对应一个模块,其中包含执行相关功能的部分。每个段实际上是程序的不同逻辑地址空间。
Segmentation is a memory management technique in which each job is divided into several segments of different sizes, one for each module that contains pieces that perform related functions. Each segment is actually a different logical address space of the program.
当一个进程要被执行时,对于任一代码段,尽管每个代码段被加载到一个可用的连续内存块中,其对应的分段会被加载到不连续的内存中。
When a process is to be executed, its corresponding segmentation are loaded into non-contiguous memory though every segment is loaded into a contiguous block of available memory.
分段内存管理的工作方式与分页非常相似,但是这里的代码段长度可变,而在分页中页面的大小是固定的。
Segmentation memory management works very similar to paging but here segments are of variable-length where as in paging pages are of fixed size.
一个程序代码段包含程序的主函数、实用函数、数据结构等。操作系统对每一个进程维护一个 segment map table 和一个空闲内存块列表以及代码段号、它们的大小和主内存中对应的内存位置。对于每一个代码段,该表储存代码段的起始地址和代码段的长度。对一个内存位置的引用包括一个标识代码段的值和一个偏移量。
A program segment contains the program’s main function, utility functions, data structures, and so on. The operating system maintains a segment map table for every process and a list of free memory blocks along with segment numbers, their size and corresponding memory locations in main memory. For each segment, the table stores the starting address of the segment and the length of the segment. A reference to a memory location includes a value that identifies a segment and an offset.