[OS]Three Easy Pieces Chapter 14

Interlude: Memory API

本章介绍UNIX系统中内存相关的API。

1 Types of Memory

在c程序中,有两种类型的内存

  • 栈内存

    栈内存,也被称为自动存储内存,由编译器隐式的申请和释放。

  • 堆内存

    由程序员手动的通过malloc和free申请和释放。

2 The malloc() Call

1
void *malloc(size_t size);

该函数比较简单,在堆上申请指定大小字节的内存,并返回该内存的地址。失败的话,返回 NULL.

通常情况下会搭配 sizeof() 运算符一起使用。之所以是运算符而不是函数调用是因为 sizeof() 求值通常发生在编译期,而不是运行期。

3 The free() Call

1
void free(void *ptr);

4 Underlying OS Support

有一个系统调用叫做 brk,用于改变程序break的位置,即堆(heap)结束的位置。brk 接受一个参数(新的break地址),可以根据新地址与当前break的位置关系来增大或缩小堆的大小:如果新的break位置比当前的位置大,堆会扩展;如果小,堆会缩小。

另一个相关的系统调用是 sbrk,它接受一个增量值作为参数,用于在现有堆的基础上增加或减少一定的内存大小,功能与 brk 类似。

此外,还可以通过 mmap() 系统调用从操作系统获取内存。通过传入合适的参数,mmap() 可以在程序中创建一个匿名内存区域——这个区域不与任何特定文件关联,而是与交换空间相关。这种内存区域也可以像堆一样进行管理和使用。更多细节可以查阅 mmap() 的手册页。

5 Other Calls

calloc()

申请内存并初始化为0.

realloc()

修改某片申请的内存的大小,可能涉及到内存的拷贝。


[OS]Three Easy Pieces Chapter 14
https://erlsrnby04.github.io/2024/11/01/OS-Three-Easy-Pieces-Chapter-14/
作者
ErlsrnBy04
发布于
2024年11月1日
许可协议