+
80
-

进程的上下文切换怎么理解?

请问进程的上下文切换怎么理解?

网友回复

+
0
-

对于CPU来说,它只知道取指令,执行指令,然后执行下一条指令,他可不关心当前执行的指令是从哪个进程/线程来的,这是上面的操作系统需要关心的。

由于程序总归免不了读写内存,读写磁盘,或者网络交互,这些动作比CPU的速度慢了很多个数量级,为了不让cpu忙等这些操作,就得想办法让多个程序"同时"运行,a程序执行io读写时把cpu交给b程序,b程序发送网络包时再把cpu让给c程序,尽力提高CPU的使用率,操作系统为此抽象出了进程的概念。

要让这些进程都有机会被CPU执行,操作系统就得在一个进程正在被CPU执行时,将其切换走,把CPU让给其他进程,这就是进程的上下文切换 那么问题来了,切换切的到底是啥?怎么个切法? 前面说了,CPU干的事情很简单,就是取指令然后执行它,作为操作系统,你得让CPU知道从哪里取指令,指令执行时还需要数据,数据从哪里拿你也得告诉它,如果在执行过程中被切换走,CPU计算过程中产生的一些临时数据也得告诉它,这样它才可以正常执行指令,怎么告诉CPU这些信息呢?只要给CPU的各种寄存器赋值就好了,包括程序计数器里的下一条指令地址,数据段寄存器里的程序数据段起始地址,代码段寄存器里的程序指令段的起始地址,各种通用寄存器中的数据等等 地址信息涉及到操作系统内存管理的部分,这里只简要说明下: 段存储器里的地址是虚拟地址,需要找到对应的物理地址,虚拟地址和物理地址的对应关系存在进程的页表中,是在操作系统初始化进程信息时创建的,查到物理地址后,加上偏移量就可以算出指令和数据的物理地址(程序计数器中的指令地址就是偏移量),CPU从算出的指令地址获取指令,指令会被翻译为操作码和操作数地址(也是偏移量),加上通过数据段寄存器值算出的数据段起始物理地址,就可以算出数据存放的物理地址,CPU拿到数据后,就可以执行指令了。 好了,我们已经知道了,切换切的就是CPU各种寄存器中的值,让CPU知道从哪里取指令取数据,然后它就可以愉快的执行了,这些在进程运行时存在寄存器中的值就称作进程上下文。 我们要把当前在执行的进程切走,然后把另一个进程切来,后面还会把当前进程切回来接着执行,所以当前进程切走的前一刻,各个寄存器中的值我们得保存下来放到一个地方,后面再切它回来时就从这个地方取出来再赋值给寄存器,CPU就可以接着上次切走该进程前继续执行了。保存在哪呢? 每个进程创建后,操作系统都会为其维护一个进程控制块(PCB),包括进程标识信息(如PID,父进程PID),进程的控制信息(操作系统需要对进程进行管理和控制,决定其状态),以及处理器状态信息,这里面就保存了进程的运行的上下文信息 现在我们就清楚了,操作系统把当前CPU各个寄存器中的值存到进程的PCB中,从另一个进程的PCB中取出之前某个时刻存进去的内容,赋给寄存器,就完成了一次进程上下文切换。 除了正常调度进程需要上下文切换外,还有一种上下文切换,是操作系统检测到中断、异常、系统调用时发生的,包括IO设备引起的中断,应用程序主动发起系统调用(如文件读写),以及应用程序发生错误(比如除以0操作),操作系统检测到中断异常系统调用的信号后,会通过中断向量表找到对应的处理程序,然后切换成处理程序进程,处理完成后再切换回来,这里的切换过程与上面大致相似。 中断处理的不同之处在于,是正常应用程序与操作系统程序的切换,跨越了应用程序与操作系统的边界,在系统调用时,还会涉及到用户态到内核态的切换,过程更复杂,开销也会比普通上下文切换代价更大,
我知道答案,我要回答