调度线程有什么区别?

问题描述

我目前正在学习线程的同步多线程、多核和多处理器调度。查了一些资料,我的理解是:

如果有支持并发多线程的处理器,它会将一个物理内核变成两个逻辑内核。有两个进程,P1和P2。

  1. 我的理解:在Linux中,每个进程至少由一个线程组成?所以调度是基于线程调度的?

P1 和 P2 分别调度到两个逻辑核心。他们独立运作。这是第一种情况。如果有一个进程 P3,它由两个线程 t1 和 t2 组成。分别将 t1 和 t2 调度到不同的逻辑核心。那么将两个不同的进程调度到逻辑核上与将同一进程中的不同线程调度到逻辑核上有什么区别呢?

  1. 我的理解:进程是系统的最小单位 分配资源,线程共享进程的资源。 进程中的线程共享虚拟内存、PCB,并且可以访问 相同的数据。因此,当在一个进程中调度不同的线程时 和在不同进程中调度线程,没有区别 对于处理器。区别在于地址转换 页表和缓存是否可以共享。对于多核 处理器,处理器不关心线程是否属于 同样的过程。 MESI保证数据的一致性。 数据的物理位置由页表保证。

我的理解正确吗?

解决方法

好吧,没什么区别。内核只是调度任务;每个用户任务都引用一个页表(无论是否与任何其他任务共享)。

每个逻辑 CPU 内核都有自己的页表指针(例如 x86 CR3)。

是的,缓存一致性是由硬件维护的。 Linux 内核的手动原子(使用 volatile,以及 RMW 和屏障的内联汇编)depend on that