Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么Linux机器上的堆栈大小几乎总是132KiB?_C_Linux - Fatal编程技术网

C 为什么Linux机器上的堆栈大小几乎总是132KiB?

C 为什么Linux机器上的堆栈大小几乎总是132KiB?,c,linux,C,Linux,下面的命令计算Linux机器上每个正在运行的进程的堆栈大小 # find /proc -maxdepth 1 -type d -regex '/proc/[0-9]*' -exec cat '{}'/maps \; | grep stack | cut -d' ' -f1 | gawk --non-decimal-data 'BEGIN{FS="-"} {printf "%d\n", (("0x" $2) - ("0x" $1))/1024}' | sort 几乎在所有情况下,堆栈的大小都是1

下面的命令计算Linux机器上每个正在运行的进程的堆栈大小

# find /proc -maxdepth 1 -type d -regex '/proc/[0-9]*' -exec cat '{}'/maps \; | grep stack | cut -d' ' -f1 | gawk --non-decimal-data 'BEGIN{FS="-"} {printf "%d\n", (("0x" $2) - ("0x" $1))/1024}' | sort

几乎在所有情况下,堆栈的大小都是132KiB。为什么这个号码这么特别?这是堆栈的最小可能大小吗?

内核将新进程堆栈设置为128kB,以:


当您添加一个4kB的保护页时,总大小为132kB。如果这个过程从来没有使用过这么多的堆栈,它就不会被扩展到这个大小。

它可能是用GCC编译的C和C++程序的最小值,这意味着大多数Linux程序。很少有程序超过它的原因是,在编写良好的C和C++程序中,调用栈不是很深,递归没有被广泛使用,并且非平凡对象被分配在空闲存储区上。只要运行进程的数量不是很大,就超过了最大命令行大小,您只需执行
cat/proc/*/maps | grep…
相关操作,请参见OSS安全邮件列表。它展示了一些巧妙的技巧,而且它对保护页面的谴责也相当严重。令人惊讶的是,他们有这么多的操作系统。在这种情况下,“随机”意味着什么?在这种情况下,“随机”意味着选择值仅仅是因为需要一个值,而不是因为任何类型的研究来确定什么是最佳初始值。最初的程序员没有特定的理由选择那个特定的值。欢迎使用许多程序员使用的口语英语。
stack_expand = 131072UL; /* randomly 32*4k (or 2*64k) pages */