我有一个关于 Linux 上 pthread 实现的问题。
假设一个进程有 5 个线程。现在调度程序如何看到这些线程(或根本看不到)。例如,当调用调度程序时,它是否只调度主进程,然后由主进程负责在其每个线程之间进行调度。
或者是另一种方式,调度程序调度每个线程,就好像它是一个单独的进程一样。
我有一个关于 Linux 上 pthread 实现的问题。
假设一个进程有 5 个线程。现在调度程序如何看到这些线程(或根本看不到)。例如,当调用调度程序时,它是否只调度主进程,然后由主进程负责在其每个线程之间进行调度。
或者是另一种方式,调度程序调度每个线程,就好像它是一个单独的进程一样。
对于现代 Linux(NPTL pthread 实现),调度程序调度线程,线程被认为是“轻量级进程”。pthread_create 是根据clone
系统调用实现的。
Linux schedules every thread as if it is a Process with scope as PTHREAD_SCOPE_SYSTEM. The nptl implementation can utilize multiple CPUs.
正如洛根所说,每个线程都是独立调度的。
但是,如果您希望可以使用 Linux 进程控制组来调度线程组。
进程控制组使调度效率低一些,但它可以更加公平。
一种非常流行的用途是将每个 TTY 创建的所有进程和线程放入每个 TTY 的控制组中。这导致用户的所有图形应用程序都被安排在与他在终端窗口中启动的 24 线程内核编译相同的级别。图形应用程序获得 50%,编译获得 50%。如果他打开另一个终端窗口并开始用另外 24 个线程编译 glibc,它将转移到 33% 的桌面应用程序、33% 的内核编译和 33% 的 glibc 编译。