如果你有内核线程和用户线程的一对一映射,为什么进程不被阻塞,如果它进行系统调用?
If you have One-to-One-Mapping of Kernel- and User-Threads, why isn't process be blocked, if it makes a system-call?
我经常读到,当您拥有多对一映射时,系统调用会阻塞整个过程,但一对一则不会。但为什么?进行系统调用的线程无论如何都被阻塞,无法向其他用户线程发出切换命令。
内核调度线程而不是全局进程。
在一个非常普遍的情况下,当一个进程仅由其主线程组成时,我们使用一种快捷方式来表达内核调度这些进程,但这只是一个(非常常见的)极端情况。
每个线程都可以有自己的优先级,它自己对某些 CPU 的亲和力...
但是默认情况下,这些属性是从它所属进程中的主线程继承的,如果我们不显式更改它们,我们可能会产生一种错觉,即单个进程中的所有这些线程从调度程序的角度来看形成一个单一的实体看法;但事实并非如此。
例如,当一个线程在系统调用中被阻塞时,这不会阻止其他线程 运行。
被阻塞的线程不会决定关于下一个线程的任何事情运行(除非我们使用 cond-vars 显式构建专用的应用同步机制...)。
在同一个或另一个进程中切换到另一个线程,完全由 OS 调度程序决定。
另一个令人困惑的情况是线程中发生分段错误。
由于地址 space 由单个进程内的所有线程共享,因此必须终止整个进程。
然后它的所有线程立即消失,从调度程序的角度来看,这再次给人一种所有这些线程形成一个单一实体的错觉;但它与地址 space 管理比调度更相关。
注意:可能存在一些用户-space 线程实现,其中 OS 调度程序无法将这些线程视为不同的(它只看到进程的主线程) .
根据此类 user-space 实现的内部细节,阻塞系统调用可能会导致阻塞或不阻塞整个进程。
如今,依赖内核提供的本机线程更为普遍。
我认为您遗漏了一件非常具体的事情。
当您拥有用户线程到内核线程的一对一映射时,这意味着每个用户线程都有自己的内核线程。没有 "switch-command to the other user thread" 因为另一个用户线程是另一个内核线程,在内核线程之间切换是内核的工作。在现代操作系统上,内核可以在系统调用中阻塞线程时轻松切换内核线程。
当你有一个多对一的用户线程映射时,这意味着一个内核线程应该 运行 为多个用户线程编写代码。在这里,用户代码必须做一些事情来使同一个内核线程为另一个用户线程执行代码。如果它在系统调用中被阻止,它就不能这样做。
我经常读到,当您拥有多对一映射时,系统调用会阻塞整个过程,但一对一则不会。但为什么?进行系统调用的线程无论如何都被阻塞,无法向其他用户线程发出切换命令。
内核调度线程而不是全局进程。
在一个非常普遍的情况下,当一个进程仅由其主线程组成时,我们使用一种快捷方式来表达内核调度这些进程,但这只是一个(非常常见的)极端情况。
每个线程都可以有自己的优先级,它自己对某些 CPU 的亲和力...
但是默认情况下,这些属性是从它所属进程中的主线程继承的,如果我们不显式更改它们,我们可能会产生一种错觉,即单个进程中的所有这些线程从调度程序的角度来看形成一个单一的实体看法;但事实并非如此。
例如,当一个线程在系统调用中被阻塞时,这不会阻止其他线程 运行。
被阻塞的线程不会决定关于下一个线程的任何事情运行(除非我们使用 cond-vars 显式构建专用的应用同步机制...)。
在同一个或另一个进程中切换到另一个线程,完全由 OS 调度程序决定。
另一个令人困惑的情况是线程中发生分段错误。
由于地址 space 由单个进程内的所有线程共享,因此必须终止整个进程。
然后它的所有线程立即消失,从调度程序的角度来看,这再次给人一种所有这些线程形成一个单一实体的错觉;但它与地址 space 管理比调度更相关。
注意:可能存在一些用户-space 线程实现,其中 OS 调度程序无法将这些线程视为不同的(它只看到进程的主线程) .
根据此类 user-space 实现的内部细节,阻塞系统调用可能会导致阻塞或不阻塞整个进程。
如今,依赖内核提供的本机线程更为普遍。
我认为您遗漏了一件非常具体的事情。
当您拥有用户线程到内核线程的一对一映射时,这意味着每个用户线程都有自己的内核线程。没有 "switch-command to the other user thread" 因为另一个用户线程是另一个内核线程,在内核线程之间切换是内核的工作。在现代操作系统上,内核可以在系统调用中阻塞线程时轻松切换内核线程。
当你有一个多对一的用户线程映射时,这意味着一个内核线程应该 运行 为多个用户线程编写代码。在这里,用户代码必须做一些事情来使同一个内核线程为另一个用户线程执行代码。如果它在系统调用中被阻止,它就不能这样做。