当前位置:   article > 正文

【翻译】 2.6 中的 4K 堆栈 [发布于 2004 年 5 月 12 日,作者:corbet

【翻译】 2.6 中的 4K 堆栈 [发布于 2004 年 5 月 12 日,作者:corbet
传统上,Linux 内核在大多数架构上都使用 8KB 内核堆栈。 该堆栈必须满足系统调用可能产生的任何调用序列,以及可能同时调用的任何(硬或软)中断处理程序的需要。 实际上,在稳定的内核中,堆栈溢出的情况几乎闻所未闻;内核开发人员早已学会避免使用大型自动变量、递归函数和其他会占用大量堆栈空间的东西。

将内核堆栈减少到 4KB 的补丁已经流传了一段时间。 人们普遍认为,向更小的堆栈转换将在某一时刻实现;因此,最近很多人都在努力寻找内核中过度占用堆栈空间的代码路径。 其中一部分工作就是进行大量测试;因此,最近的 -mm 内核甚至不再提供 8KB 堆栈选项。 我们希望,如果有足够多的人试用较小的堆栈并解决了其中的错误,4KB 堆栈就能在不久的将来并入 2.6。

对一些人来说,较小的堆栈是可怕的,因为很难确定内核中所有可能的路径是否都经过了测试。4KB 堆栈也会破坏二进制模块,尤其是 nVidia 驱动程序。 因此,将这一改动推迟到 2.7 版有一定的压力。

人们很可能会问,为什么内核黑客们要把这种改动放到稳定的内核系列中呢? 8KB 堆栈的问题在于它需要 "阶 1 "内存分配:物理内存中连续的两个页面。 当系统运行一段时间后,"阶 1 "分配就很难满足要求了;物理内存可能会变得非常零碎,以至于两个相邻的空闲页面根本不存在。 内核会努力释放页面以满足更大的分配要求;结果可能是系统变得缓慢、痛苦和崩溃。

系统中的每个进程都有自己的内核堆栈,当该进程运行时,只要系统进入内核模式,就会使用内核堆栈。 由于每个进程都需要一个内核堆栈,因此创建一个新进程需要 1 次分配。 因此,即使整个系统并不特别缺乏资源,双页内核堆栈也会限制新进程的创建。 将内核堆栈缩减为单页后,这个问题就迎刃而解了,Linux 系统在任何时候都能轻松处理更多的进程。

Arjan van de Ven 还提出了一个有趣的说法:4KB 的堆栈实际上更安全。 他的理由与 4KB 堆栈补丁的另一个方面有关:它将中断处理移到了一个单独的专用堆栈上。 软件中断也有自己的堆栈。 由于中断处理已从每个进程的内核堆栈中移出,系统调用处理的空间保持不变,而中断的堆栈空间则有所增加。

整合 4KB 堆栈的最终决定尚未做出,似乎还有一些问题需要解决。 不过,如果情况稳定下来,这一相当重大的变化可能会被合并到 2.6 中。

本文索引条目
内核内核堆栈


(登录后发表评论)

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号