c - Redhat 7.1 内核进程堆栈大小从 8K 到 16KB

标签 c linux linux-kernel redhat

阅读 Redhat 7.1 的发行说明,我读到:

Process Stack Size Increased from 8KB to 16KB
Since Red Hat Enterprise Linux 7.1, the kernel process stack size has been increased from 8KB to 16KB to help large processes that use stack space.

我知道内核进程堆栈是常驻内存并且在创建进程时进行分配并且内存需要是连续的,在页面大小为 4096 字节的 x86_64 中,内核将需要为进程堆栈找到 4 页,共 2 页。

当内核内存碎片化时,此功能会成为问题吗? 使用一个进程内核堆栈大小,当内存碎片化时,是否更容易在创建进程时出现问题?

最佳答案

内核经常需要分配一组物理上连续的页面。这在分配缓冲区(驱动程序需要进行数据传输,例如 DMA)或创建进程堆栈时可能是必需的。

通常,为了满足此类要求,内核会尝试通过分配物理上连续的页面来避免碎片化,并且额外释放的页面被合并/分组为更大的物理上连续的页面组(如果可用)。这是由内存管理子系统和伙伴分配器处理的。现在,当程序开始执行时创建堆栈(RHEL7 中的 8k16k)。

如果内核无法获得或分配一组请求的物理连续页面(假设 4k 页面大小,8k 堆栈为 2 个或 16k 堆栈为 4 个),那么这可能会导致 页面分配失败,顺序:2。 (即 2^2=4 页 * 4K)。顺序取决于您请求的物理连续页面的大小。我们可以在发生页面分配失败的时候观察/proc/buddyinfo文件,它可以显示物理内存被碎片化的迹象。

关于c - Redhat 7.1 内核进程堆栈大小从 8K 到 16KB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30064061/

相关文章:

c - 设置段错误处理程序

.net - 在 C# 中调用 C 函数并获取字符串输出

c - 如何在不分配内存的情况下将指针从 CUDA 返回到 C?

linux - 如何读取LXR?

linux - 内核 Oops 页错误,页表损坏

linux-kernel - printk - 显示在消息日志中但不显示在任何内核日志级别的终端中

c - 以十六进制覆盖 exe 的字节

c++ - 在 C/C++ : is it possible? 中分配 CPU 缓存中的静态内存

linux - 数以千计的 cAdvisor Docker 容器被创建,直到磁盘空间不足

linux - 构建内核补丁 : Error MODPOST 0