深入理解Linux内核第二版-注-进程切换

    进程的切换实际上是上下文的切换,也就是《深入理解Linux内核》中所说的文境(context)切换。

    对于初学者来说,上下文往往是个很模糊的概念。英文Context有一种解释叫:来龙去脉。是谁的来龙去脉呢?我认为是程序的来龙去脉,更进一步说就是进程的来龙去脉。进程的切换实际上就是保存了被挂起进程(进程A)的上文,并把将要执行进程(进程B)的下文交给处理器去执行。

    那么如何实现上下文切换呢?

    要弄清楚这个问题,首先要知道被保存的上文和将要执行的下文都有哪些内容。实际上,这两部分内容的主体是一致的,因为被保存的上文在今后的某次切换时将成为下文。在80x86和ARM等体系结构下,上下文的主要内容可以分为两个部分——硬件和软件(貌似废话)。

    硬件部分主要是处理器/控制器的内部各寄存器(包括通用寄存器、状态寄存器等)的使用情况。这其中程序指针存有被挂起程序的下一条指令的地址,程序指针一般是不允许被MOV等指令直接更改,但是子程序调用(CALL)指令或中断发生时程序指针首先会自动被PUSH进堆栈,而在使用子程序返回(RET)或中断返回(IRET)等指令时程序指针最后会被自动从堆栈中POP弹出。因此,在上下文切换时,只要切换了堆栈指针(ESP),在进程切换程序使用返回指令时,程序指针就会被修改成进程B的下一条指令(相对于进程B被挂起时的那条指令而言)。大致过程如图1所示。

   

    图1 硬件的上下文切换

    软件的上下文切换主要是对进程描述表中相关状态的设定、修改,以及对系统中其他用于描述系统运行的参数的修改。

    《深入理解Linux内核》中提到“进程切换的第二步由switch_to宏执行”,“该宏有三个参数,他们是prev、next和last”。prev和next参数比较好理解,他们就是切换前的进程A和切换后的进程B。关于last,文中提到“在任何进程切换中,涉及到三个进程而不是两个”,这句话还是较为难理解的。

    对于这句话,应当从另一个角度出发,让我们回到图1上来。在A被挂起进入任务调度程序(文中提到的 schedule() 函数)时,需要在当前堆栈上保存A的程序指针,接着在当前堆栈上分配局部变量所使用的空间,文中提到过“prev和next是schedule()函数的局部变量”。因此prev和next处于当前的堆栈上,而当前堆栈正式在从A切换到调度程序上时由A的堆栈延伸而来的,在任务切换后,当前堆栈变成了B被挂起时延伸的堆栈了,prev和next也跟随堆栈的变化而变成了B挂起时的指针了(可以理解为在当前堆栈也即任务调度程序所使用的堆栈发生变化的时候,任务调度程序的局部变量的值也会跟着发生了变化)。

    如果系统中只有A、B两个进程/任务在执行,那么这样的变化的影响还是比较小的。但是,往往系统中不可能只有两个进程在执行,也就是文中提到的涉及到三个进程的进程切换。当出现另一个进程C的时候,我们假设任务的变化过程如下:

    A->B->...除A、B、C外的其他进程/任务...->C->A

    当A->B时,prev指向A,next指向B。当C->A时,prev指向C,next指向A,而当切换后,由于当前堆栈已经变成了由A延伸的堆栈,因此prev和next都变为A->B时的值了,也就是prev由指向C变为指向A,next由指向A变为指向B,此时“代表进程A执行的内核就失去了对C的任何引用”。

    文中提到,Linux内核使用EBX寄存器保存prev,而prev对应的就是last参数,在C->A时,C作为prev被保存在EAX和EBX中,由于EBX始终未改变(即便在任务切换时也是如此),因此内核对C的引用得以保存。


    *注:本文并不严格区分“任务”和“进程”。


    以上为本人拙见,如有不妥之处请各位高人多多指教。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lionchan187

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值