在 ps xf
26395 pts/78   Ss     0:00  \_ bash
27016 pts/78   Sl+    0:04  |   \_ unicorn_rails master -c config/unicorn.rb                                           
27042 pts/78   Sl+    0:00  |       \_ unicorn_rails worker[0] -c config/unicorn.rb                                        
Run Code Online (Sandbox Code Playgroud)
在 中htop,它显示为:

为什么 htop 显示的进程比 ps 多?
我正在阅读这本书,Mark Mitchell、Jeffrey Oldham 和 Alex Samuel 合着的Advanced Linux Programming。2001年的,有点老了。但无论如何我觉得它非常好。
但是,我发现它与我的 Linux 在 shell 输出中产生的不同。在第 92 页(查看器中的第 116 页),第 4.5 章 GNU/Linux 线程实现以包含以下语句的段落开头:
GNU/Linux 上 POSIX 线程的实现在一个重要方面不同于许多其他类 UNIX 系统上的线程实现:在 GNU/Linux 上,线程被实现为进程。
这似乎是一个关键点,稍后用 C 代码进行说明。书中的输出是:
main thread pid is 14608
child thread pid is 14610
Run Code Online (Sandbox Code Playgroud)
在我的 Ubuntu 16.04 中,它是:
main thread pid is 3615
child thread pid is 3615
Run Code Online (Sandbox Code Playgroud)
ps 输出支持这一点。
我想从 2001 年到现在,肯定发生了一些变化。
下一页的下一个子章节 4.5.1 信号处理建立在上一条语句的基础上:
信号和线程之间的交互行为因类 UNIX 系统而异。在 GNU/Linux 中,行为是由线程作为进程实现的事实决定的。
看起来这在本书后面会更加重要。有人可以解释这里发生了什么吗?
我见过这个Linux 内核线程真的是内核进程吗?,但这并没有多大帮助。我糊涂了。
这是C代码: …
我正在 Arch Linux(内核 4.3.3-2)上运行一个带有多个容器的 docker 服务器。自从我上次重新启动后,容器内的 docker 服务器和随机程序都崩溃了,并显示一条关于无法创建线程或(较少)fork 的消息。具体的错误信息因程序而异,但大多数似乎都提到了具体的错误Resource temporarily unavailable。有关一些示例错误消息,请参见本文末尾。
现在有很多人收到了这个错误信息,并且有很多人对他们做出了回应。真正令人沮丧的是,每个人似乎都在猜测如何解决问题,但似乎没有人指出如何确定存在问题的众多可能原因中的哪一个。
我收集了这 5 个可能的错误原因以及如何验证它们不存在于我的系统中:
/proc/sys/kernel/threads-max( source ) 中配置的线程数有系统范围的限制。在我的情况下,这设置为60613.ulimit -s( source )配置的。我的壳的极限曾经是8192,但我已经通过将增加其* soft stack 32768成/etc/security/limits.conf,因此它ulimit -s现在的回报32768。我也增加了它的码头工人,过程将LimitSTACK=33554432进入/etc/systemd/system/docker.service(源,和我核实,该限制适用通过查看/proc/<pid of docker>/limits,并通过运行ulimit -s一个泊坞窗容器内。ulimit -v. 在我的系统上,它设置为unlimited,并且我的 3 GB 内存中有 80% 是空闲的。ulimit -u。在这种情况下,线程算作进程(源)。在我的系统上,限制设置为30306 …Linux没有(还)遵循POSIX.1标准,它说的是一renice对过程的影响“的过程中所有的系统范围线程”,因为根据并行线程(7)文档“线程不共用一个很好的价值。”
然而,有时,renice与给定进程相关的“一切”可能很方便(一个例子是 Apache 子进程及其所有线程)。所以,
renice所有线程?renice所有子进程?我正在寻找一个相当简单的解决方案。
我知道流程组有时会有所帮助,但是,它们并不总是符合我想要做的:它们可以包含更广泛或不同的流程集。
使用cgroupmanaged bysystemd也可能会有所帮助,但即使我有兴趣了解它,我也主要寻找“标准”解决方案。
编辑:还有,man (7) pthreads说“一个进程中的所有线程都放在同一个线程组中;线程组的所有成员共享同一个 PID”。那么,甚至有可能renice没有自己的 PID 吗?
Linux 实际上并不区分进程和线程,而是将两者都实现为一种数据结构task_struct。
那么,Linux 为某些程序提供了什么来让它们从子进程中区分进程的线程?例如,有没有办法查看进程在 Linux 中拥有的所有线程的详细信息?
谢谢。
我在很多地方读到 Linux 为 Java VM 中的每个用户线程创建一个内核线程。(我看到术语“内核线程”以两种不同的方式使用:
我说的是后一种。)
内核线程是否与内核进程相同,因为 Linux 进程支持父子进程之间的共享内存空间,还是真的是一个不同的实体?
$ ps -e -T | grep myp | grep -v grep
  797   797 ?        00:00:00 myp
  797   798 ?        00:00:00 myp
  797   799 ?        00:00:00 myp
  797   800 ?        00:00:00 myp
Run Code Online (Sandbox Code Playgroud)
这显示了mypPID = 797的进程和具有不同 SPID 的四个线程。
如何在不杀死整个进程的情况下杀死进程的特定线程。我知道在某些情况下,当对该特定线程存在致命依赖时,这可能根本不可能。但是,在任何情况下都可能吗?是的,如何?
我试过kill 799了,过程本身就终止了。现在我不确定这是因为有依赖项在myp没有进程的情况下导致失败,800或者因为 kill 很简单,无法杀死单个进程。
Vahalia 的 Unix Internal 有图表显示了进程、内核线程、轻量级进程和用户线程之间的关系。本书主要关注 SVR4.2,并详细探讨了 4.4BSD、Solaris 2.x、Mach 和 Digital UNIX。请注意,我不是在询问 Linux。
对于每个流程,该流程背后是否始终存在一个或多个轻量级流程?图 3.4 似乎是肯定的。
为什么图 3.5(a) 显示进程直接位于 CPU 之上,中间没有轻量级进程?
对于每个轻量级进程,在轻量级进程下是否总是只有一个内核线程?图 3.4 似乎是肯定的。
为什么图 3.5(b) 直接在进程之上显示轻量级进程,中间没有任何内核线程?
内核线程是唯一可以调度的实体吗?
轻量级进程是否仅通过调度底层内核线程来间接调度?
进程是否仅通过调度底层轻量级进程来间接调度?
更新:
我问了一个类似的问题 Linux是一个轻量级进程附加到 Linux 中的内核线程吗? 我猜可能是因为操作系统概念这本书隐含地介绍了使用 Unix 的概念,而 Unix 和 Linux 可能有所不同,所以我阅读了 Unix 内核。
我感谢当前的回复,但我希望重新打开帖子,以便我可以接受其他回复。
我正在尝试了解 Linux 进程。我对各自的术语感到困惑pid_max,ulimit -u和thread_max。
这些术语之间究竟有什么区别?有人可以澄清这些差异吗?