假设一个多任务场景,有A函数和B函数,要实现两个函数的并发运行。
这就面临两个问题:
- 任务切换时,假如A中的结果没有还保存到寄存器中,或者即使保存在寄存器(假设r0)中,由于切换到B后也要用r0存储数据,是不是会出现“A白算了”的现象?
- 我们知道C代码会转为汇编码,再变回机器码让机器识别,在汇编码的执行过程中,PC(Program Counter)是指向下一个执行的指令的地址,这决定了程序的运行顺序。假设A在PC=100时切换到B,当再想切换回A任务时,由于PC值已经改变,此时的PC为B下一个执行的指令的地址,我们怎么知道“回到哪里执行A”?
在C语言中,每一个任务都有对应的一个栈。栈位于内存中,我们可以使用栈来解决上面两个问题。首先,栈将A函数的现场(PC值,各局部变量的值与对应存储的寄存器关系等)保存到栈中;等B函数切换回A函数时,先将A函数栈中的现场恢复到硬件(即CPU)上。这样硬件就能知道”我刚刚算了什么东西”(各局部变量的值与对应存储的寄存器关系)和”我刚刚算到哪儿了”(PC值)。