Questions tagged «thread»


7
线程是否在Linux上实现为进程?
我正在阅读 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 在我的Ubuntu 16.04中是: main thread pid is 3615 child thread pid is 3615 ps 输出支持这一点。 我猜在2001年到现在之间一定有所改变。 下一页的下一个子章节4.5.1 Signal Handling建立在上一条语句的基础上: 信号和线程之间的交互行为在一个类UNIX系统之间有所不同。在GNU / Linux中,行为是由将线程实现为进程这一事实所决定的。 看起来这在本书的后面将变得更加重要。有人可以解释这是怎么回事吗? …

3
使用4.3内核创建线程失败,并显示“资源暂时不可用”
我在带有多个容器的Arch Linux(内核4.3.3-2)上运行docker服务器。自从我上次重启以来,Docker服务器和容器中的随机程序都崩溃,并显示一条消息,提示无法创建线程或(较不频繁)进行分叉。根据程序的不同,特定的错误消息也有所不同,但是大多数错误消息似乎都提到了特定的错误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。我还通过将(source)添加LimitSTACK=33554432到docker进程中,并通过查看docker容器并在其中运行来验证该限制是否适用。/etc/systemd/system/docker.service/proc/<pid of docker>/limitsulimit -s 每个线程都会占用一些内存。使用来配置虚拟内存限制ulimit -v。在我的系统上,它设置为unlimited,并且我3 GB的内存中有80%可用。 使用的进程数有限制ulimit -u。在这种情况下,线程被视为进程(source)。在我的系统上,限制设置为30306,对于docker守护程序和docker容器内部,限制为1048576。可以通过运行ls -1d /proc/*/task/* | wc -l或通过运行ps -elfT | wc -l(source)找出当前正在运行的线程数。在我的系统上,它们介于700和之间800。 打开文件的数量有限制,根据某些来源的资料,在创建线程时这也很重要。限制是使用配置的ulimit -n。在我的系统和docker内部,限制设置为1048576。可以使用lsof | wc -l(source)找出打开的文件数,在我的系统上大约是30000。 上次重启之前,我正在运行内核4.2.5-1,现在我正在运行4.3.3-2。降级到4.2.5-1可以解决所有问题。其他提到问题的帖子是this和this。我已经打开了Arch Linux的错误报告。 内核中发生了什么变化可能导致这种情况? 以下是一些示例错误消息: Crash dump was written to: erl_crash.dump Failed to create aux thread …
39 linux  docker  limit  fork  thread 

5
如何减少Linux上一个进程的所有线程(和子线程)?
Linux没有(还)遵循POSIX.1标准,它说的是一renice对过程的影响“的过程中所有的系统范围线程”,因为根据并行线程(7)DOC “线程不共用一个很好的价值。” 但是,有时,renice与给定进程相关的“一切” 可能很方便(一个示例是Apache子进程及其所有线程)。所以, 我怎么能renice全部线程属于给定进程? 我如何才能将renice所有子进程都属于给定进程? 我正在寻找一个相当简单的解决方案。 我知道流程组有时会有所帮助,但是,它们并不总是与我想做的事情相匹配:它们可以包含更广泛或不同的流程集。 使用cgroupManaged by systemd可能也有帮助,但是即使我有兴趣了解它,我也大多在寻找“标准”解决方案。 编辑:还说man (7) pthreads:“一个进程中的所有线程都放在同一线程组中;线程组的所有成员共享相同的PID”。那么,甚至renice没有它自己的PID的东西也可能吗?
22 linux  process  nice  thread 

3
Linux如何区分线程和子进程?
Linux实际上并不区分进程和线程,而是将两者实现为数据结构task_struct。 那么,Linux为某些程序提供了哪些功能,以使其从子进程中得知进程的线程?例如,是否可以查看Linux中某个进程具有的所有线程的详细信息? 谢谢。
21 linux  process  thread 

3
Linux内核线程真的是内核进程吗?
我在许多地方都读到Linux在Java VM中为每个用户线程创建一个内核线程。(我看到术语“内核线程”以两种不同的方式使用: 创建用于执行核心OS工作的线程,以及 操作系统知道的线程,并计划执行用户工作。 我说的是后一种。) 内核线程是否与内核进程相同,因为Linux进程支持父级和子级之间的共享内存空间,或者它确实是一个不同的实体?


1
Unix中的进程,内核线程,轻量级进程和用户线程之间是什么关系?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 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内核。 感谢当前的回复,但我希望重新打开该帖子,以便我可以接受其他回复。

5
线程与(分叉)进程
Linux应用程序通常派生然后执行(使用execve()),但是Java应用程序和某些Apache MPM使用线程。如果进行分叉,请使用fork + exec生成进程,线程的高级版本是什么?JVM或Worker MPM如何产生线程?
9 process  fork  thread 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.