什么是上下文切换

1.什么是上下文?

Linux是一个多任务的操作系统,它支持远大于CPU数量的任务同时运行,这些任务并不是同时运行,而是系统在很短的时间内,将CPU轮流分配给它们,但是系统需要保存上一个任务的运行状态,不然就失去了处理的一部分信息。所以在每个任务运行前,CPU都需要知道任务从哪里加载,又从哪里运行,也就是说,需要系统事先给他设置好CPU寄存器和程序计数器

CPU寄存器:是CPU内置的容量小,但速度极快的内存

程序计数器:是用来存储CPU正在执行的指令位置,或者即将执行的下一条指令位置

所以上下文就是CPU上下文,是CPU运行任何任务前,必须依赖的环境,包括CPU寄存器和程序计数器

2.上下文切换详细介绍

根据CPU切换运行任务的不同,又可以分为进程上下文切换,线程上下文切换,中断上下文切换

进程的运行态:

Linux按照特权等级,把进程的运行空间分为内核空间和用户空间。在这两种空间中运行的进程状态分别称为内核态和用户态

内核空间:具有最高权限,可以直接访问所有资源

用户空间:只能访问受限资源,不能直接访问内存等硬件设备,必须通过系统调用进入到内核中,才能访问执行特权资源

系统调用:

从用户态到内核态的转变,需要通过系统调用来完成,比如查看文件时,需要执行多次系统调用:open,read,write,close等。系统调用的过程:

1.把CPU寄存器里原来用户态的指令保存起来

2.为了执行内核代码,CPU寄存器需要更新为内核态指令的新位置,最后跳转到内核态运行内核任务;

3.系统调用结束后,CPU寄存器需要恢复原来的用户态,然后切换到用户空间,继续运行进城;

所以一次系统调用的过程,其实发生了两次CPU上下文切换

进程上下文切换:

  • 进程执行终止,它之前占据的CPU就会被释放出来,这时就从就绪队列中取出下一个等待时间片的进程;
  • 当某个进程的时间片耗尽,它就会被系统挂起,切换到其他等待CPU的进程运行;
  • 某个进程因为需要的系统资源比较大(比如内存不足),这时候该进程会被挂起,系统会调度其他进程执行;
  • 当有优先级更高的进程(系统操作进程)需要时间片,为了保证优先级更高的进程能够执行,当前进程会被挂起;
  • 如果当前进程中有sleep函数,他也会被挂起;

线程的上下文切换:

对操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元。说白了,所谓内核中的任务调用,实际上的调度对象是线程;而进程只是给线程提供了虚拟内存、全局变量等资源。所以,对于现场和进程,我们可以这么理解:

  • 当进程只有一个线程时,可以认为进程就等于线程。
  • 当进程拥有多个线程时,这些线程会共享父进程的资源(即共享相同的虚拟内存和全局变量等资源)。这些资源在上下文切换时是不需要修改的。
  • 另外,线程也有自己的私有数据,比如栈和寄存器等,这些在上下文切换时也是需要保存的。

综上,线程上下文切换有两种情况:

  • 前后两个线程属于不同进程,因为资源不共享,所以切换过程就跟进程上下文切换是一样的;
  • 前后两个线程属于同一个进程,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据。

中断上下文切换

中断处理会打断进程的正常调度和执行。在打断其他进程时,需要将进程当前的状态保存下来,中断结束后,进程仍然可以从原来的状态恢复运行。

中断上下文切换并不涉及到进程的用户态。所以,即便中断过程打断了一个正处在用户态的进程,也不需要保存和恢复这个进程的虚拟内存、全局变量等用户态资源。中断上下文,其实只包括内核态中断服务程序执行所必须的状态,包括 CPU 寄存器、内核堆栈、硬件中断参数等

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值