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. 
4

1 回答 1

1

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

块大小:1024B

最大“孔”数:1024/2 = 512

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

PS我知道这很笼统,但我不知道您目前对该主题的了解有多大。

于 2012-10-23T10:18:15.977 回答