对用户级线程最具破坏性的论点

时间:2017-01-26 05:20:41

标签: linux multithreading operating-system

我正在阅读书籍"现代操作系统"中有关用户空间线程的部分。它声明:

  

针对用户级线程的另一个,也许是最具破坏性的论点是,程序员通常在线程经常阻塞的应用程序中精确地需要线程,例如,在多线程Web服务器中。这些线程不断进行系统调用。一旦内核发生陷阱以执行系统调用,如果旧的内核已经阻塞,内核切换线程几乎没有任何工作,并且让内核执行此操作消除了不断进行选择的需要系统调用检查读取系统调用是否安全。对于基本上完全受CPU限制但很少阻塞的应用程序,有线程的重点是什么?没有人会认真考虑使用线程计算前n个素数或下棋,因为这样做没有任何好处。

我对粗体文本特别困惑。 1.由于这些是用户空间线程,内核如何做一个"切换线程"? 2."让内核做到这一点"什么"这"这意味着什么

我认为行为就像: 1."选择"打电话,发现以下系统调用是阻塞的。 2.然后用户空间线程调度程序进行线程切换并执行anohter线程。

1 个答案:

答案 0 :(得分:0)

出于某种原因,大学坚持使用令人困惑且有时荒谬的操作系统教科书。

首先,这里描述的内容完全是系统特定的。在某些操作系统上,同步系统调用将阻止所有线程。在所有操作系统中都不是这样。

其次,用户线程是穷人的做法。在这些日子里,用户线程产生了,因为没有操作系统支持。有一些促使用户线程变得更有效率"比内核线程(理论上库可以比内核更快地切换线程)但实际上这是总BS。用户线程完全过时,迫使开发人员使用它们进行线程处理的系统是OBSOLETE。即使像VMS这样的旧系统系统也有内核线程。

在现代操作系统课程中,"用户线程"应该是侧边栏或历史脚注。

从本质上讲,你的书正试图进行一场不存在的辩论。这就像第二次世界大战后的美国陆军评估比较谢尔曼坦克和黑豹一样。他们谈论的事情就像谢尔曼移动舒适的座位,试图使两个声音相当,而实际上,谢尔曼已经过时了,甚至不在Panther的同一个班级。

  

1.由于这些是用户空间线程,内核如何做一个"切换线程"? 2."让内核做到这一点"什么"这"这意味着什么?

他们似乎建议的是线程会在进行系统调用时阻止进程。发生这种情况时,操作系统将进行上下文切换。在这种情况下,操作系统正在进行一个"线程切换"无论如何,到另一个进程。他们试图引导你的[正确]结论是,这个开关带走了用户线程所谓的减少的开销。

  

我认为行为就像:1。"选择"打电话,发现以下系统调用是阻塞的。 2.然后用户空间线程调度程序进行线程切换并执行anohter线程。

让我以阻止系统调用未完全阻止的用户线程实现为例。

  1. 库设置了一个用于线程切换的计时器。
  2. 线程开始或继续执行。
  3. 该线程发出阻塞系统服务(例如,选择)。
  4. 操作系统将进程切换为系统服务处理的一部分。
  5. 计时器熄灭。
  6. 该过程再次变为当前状态,操作系统将调用库中的计时器处理程序。
  7. 该库安排另一个线程执行。
  8. 您遇到的问题是阻塞系统服务通常会作为其处理代码的一部分来触发上下文切换。因为系统确实不知道线程(否则它将使用内核线程),调用这种阻塞服务的线程将通过代码。

    即使进程可能具有可执行的线程,操作系统也无法执行它们,因为它知道它们,因为它们是由进程中的库管理的。