我正在阅读关于非抢先线程的文章,我从普林斯顿大学找到了一张幻灯片,它显示了以下图表:(来源链接:http://www.cs.princeton.edu/courses/archive/fall11/cos318/lectures/L5_ThreadsImplementation.pdf)
据我所知,要执行的线程首先被放入就绪队列。当它弹出队列时,它处于运行状态。如果它想要调用另一个线程,它会调用yield函数,该函数将存储线程的当前状态并将其插入队列的尾部。并且将执行队列前面的线程。
如果线程被阻塞(即它正在等待某些资源)会发生什么?我认为在非抢占线程中它将等待资源然后继续执行。
但是从下面的图表中看起来它似乎进入阻塞状态然后被放入就绪队列?这是为什么?
答案 0 :(得分:0)
如评论中所述,非抢占式意味着另一个线程无法中断(抢占)正在运行的线程,而不是当正在运行的线程必须等待某事时它不会产生。< / p>
当一个线程正在等待来自内存的数据时(例如),它被称为处于阻塞状态:它的上下文被保存,另一个线程发生在计算资源(CPU核心)中。当数据在CPU的高速缓冲存储器中可用时,第一个线程被称为 ready 以恢复其执行(并且一旦它是下一个被执行并且当前执行的线程产生了计算资源)。
这样可以重叠数据移动和线程执行,从而通过优化资源使用来节省时间。