用户级线程(ULT)和内核级线程(KLT)在并发执行方面有何不同?

Abh*_*ury 7 parallel-processing concurrency multithreading operating-system

这是我的理解; 请更正/添加到它:

在纯ULT中,多线程进程本身执行线程调度.因此,内核基本上没有注意到差异并将其视为单线程进程.如果一个线程进行阻塞系统调用,则会阻止整个进程.即使在多核处理器上,也只能一次运行该进程的一个线程,除非该进程被阻止.我不确定ULT是如何提供帮助的.

在纯KLT中,即使线程被阻塞,内核也会调度同一进程的另一个(就绪)线程.(在纯KLT的情况下,我假设内核创建了进程的所有线程.)

此外,结合使用ULT和KLT,ULT如何映射到KLT?

tem*_*def 17

你的分析是正确的.操作系统内核不了解用户级线程.从它的角度来看,进程是一个不透明的黑盒子,偶尔会进行系统调用.因此,如果该程序具有100,000个用户级线程但只有一个内核线程,则该进程一次只能运行一个用户级线程,因为只有一个内核级线程与之关联.另一方面,如果进程有多个内核级线程,那么如果有多核机器,它可以并行执行多个命令.

这些之间的共同折衷是让程序请求一些固定数量的内核级线程,然后让自己的线程调度程序将用户级线程分配到这些内核级线程上.这样,多个ULT可以并行执行,并且程序可以对线程的执行方式进行细粒度控制.

至于这种映射是如何工作的 - 有很多不同的方案.您可以想象用户程序使用多个不同调度系统中的任何一个.事实上,如果你做这个替换:

内核线程<--->处理器核心

用户线程<--->内核线程

然后,操作系统可用于将内核线程映射到核心的任何方案也可用于将用户级线程映射到内核级线程.

希望这可以帮助!