为什么Linux同时需要pid_max和threads-max?

为什么Linux同时需要pid_max和threads-max?

/proc/sys/kernel/pid_max我明白和之间的区别/proc/sys/kernel/threads-max。答案中有一个很好的解释 了解 pid_max、ulimit -u 和 thread_max 之间的区别:

/proc/sys/kernel/pid_max与任何给定时间可以运行的最大进程数无关。事实上,它是内核可以分配的最大数字进程标识符。

在Linux内核中,进程和线程是同一回事。内核以相同的方式处理它们。它们都占用task_struct数据结构中的一个槽。按照常见术语,线程是 Linux 中与另一个进程共享资源的进程(它们还将共享线程组 ID)。就调度程序而言,Linux 内核中的线程很大程度上是一个概念构造。

既然您了解内核在很大程度上不区分线程和进程,那么 /proc/sys/kernel/threads-max实际上是数据结构 task_struct 中包含的最大元素数应该更有意义。这是包含进程列表(或者可以称为任务列表)的数据结构。

然而,实际上,两者都限制了主机上并发线程的最大数量。据我了解,这个数字将是pid_max和的最小值threads-max。那么为什么两者都需要呢?

据我了解,默认值pid_max基于可能的 CPU 数量机器的默认值threads-max源自页数。但既然两者具有相同的效果,Linux 就不能只有一个值是两者中的最小值吗?

答案1

这些设置不具有相同的效果:

  • threads-max限制可以同时实例化的进程数量
  • pid_max限制分配给进程的标识符

threads-max限制最终分配给task_struct实例的内存量。pid_max确定 pid 何时滚动(如果有)。

约束pid_max不会影响内存消耗(据我所知,除非大量 pid 最终存储为文本),并且最终可能会影响性能,因为一旦达到新的 pid 就很难找到pid_max。较低的值pid_max还会增加给定时间段内 pid 重用的可能性。

相关内容