xv6中,线程切换中线程锁的获取和释放

41 阅读1分钟

xv6中,内核线程的切换总是先切换到调度线程,在从调度线程切换到另外的线程。如:

线程A ---> 调度线程 ---> 线程B

线程A <--- 调度线程 <--- 线程B

下图是调度代码切换内核线程的代码,和内核线程切换的代码(以时钟中断触发的yield调度为例)。

image.png

按照我们写代码的惯例,可能会想当然的认为: 标记1处获取的锁在标记4处释放。 标记3处获取的锁在标记2处释放。

但是如果是上述这样,在标记1处获取的锁后,切换到对应的线程执行,执行到yield函数时,尝试获取锁是永远获取不到的。

实际的代码执行过程中,是:

标记1处获取的锁在标记2处释放。 标记3处获取的锁在标记4处释放。

在线程的切换过程中,需要改变线程的运行状态,以及进行两个线程上下文的切换,在这之前要获取线程锁,避免同一个线程在不同的CPU上同时恢复运行。