了解 pid_max、ulimit -u 和 thread_max 之间的区别

了解 pid_max、ulimit -u 和 thread_max 之间的区别

我正在尝试了解 Linux 进程。我对各自的术语pid_maxulimit -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 强制执行。

相关内容