在谈论 Linux 内核时,“stack hog”是什么意思?
我在一些 linux 内核书籍(Wolfgang Mauerer 的 Professional Linux Kernel Architecture)上读到了这个概念,但是“stack hog”到底是什么意思?谢谢。
“Stack hog”是一个非正式名称,用于描述使用大量自动存储的函数(又名“堆栈”)。究竟什么算作“占用”因执行环境而异:通常,内核级函数对堆栈空间有更严格的限制——只有几千字节,因此在内核模式下被认为是“占用堆栈”的函数可能会变成“好”公民”在用户模式下。
函数成为堆栈占用的一个常见原因是在自动内存中分配缓冲区或其他数组。这更方便,因为您不需要记住释放内存并检查分配结果。您还可以在分配本身上节省一些 CPU 周期。不利的一面是堆栈溢出的可能性,这会导致内核级程序出现恐慌。这就是为什么“堆栈占用”的常见补救措施是将一些缓冲区移动到动态内存中的原因。
Linux 内核使用 4K 堆栈。使用过多的小空间被认为是一种猪。如果你“懒惰”并且在堆栈上分配一个缓冲区,或者有一个带有大量参数的函数,那就是猪。
堆栈必须保存为系统调用提供服务所需的任何调用序列以及可能被调用的任何中断处理程序。因此,节省堆栈空间非常重要。