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