进程切换的疑惑
问:进程切换为什么涉及三个参数switch_to(prev, next, last)?
答:若没有last参数,那么进程在切换出去再切换回来后可能会丢失上一个执行切换的进程。
问:为什么需要一个last?丢失了上一个切换的进程又会怎样?
答:进程切换过程为 prepare_task_switch(prev) --> switch_to --> finish_task_switch(last)
进程切换前后的prepare和finish需要匹配,若没有last,将不匹配。
问:last是如何赋值的?
答:进程切换时会使用eax寄存器保存prev进程,同一个进程被切换出去又切换回来后,last为eax 寄存器的值。
举例描述三个进程切换的过程:
A进程要切换到B进程:
prepare_task_switch(A)
初始: prev = A,next = B,
执行切换后:prev = A,next = B,eax = A,此时A进程执行流冻结,B进程开始执行
B进程要切换到C进程:
prepare_task_switch(B)
初始: prev = B,next = C,
执行切换后:prev = B,next = C,eax = B,此时B进程执行流冻结,C进程开始执行
------------------------------------------------------------------------------------------------------------------------
C进程要切换到A进程:
prepare_task_switch(C)
初始: prev = C,next = A,
执行切换后:prev = C,next = A,eax = C,此时C进程执行流冻结,A进程开始执行
A进程从冻结的执行流开始执行:
堆栈恢复,局部变量prev和next仍为A、B。若没有第三个参数last,那么就会丢失进程C
执行流恢复后,last取eax寄存器中的内容,last = C
finish_task_switch(C)
------------------------------------------------------------------------------------------------------------------------
A进程要切换到B进程:
prepare_task_switch(A)
初始: prev = A,next = B,
执行切换后:prev = A,next = B,eax = A,此时A进程执行流冻结,B进程开始执行
B进程从冻结的执行流开始执行:
堆栈恢复,局部变量prev和next仍为B、C。若没有第三个参数last,那么就会丢失进程A
执行流恢复后,last取eax寄存器中的内容,last = A
finish_task_switch(A)
------------------------------------------------------------------------------------------------------------------------
B进程要切换到C进程:
prepare_task_switch(B)
初始: prev = B,next = C,
执行切换后:prev = B,next = C,eax = B,此时B进程执行流冻结,C进程开始执行
C进程从冻结的执行流开始执行:
堆栈恢复,局部变量prev和next仍为C、A。若没有第三个参数last,那么就会丢失进程B
执行流恢复后,last取eax寄存器中的内容,last = B
finish_task_switch(B)
------------------------------------------------------------------------------------------------------------------------

被折叠的 条评论
为什么被折叠?



