我们可以在没有系统调用的情况下进行动态内存分配吗?
Can we do dynamic memory allocation, without system calls?
有没有什么方法可以让用户进程在不使用系统调用的情况下进行动态内存分配?我知道 malloc 使用 brk() 或 mmap() 系统调用来分配内存。
Can we do dynamic memory allocation, without system calls?
实际上,对于大多数(但不是全部)操作系统,是的。
具体来说,如果您在“.bss”部分保留了很大的区域,那么大多数操作系统在写入之前不会为该区域分配物理 RAM,并且您可以实现某种堆("malloc()") 使用保留的巨大区域。
注意:虽然这可以避免为系统调用切换 to/from 内核,但不能避免为页面错误切换 to/from 内核。
I know malloc uses brk() or mmap() system calls to allocate memory.
那是 "language run-time specific" 的事情。没有理由(对于像 C 这样的语言)标准库不能做同样的 "huge reserved section" 技巧;没有理由你不能编写一个根本不使用 "malloc()" 的程序(我目前用 C 编写的程序这样做是因为 "malloc()" 是一个令人讨厌的破烂),并且没有不同语言的原因(例如,可能是像 LISP 这样基于堆栈的东西?)有什么可怕的 POSIX/C 混乱。
有没有什么方法可以让用户进程在不使用系统调用的情况下进行动态内存分配?我知道 malloc 使用 brk() 或 mmap() 系统调用来分配内存。
Can we do dynamic memory allocation, without system calls?
实际上,对于大多数(但不是全部)操作系统,是的。
具体来说,如果您在“.bss”部分保留了很大的区域,那么大多数操作系统在写入之前不会为该区域分配物理 RAM,并且您可以实现某种堆("malloc()") 使用保留的巨大区域。
注意:虽然这可以避免为系统调用切换 to/from 内核,但不能避免为页面错误切换 to/from 内核。
I know malloc uses brk() or mmap() system calls to allocate memory.
那是 "language run-time specific" 的事情。没有理由(对于像 C 这样的语言)标准库不能做同样的 "huge reserved section" 技巧;没有理由你不能编写一个根本不使用 "malloc()" 的程序(我目前用 C 编写的程序这样做是因为 "malloc()" 是一个令人讨厌的破烂),并且没有不同语言的原因(例如,可能是像 LISP 这样基于堆栈的东西?)有什么可怕的 POSIX/C 混乱。