Linux中的线程进程

Linux中的线程进程

我想知道创建新线程时发生的“惩罚”。

根据我对clone(2)、NPTL(新POSIX线程库)、CFS(完全公平调度程序)的理解,当创建一个新线程时,它被视为一个新进程,因为NPTL使用1:1线程模型。

从我所得到的关于调度程序,当新进程添加到运行队列时,fair_clock变量会增加到挂钟的一小部分。

通过使用 pthread_create(3) 探索仪式,克隆最终被调用,就像在 fork(2) 中一样。

现在,进程将具有 1:1 模型,线程也将具有 1:1 模型。那么,线程是否也会遭受这种情况同样的命运还有?显然,必须以某种形式对线程进行惩罚,否则多线程进程可能会通过填满 CFS 使用的 RR(循环)系统来占用大部分 CPU 时间。

如果这是的,那么使用线程相对于叉子有什么优点呢?它只是自动共享堆空间(而不是使用 shm_open(2))吗?

答案1

从我提供的关于 Completely Fair Scheduler 的链接中,我们看到内核 2.6.24 中有所谓的组调度。

引用 Chandandeep Singh Pabla 的话:

例如,假设系统中总共有 25 个可运行进程。 CFS 试图公平地为所有人分配 4% 的 CPU。然而,假设在这 25 个进程中,20 个属于用户 A,5 个属于用户 B。用户 B 处于固有的劣势,因为 A 比 B 获得更多的 CPU 能力。组调度试图消除这个问题。它首先尝试对一个群体公平,然后对该群体中的个人任务公平。因此,启用组调度的 CFS 会将 50% 的 CPU 分配给每个用户 A 和 B。A 分配的 50% 份额将分配给 A 的 20 个任务,而其他 50% 的 CPU 时间将公平分配B 的 5 项任务之一。

现在,这适用于上面的问题,因为当进程生成新线程时,它将位于该进程调度组中。这可以防止生成 1000 个线程的程序占用所有 CPU 时间,因为它只能获得该特定进程组运行时间的 1/1001(1000 个线程加上原始程序)。

因此,通过减慢线程相对于整个系统的时间,这会适当地惩罚线程应用程序。

相关内容