Linux中的系统调用是否涉及线程切换

时间:2019-05-24 11:10:09

标签: linux

我在Wikipedia上的“系统调用”部分中读到,当“用户级别”线程进行系统调用时,最终“内核”线程实际上执行了请求。那么这是否意味着用户线程已被调度,并且使用内核线程进行了上下文切换?如果是,结果如何返回给用户线程?

我对wikipedia的这一行感到困惑:“ 多对一模型:进程中来自任何用户线程的所有系统调用都由单个内核级线程处理。”

1 个答案:

答案 0 :(得分:3)

有关系统调用上下文切换的详细说明,请参见system call and context switch

  

我仍然不明白这是系统调用是在同一线程中执行的,而是在内核模式下执行的,还是系统调用有单独的内核线程

相同的线程,相同的过程。没有“用户线程”和“内核线程”,只有线程。每次进行系统调用时,线程都会在用户和内核模式之间来回切换。

链接问题中描述的上下文切换不是调度上下文切换。用户/内核模式切换和线程调度切换是独立的正交概念。从用户模式切换到内核模式或切换回内核模式根本不涉及调度。同样,无论进程处于用户模式还是内核模式,线程调度切换都可以随时发生。

  

我对维基百科上的这一行感到困惑:“ 多对一模型:进程中来自任何用户线程的所有系统调用都由单个内核级线程处理。”

这是操作系统处理系统调用的一种方式,但不是Linux方式。 Linux使用第二个项目符号中的模型:“ 一对一模型:在系统调用期间,每个用户线程都附加到一个不同的内核级线程。该模型解决了上述阻塞系统的问题可以在所有主要的Linux发行版,macOS,iOS,最新的Windows和Solaris版本中找到。”

但不要让这种措辞使您感到困惑。 Linux不会区分 user 线程和 kernel 线程。只有个线程,不合格。本文介绍的“一对一”映射是概念性的。 Linux的源代码中没有实际的分隔或映射。