[OS]Three Easy Pieces Chapter 14
Interlude: Memory API
本章介绍UNIX系统中内存相关的API。
1 Types of Memory
在c程序中,有两种类型的内存
栈内存
栈内存,也被称为自动存储内存,由编译器隐式的申请和释放。
堆内存
由程序员手动的通过malloc和free申请和释放。
2 The malloc()
Call
1 |
|
该函数比较简单,在堆上申请指定大小字节的内存,并返回该内存的地址。失败的话,返回 NULL
.
通常情况下会搭配 sizeof()
运算符一起使用。之所以是运算符而不是函数调用是因为 sizeof()
求值通常发生在编译期,而不是运行期。
3 The free()
Call
1 |
|
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/