我真的不明白当内核超出时间片时内核如何保存正在运行的代码的状态。
我不知道实际发生了什么。
1)哪里存储了当前运行的代码(及其堆栈?)?
2)当内核再次“看到”代码时,它是否会跟随一个偏移并继续进行,好像什么也没发生?
我不清楚。
由于
答案 0 :(得分:2)
当前代码指令指针和当前堆栈指针存储在task_struct->ip
和task_struct->sp
(对于x86)和新进程的task_struct->ip
和task_struct->sp
中并且已加载在Linux内核中调用switch_to()
时,返回sp
和ip
。
内核的switch_to()
在切换到新进程时执行许多操作,例如重置EIP,堆栈,FPU,段描述符,调试寄存器。
然后内核switch_mm()
将虚拟内存映射从上一个进程切换到新进程。
答案 1 :(得分:0)
这取决于操作系统,但作为一般规则,存在一个存储块,其中包含有关每个进程的信息(通常称为过程控制块或PCB)。此信息包括指向当前正在执行的代码行的指针和寄存器的内容等,因此该进程可以在上次停止的位置再次启动。
这个信息块由操作系统本身拥有,而不是流程,因此它不仅仅是暂停流程。
程序代码本身不存储在PCB中 - 它只存在于内存或磁盘上。它甚至可以在进程之间共享,例如,几个进程可能正在运行相同的程序,每个进程在任何给定时间在代码中的不同点,并且每个进程都有自己的一组“变量”或者该进程运行的唯一数据。程序。所有操作系统需要的是变量和行号或指针,以便知道特定进程在挂起时在代码中的位置,并且可以从该点再次开始。
值得注意的是,进程正在使用的任何RAM在重新启动时可能会或可能不会存在。通常,如果可能,OS将尝试将最近使用或经常使用的RAM块(或“页面”)留在存储器中。但是,如果它需要释放空间,它可能会将“页面”交换到磁盘,但磁盘访问速度要慢得多,因此希望避免交换内存,如果可能的话,可能会再次使用。
在最糟糕的情况下,操作系统可能会发现它交换了一个进程,然后很快新进程需要使用一些必须从磁盘中检索的内存。它会在发生这种情况时暂停,因为检索在CPU方面需要很长时间。然后可能会发生下一个过程很快就会发现自己处于相同的情况。操作系统现在花费大量时间将进程和内存交换进出,更少花时间进行实际工作 - 这通常被称为“颠簸”。