当前位置:嗨网首页>书籍在线阅读

03-程序如何使用内存

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

5.2 程序如何使用内存

现在,我们知道一个进程有一块专门用于执行的内存。但是如何访问此内存来执行相关任务呢?出于安全性和故障隔离方面的考虑,不允许进程直接访问物理内存,而是使用虚拟内存,操作系统使用被称为页面的内存数据结构映射到实际的物理内存,这些数据结构在页面表中维护。进程必须从操作系统请求内存供其使用,它获得的是一个内部映射到随机存取存储器(Random Access Memory,RAM)物理地址的虚拟地址。出于性能方面的考虑,内存都以块为单位被请求和处理。当进程访问虚拟内存时,内存管理单元执行从虚拟内存到物理内存的实际转换。

进程从操作系统获取内存的一系列步骤称为内存分配。进程通过使用来自操作系统的系统调用请求内存块,操作系统会标记该进程正在使用的内存块。当使用该内存的进程执行完毕时,它必须将内存标记为空闲的,以便其他进程可以使用该内存。这被称为内存的取消分配。主流的操作系统实现通过系统调用(例如Linux中的brk和sbrk)提供抽象,这些函数直接与操作系统内核对话并分配进程请求的内存。但是这些内核级函数是非常低级的,因此它们会被系统库进一步抽象,例如glibc库,它是Linux中的C标准库,其中包括POSIX API的实现,通过C语言实现与操作系统底层的交互。

81.png 注意

可移植操作系统接口(Portable Operating System Interface,POSIX)是由Richard Stallman提出的。这是一组标准,规定了需要标准化什么功能、类UNIX操作系统应该提供什么功能、它们应该向C语言之类的语言公开什么底层API,它们应该包括什么命令行实用程序以及许多其他方面的内容。

glibc库还提供了内存分配器API,公开了用于分配内存的函数,例如用于分配内存的malloc、calloc和realloc函数,以及取消内存分配的free函数。即使我们有一些相当高级的API用于分配/解除分配内存,但是在我们使用低层级语言时仍需要自己管理内存。