线程放弃CPU控制 - 看似教科书中的矛盾

时间:2016-02-26 19:10:56

标签: multithreading process operating-system multiprogramming

我正在学习操作系统课程中的线程和过程,我在教科书(现代操作系统,第4版,Tanenbaum和Bos)中遇到了明显的矛盾。我确信这里有一些我误解的东西,如果有人可以清理的话会很棒。

第106页:

  

另一个常见的线程调用是thread_yield,它允许线程自愿放弃CPU让另一个线程运行。这样的调用很重要,因为没有时钟中断来实际执行多道程序设计,因为有进程

好的 - 所以我解释的是线程永远不会放弃控制,除非他们愿意放弃它。有道理。

然后在第116页,在错误处理共享信息的线程示例中:

  

例如,考虑UNIX维护的 errno 变量。当进程(或线程)使系统调用失败时,错误代码将放入 errno 。在图2-19中,线程1执行系统调用访问以查明它是否有权访问某个文件。操作系统在全局变量 errno 中返回答案。在控制返回到线程1之后,但在它有机会读取 errno 之前,调度程序决定线程1暂时有足够的CPU时间并决定切换到线程2.

但是没有线程1只是不由自主地从CPU中拉出来了?我认为没有办法强制进行线程切换,因为有进程切换?

2 个答案:

答案 0 :(得分:0)

如果我们关注进程级线程而不是OS级线程,这是有道理的。 CPU可以中断进程(无论正在运行什么线程),但由于操作系统不知道进程级线程,因此无法中断它们。如果进程中的一个线程想要允许另一个线程运行,那么它必须专门屈服于另一个线程。

然而,如今大多数语言都使用操作系统级别的线程,操作系统确实知道这些线程并且可以抢占先机。

答案 1 :(得分:0)

混淆是线程的实现有两种不同的方式。在这些日子里,根本没有线程支持。国防部的Ada编程语言的任务(其中任务 - 也就是线程 - 是不可或缺的部分)迫使采用线程。

创建了运行时库(主要是为了支持Ada)。这在一个过程中起作用。该过程维护了一个计时器,该计时器将中断线程,并且库将在线程之间切换,就像操作系统切换进程一样。

请注意,即使在多处理器系统上,此系统也只允许一次执行一个进程的一个线程。

您的第一个示例是描述这样的库,但它描述的是一个非常原始的线程库,其中线程调度基于进程的各个线程之间的协作。

后来,操作系统开始开发对线程的支持。操作系统不是调度进程,而是调度线程以便执行。然后,进程是具有线程集合的地址空间。你的第二个例子是谈论这种线索。