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

推荐答案

mallocfree作为系统调用来实现当然是possible,但这种方式很少.

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

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

以上内容相当特定于Linux/POSIX/UNIX系统.例如,Windows的细节会有所不同,但总体设计可能会相似.

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

C相关问答推荐

为什么 memcpy() 随机不复制正确的值?

为什么启用优化时 GCC 11 编译器会产生奇怪的输出?

Gnuplot 和 C - 绘制不同的符号/ colored颜色

在 C 中使用数组而不是向量

幂函数给出的答案与 C 中的 math.pow 函数不同

确定在嵌入式 C 中运行时使用哪个变量

在编译时构建静态数组

判断由大括号组成的输入字符串是否格式正确

通过默认网关地址的硬件地址而不是以太网多播地址发送多播

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

为什么使用 MOV 指令将 XOR 交换优化为普通交换?