为什么 malloc() 被视为库调用而不是系统调用?

Izz*_*zzo 6 c linux system-calls

为什么 malloc() 被视为标准 C 库函数而不是系统调用?操作系统似乎负责处理所有内存分配请求。

Kei*_*son 7

当然可以将andmalloc作为系统调用来实现free,但很少这样做。

系统调用是对操作系统内核的调用。例如,在 POSIX 系统(Linux、UNIX...)上,readwrite是系统调用。当 C 程序调用 时read,它可能会调用一个包装器,该包装器会执行向内核发出请求所需的任何操作,然后将结果返回给调用者。

事实证明,进行内存管理的最有效方法是使用较低级别的系统调用(请参阅brksbrk)来扩展当前进程的数据段,然后使用库调用(mallocfree等)来管理该段内的内存。该管理不需要与内核进行任何交互;这只是在当前进程中执行的指针操作。该malloc函数将调用系统调用,例如brksbrk如果它需要比当前可用的内存更多的内存,但许多malloc调用根本不需要与内核进行任何交互。

上面的内容是针对 Linux/POSIX/UNIX 系统的。例如,Windows 的细节会有所不同,但总体设计可能相似。

请注意,某些 C 标准库函数通常直接作为系统调用实现。time就是一个例子(但正如 Nick ODell 在评论中指出的那样,time通常可以在不与内核交互的情况下执行调用)。

  • @NickODell 我有法律义务指出你拼错了“Pedantic”。 (4认同)