据我所知,在Linux内核中,
该结构
task_struct
代表线程,即轻量级进程,但不是进程。进程不由任何结构表示,而是由共享相同线程组 ID 的线程组表示。
以下内容也是如此操作系统概念正确的?
Linux 还提供了使用系统调用创建线程的能力
clone()
。然而,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 应用程序上,进程数量可能会超过此限制并导致应用程序失败。