将malloc
和free
作为系统调用来实现当然是possible,但这种方式很少.
系统调用是对操作系统内核的调用.例如,在POSIX系统(Linux、UNIX等)上,read
和write
是系统调用.当一个C程序调用read
时,它可能正在调用一个包装器,该包装器执行向内核发出请求所需的任何操作,然后将结果返回给调用者.
事实证明,进行内存管理的最有效方法是使用较低级别的系统调用(参见brk
和sbrk
)来扩展当前进程的数据段,然后使用库调用(malloc
、free
等)来管理该段中的内存.这种管理不需要与内核进行任何交互;所有这些都只是在当前进程中执行的指针操作.如果malloc
函数需要比当前可用的内存更多的内存,它将调用系统调用,例如brk
或sbrk
,但许多malloc
调用根本不需要与内核进行任何交互.
以上内容相当特定于Linux/POSIX/UNIX系统.例如,Windows的细节会有所不同,但总体设计可能会相似.
注意,一些C标准库函数are通常直接作为系统调用实现.time
就是一个例子(但正如Nick ODell在 comments 中指出的,time
调用通常可以在不与内核交互的情况下执行).