中间有些个人的私事中断了一段时间这个系列的博文,总体来说还是不甚满意,后面应该会对博文的结构进行调整,并且添加更加详细的内容,目前的状态有点太概括和笼统,虽然就我自己的认识来说操作系统的逻辑本身并不复杂,复杂的是其实现的细节,就像一句老化魔鬼都在细节当中, 所以操作系统和典型的作业系统是相反的两个方向,操作系统从大的逻辑上来讲实际上很简单,抽象硬件并分时复用硬件,而很多大型的业务系统完全没有办法这么简单的概括,比如云计算的系统,LTE通信系统,甚至ERP/CRM这类的信息管理系统都在逻辑业务上复杂无比,但是很多情况下它们并不需要复杂的编码,而只是实现业务逻辑就能满足需求了。
言归正传,下面接着讲上下文切换。 本来没有准备讲解上下文切换的,因为对于了解操作系统来说,当你走读代码到上下文切换的时候,一般你只需要知道当前的任务在这个位置就停止运行了,如果此任务重新的到执行的时间片的时候,它就会从切换的代码位置然后再接着继续执行。(简单来说就像什么都没发生过一样)
而上下文切换的代码一般都很短,而由于其性能强相关,并且需要一个个操作寄存器,所以其一般由汇编语言来进行实现,所以读这部分的代码需要熟悉对应的处理器体系结构,然后清楚对于当前体系结构的处理器需要保存的寄存器上下文有哪些,然后你就看到其汇编代码只是根据这个寄存器列表把当前运行的线程的寄存器数据一个个的复制到线程的上下文缓冲中,然后把需要被切换到的线程的上下文缓冲中的内容一个个的复制到物理寄存器之上。 这里面有一个小的需要注意的点,最后赋值的寄存器是PC指针,其指向线程要运行的下一条指令,在完成其他寄存器切换之前是不能先切换PC指针寄存器的。
使用下面的命令可以查看Linux系统中对主动上下文切换和被