Linux不区分进程和线程吗?

Linux不区分进程和线程吗?

据我所知,在Linux内核中,

  • 该结构task_struct代表线程,即轻量级进程,但不是进程。

  • 进程不由任何结构表示,而是由共享相同线程组 ID 的线程组表示。

以下内容也是如此操作系统概念正确的?

Linux 还提供了使用系统调用创建线程的能力clone()。然而,Linux不区分进程和线程。实际上,当提及程序内的控制流时,Linux 使用术语“任务”,而不是“进程”或“线程”。

这是什么意思?

谢谢。

有关的Linux 如何区分线程和子进程?

答案1

Linux 还提供了使用clone() 系统调用创建线程的能力。然而,Linux 并不区分进程和线程。事实上,Linux 在指代程序内的控制流时使用术语“任务”,而不是“进程”或“线程”。

我们需要区分实际的实现和你看到的表面。

从用户(系统软件开发人员)的角度来看,有一个很大的区别:线程共享许多公共资源(例如内存映射 - 当然除了堆栈 - 文件描述符)。

Linux 内部(警告:不精确的挥手争论)核心1)正在使用它手头的东西,即进程和线程的相同结构,其中对于单个进程的线程,它不重复某些东西,而是引用其单个实例(内存映射描述)。

因此,在直接表示线程或进程的层面上,基本结构没有太大区别,问题在于如何处理信息。

您可能还有兴趣阅读Linux 上的线程是作为进程实现的吗?


1)请记住,现在的“Linux”主要代表整个操作系统,而实际上它只是内核本身。

答案2

Linux 线程被实现为一个单独的进程,但与其他线程共享相同的地址空间。默认情况下,它们隐藏在ps命令中,但可以通过标志看到-L

例如:

% ps -fp 2642
UID        PID  PPID  C STIME TTY          TIME CMD
polkitd   2642     1  0 Dec09 ?        00:00:48 /usr/lib/polkit-1/polkitd --no-d

% ps -fLp 2642
UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
polkitd   2642     1  2642  0    7 Dec09 ?        00:00:18 /usr/lib/polkit-1/pol
polkitd   2642     1  2680  0    7 Dec09 ?        00:00:00 /usr/lib/polkit-1/pol
polkitd   2642     1  2683  0    7 Dec09 ?        00:00:30 /usr/lib/polkit-1/pol
polkitd   2642     1  2685  0    7 Dec09 ?        00:00:00 /usr/lib/polkit-1/pol
polkitd   2642     1  2687  0    7 Dec09 ?        00:00:00 /usr/lib/polkit-1/pol
polkitd   2642     1  2688  0    7 Dec09 ?        00:00:00 /usr/lib/polkit-1/pol
polkitd   2642     1  2692  0    7 Dec09 ?        00:00:00 /usr/lib/polkit-1/pol

我们可以看到它polkitd实际上由 7 个线程组成。它们都具有相同的进程 ID,但具有不同的线程 ID (LWP),但在列表中显示为不同的进程ps,因为它们是内核中的不同进程。

这可能会产生影响,例如对ulimit约束的影响。 RedHat 及其衍生产品上的一个常见问题是默认 PAM 配置限制了您的进程

% cat /etc/security/limits.d/20-nproc.conf 
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

*          soft    nproc     4096
root       soft    nproc     unlimited

在大型 Java Web 应用程序上,进程数量可能会超过此限制并导致应用程序失败。

相关内容