0

我正在阅读有关非抢占线程的信息,并找到了普林斯顿大学的一张幻灯片,它显示了下图:(来源链接:http://www.cs.princeton.edu/courses/archive/fall11/cos318/lectures/L5_ThreadsImplementation。 .pdf )

在此处输入图像描述

据我了解,要执行的线程首先放入就绪队列。当它从队列中弹出时,它处于运行状态。如果它想调用另一个线程,它会调用yield函数,该函数将存储线程的当前状态并将其插入队列的尾部。队列前面的线程将被执行。

如果线程被阻塞(即它正在等待某些资源)会发生什么?我认为在非抢占线程中它会等待资源然后继续执行。

但是从下图中它看起来好像进入了阻塞状态,然后被放入了就绪队列?这是为什么?

4

1 回答 1

0

正如评论中所说,非抢占意味着另一个线程不能中断(抢占)正在运行的线程,而不是正在运行的线程在必须等待某些东西时不会屈服。

当一个线程正在等待来自内存的数据时(例如),它被称为处于阻塞状态:它的上下文被保存并且另一个线程发生在计算资源(CPU 核心)中。当数据在 CPU 的高速缓存内存中可用时,则表示第一个线程已准备好恢复其执行(一旦它成为下一个要执行的线程并且当前执行的线程产生计算资源,它将立即恢复执行)。

这允许重叠数据移动和线程执行,从而通过优化资源使用来节省时间。

于 2015-10-18T20:23:40.670 回答