我读了关于进程内存分配的以下几行:
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.
答案 0 :(得分:1)
我猜答案是“效率”。如果你只想跟踪孔,最坏的情况是在给定的存储块中有一些孔等于字节的一半(存储块中的每隔一个字节就是一个“孔”),这意味着对于每个存储器给定大小的块需要额外数量的指针,大小等于块大小的一半,例如:
块大小:1024B
“孔”的最大数量:1024/2 = 512
跟踪单个“洞”的每个指针都是4B(在32位架构上),所以:512 * 4 = 2048B!
我希望我不必说服你,这不是最好的解决方案。一些聪明的人发现,要“解决”你需要一些更大的“粒度”记忆的问题。换句话说,OS仅在一些固定大小的块(称为页面)中分配内存。通常一页是4KiB(4096B)。您可以这样想:当我们谈论内存分配时操作系统不是零售商。操作系统仅在页面中分配内存。在流程级别上需要更小的分配粒度 - C库的实现在那里发挥(C库分配例程零售商),例如:malloc
,free
函数和朋友。这些函数从操作系统(在页面中)分配内存,然后跟踪“已使用”和“未使用”的块(这只是一个简化:它要复杂得多,它们有不同的“策略”,具体取决于大小请求的块。)
P.S。 我知道这很普遍,但我不知道你目前对这个问题的了解有多广泛。