2012-10-21 86 views
0

我阅读了有关内存分配过程中的以下行:内存分配过程

One of the important considerations in main memory management is: how should an 
    OS allocate a chunk of main memory required by a process. One simple approach 
    would be to somehow create partitions and then different processes could 
    reside in different partitions. 

注意,本款寻呼的概念之前来了,在一次谈论内存分配全过程。 我的问题是:

Why should we create partitions? We can just keep track of holes in the memory 
    and keep pointers to the beginning and end of the holes. When we allocate a 
    process some memory, we can associate the pointer to the beginning and end of 
    the process with the process and end pointer of the process serves as the 
    pointer to the beginning of a new hole. 

回答

1

我想答案是“效率”。如果你只想跟踪漏洞,最坏的情况是在给定的内存块中有许多空洞等于一半的字节(内存块中的每个第二个字节都是一个“空洞”),这意味着对于每个内存给定尺寸的块需要的指针附加数量等于块的一半大小,例如:

块大小:1024B

“洞”的

最大NUMER:二分之一千○二十四= 512

每个指针跟踪单个“洞”是4B(在32位架构上),因此:512 * 4 = 2048B! 我希望我不必说服你,这不是最好的解决方案。一些聪明的人发现,为了“解决”问题,你需要更大的“粒度”记忆。换句话说,操作系统只在一些固定大小的块(称为页面)中分配内存。通常一页是4KiB(4096B)。你可以这样想:当我们谈论内存分配操作系统不是零售商。 OS只在页面中分配内存。在进程级别上需要更小的分配粒度 - C库的实现在那里发挥作用(C库分配例程是零售商)例如:malloc,free功能和朋友。这些函数从操作系统分配内存(以页为单位),然后跟踪“已用”和“未用”块(这只是一种简化:它要复杂得多,因为它们有不同的“策略”所请求的块)。

P.S. 我知道这是非常普遍的,但我不知道你对这个主题的现有知识有多广泛。

+0

@sirgeorge ...请注意,我正在讨论连续分配内存给进程。因此,如果每个第二个字节是一个空洞,那么意味着每个进程都是1个字节长。我认为我们可以认为,如果分区中遗漏的空洞可能被另一个进程完全或部分占用。例如:如果有一个256字节的分区,并且有一个100字节的进程。现在,如果有50字节的进程出现,它可以占据与100字节相邻的地方(所以我们需要一个指针告诉我们100字节进程的结束)。所以,为什么涉及分区时指针可以照顾它呢? – avinash