2010-11-01 39 views
1

我正在研究操作系统内存管理,我想验证我得到了基本的分配\虚拟内存\分页机制。操作系统内存管理 - malloc()调用

假设一个进程调用malloc(),幕后发生了什么? 我的回答:运行时库在其虚拟内存地址空间中找到适当大小的内存块。 (这是分配算法,如首次适应配合最好与碎片处理发挥作用)

现在让我们假设进程访问内存,怎么做呢? 我的回答:从进程看来,内存地址实际上是虚拟的。操作系统检查该地址是否当前映射到物理内存地址,如果是,则执行访问。如果未映射 - 则会引发页面错误。

我是否正确?即编译器\运行时库负责分配虚拟内存块,并且OS负责进程的虚拟地址和物理地址(以及需要的分页算法)之间的映射?

谢谢!

回答

0

关于权利。内存需要存在于进程的虚拟内存中才能实际分配物理页面。你不能只是在任何地方开始探索,并期望内核将物理内存放在你碰巧访问的地方。

还有比这更多的东西。阅读mmap(),匿名而不是,共享和私有。还有brk()。 malloc()建立在brk()和mmap()上。

0

你已经差不多了。您错过的一件事就是该流程首先向系统请求更多虚拟内存。正如托马斯指出的那样,你不能只写你想要的地方。没有理由说操作系统不能被设计成允许这样做,但如果它有一些想法,你将要写作的空间以及你所做的空间是连续的,它会更有效率。

在Unixy系统上,用户态进程有一个名为的数据段,这就是它听起来像的地方:它是数据传递的地方。当进程需要数据内存时,它会调用brk(),它会要求系统将数据段扩展到指定的指针值。 (例如,如果您现有的数据段是空的,你想要把它扩大到2M,你会打电话brk(0x200000)

请注意,虽然很常见,brk()不是一个标准的;实际上它在十年前被POSIX.1推出,因为C规定了malloc(),并且没有理由要求接口进行数据段分配。