我正在尝试了解 Linux 进程。我对各自的术语pid_max
和ulimit -u
感到困惑thread_max
。
这些术语到底有什么区别?有人可以澄清这些差异吗?
答案1
抱歉,接受的答案在几个方面都是错误的信息。
/proc/sys/kernel/pid_max
与任何给定时间可以运行的最大进程数无关。事实上,它是内核可以分配的最大数字进程标识符。
在Linux内核中,进程和线程是同一回事。内核以相同的方式处理它们。它们都占用task_struct数据结构中的一个槽。按照常见术语,线程是 Linux 中与另一个进程共享资源的进程(它们还将共享线程组 ID)。就调度程序而言,Linux 内核中的线程很大程度上是一个概念构造。
既然您了解内核在很大程度上不区分线程和进程,那么/proc/sys/kernel/threads-max
实际上是数据结构 task_struct 中包含的最大元素数应该更有意义。这是包含进程列表(或者可以称为任务列表)的数据结构。
顾名思义,ulimit 是每个用户的限制。该-u
标志被定义为“单个用户可用的最大进程数”。 task_struct 的元素包含创建任务的用户的 uid。每次从task_struct添加/删除任务时,都会维护每个uid的计数并递增/递减。因此,ulimit -u
表示在任何给定时间允许一个特定用户在 task_struct 中拥有的最大元素(进程)数量。
我希望事情能够澄清。
答案2
让我们了解进程和线程之间的区别。按照这关联,
典型的区别是(同一进程的)线程在共享内存空间中运行,而进程在单独的内存空间中运行。
现在,我们有了pid_max
可以确定的参数,如下所示。
cat /proc/sys/kernel/pid_max
所以上面的命令返回32,768这意味着我可以执行32,768我的系统中同时运行的进程可以在单独的内存空间中运行。
现在,我们有了threads-max
可以确定的参数,如下所示。
cat /proc/sys/kernel/threads-max
上面的命令返回的输出为126406这意味着我可以拥有126406共享内存空间中的线程。
现在,让我们采用第三个参数ulimit -u
,它表示用户在特定时间可以拥有的总进程。上面的命令返回的输出为63203。这意味着对于用户在某个时间点创建的所有进程,用户可以拥有63203进程正在运行。
假设案例
因此,假设有 2 个进程同时由 2 个用户运行,并且每个进程都大量消耗内存,那么这两个进程都会有效地使用63203进程的用户限制。因此,如果是这种情况,这 2 个用户将有效地用完整个126406 threads-max
尺寸。
现在,我需要确定用户在任何时间点可以运行多少个进程。这可以从文件中确定。/etc/security/limits.conf
因此,该文件中基本上有 2 个设置,如上所述这里。
A软限制就像一个警告和硬限制是一个实际最大限制。例如,以下将阻止学生组中的任何人拥有超过 50 个进程,并在 30 个进程时发出警告。
@student hard nproc 50
@student soft nproc 30
硬限制由内核维护,而软限制由 shell 强制执行。