我对内核,进程和线程的工作方式存在误解:
因此,当我在Linux操作系统上运行一个进程(包含多个线程)时,检查" top -H"命令,我可以看到线程分布在多个核心上。
那么它如何运作? (相同进程的线程,共享相同的进程地址空间,在不同的内核上运行?)?
我想念的是什么?
由于
答案 0 :(得分:4)
Linux内核调度程序正在安排任务。请参阅this answer一个几乎相同的问题,该问题解释了哪些任务。
任务可以在某个单核上运行(在给定时刻)。调度程序可以将任务从一个核心移动到另一个核心(但很少这样做,因为预热核心及其L1缓存需要时间)。
多线程进程通常有几个任务(每个线程一个),通常可以在多个核心上运行。
你可能应该避免每个进程有大量的线程。我建议最多十几个线程,特别是如果它们中的一些是可运行的(但细节因硬件和系统而异)
答案 1 :(得分:1)
每次操作系统将CPU切换到另一个线程时,它都会为该线程设置CPU上的所有寄存器。这包括当前堆栈,内存访问权限,所有这些。
因此,当同一进程的两个线程在两个不同的CPU内核上运行时,每个内核都设置为访问该进程内存。
当操作系统确定其中一个线程占用了太多CPU时间时,它会挂起线程并将所有CPU寄存器复制到内存中。然后它将另一个线程加载到CPU内核中。