![]() |
1
43
Linux执行延迟页面分配,也称为“延迟页面分配”乐观内存分配'。从malloc返回的内存没有任何支持,当您触摸它时,实际上可能会得到一个OOM条件(如果您请求的页面没有交换空间),在这种情况下 a process is unceremoniously terminated . http://www.linuxdevcenter.com/pub/a/linux/2006/11/30/linux-out-of-memory.html |
![]() |
2
16
9. Memory (部分 The Linux kernel , Some remarks on the Linux Kernel 安德里斯·布劳沃(Andries Brouwer)是一份很好的文件。 它包含以下程序,演示Linux对物理内存和实际内存的处理,并解释内核的内部结构。 通常,在malloc()返回NULL之前,第一个演示程序将获得大量内存。第二个演示程序将获得更小的内存量,因为先前获得的内存已被实际使用。第三个程序将获得与第一个程序相同的大量数据,然后在需要使用其内存时被杀死。 演示程序1:不使用内存分配内存。
演示程序2:分配内存并实际触摸所有内存。
演示程序3:首先分配,然后使用。
(在运行良好的系统上,如 Solaris |
![]() |
3
11
这开始有点离题(然后我会把它和你的问题联系起来),但发生的情况与在Linux中分叉进程时发生的情况类似。分叉时,有一种称为写时复制的机制,当内存也被写入时,它只为新进程复制内存空间。这样,如果forked process exec立即是一个新程序,那么您就节省了复制原始程序内存的开销。 回到你的问题上来,想法是相似的。正如其他人所指出的,请求内存会立即获得虚拟内存空间,但实际页面仅在写入时分配。 这样做的目的是什么?它基本上使mallocing内存或多或少成为一个常量时间操作大O(1)而不是大O(n)操作(类似于Linux调度器将其工作分散开来而不是在一大块中进行)。 为了证明我的意思,我做了以下实验:
.
.
|
![]() |
4
6
Malloc从libc管理的块中分配内存。当需要额外的内存时,库使用brk系统调用进入内核。 内核将虚拟内存页分配给调用进程。页面作为流程拥有的资源的一部分进行管理。当内存被阻塞时,不会分配物理页。当进程访问其中一个brk'd页面中的任何内存位置时,会发生页面错误。内核验证虚拟内存是否已分配,并继续将物理页映射到虚拟页。 页面分配不仅限于写操作,而且与写时复制完全不同。任何访问(读或写)都会导致页面错误和物理页面的映射。
|
![]() |
5
5
在Windows上,页面已提交(即可用的可用内存下降),但在触摸页面(读或写)之前,不会实际分配页面。 |
![]() |
6
2
|
![]() |
altair00 · 使用“realloc”调整现有阵列的大小` 2 年前 |
![]() |
cobb208 · Malloc正在为释放指针引发错误 2 年前 |
![]() |
mbilyanov · 比较C中动态分配的字符串 2 年前 |
![]() |
Jaques · “.exe”已触发断点 6 年前 |
|
Ultraviolence · 在C中使用malloc分配动态内存 6 年前 |
![]() |
Andre · C分段错误:函数中的fscanf 6 年前 |
![]() |
Gameatro · 为什么malloc在函数内部调用时返回空指针? 7 年前 |