linux基础知识-CPU-上下文切换

关于上下文切换的几个为什么

上下文切换是什么?

CPU 上下文可以理解成CPU寄存器状态以及程序计数器PC, 这些都是记录CPU当前任务的状态。
CPU 上下文切换会把当前的cpu的上下文保存下来,然后加载新任务的对应上下文,而这些保存下来的上下文,会存储在系统内核中,并在任务重新调度执行时再次加载进来。这样就能保证任务原来的状态不受影响,让任务看起来还是连续运行。

CPU为什么要进行上下文切换?

当多个进程竞争CPU的时候,CPU为了保证每个进程能公平被调度运行,采取了处理任务时间分片的机制,
轮流处理多个进程,由于CPU处理速度非常快,在人类的感官上认为是并行处理,实际是"伪"并行,
同一时间只有一个任务在运行处理

上下文切换主要消耗什么资源,为什么说上下文切换次数过多不可取?

每次上下文切换都需要几十纳秒到到微秒的CPU时间,这些时间对CPU来说,
就好比人类对1分钟或10分钟的感觉概念。在分秒必争的计算机处理环境下,浪费太多时间在切换上,
只能会降低真正处理任务的时间,表象上导致延时、排队、卡顿现象发生

上下文切换分几种?

特权模式切换、 进程上下文切换、线程上下文切换、中断上下文切换

什么情况下会触发上下文切换?

系统调用、进程状态转换(运行、就绪、阻塞)、时间片耗尽、系统资源不足、sleep、优先级调度、硬件中断等

线程上下文切换和进程上下文切换的最大区别?

线程是调度的基本单位,进程是资源拥有的基本单位,同属一个进程的线程,发生上下文切换,
只切换线程的私有数据,共享数据不变,因此速度非常快

有哪些减少上下文切换的技术用例?

数据库连接池(复用连接)、合理设置应用的最大进程,线程数、直接内存访问DMA、零拷贝技术

上下文切换过程详解

特权模式切换

Linux 按照特权等级,把进程的运行空间分为内核空间和用户空间,分别对应着下图中, CPU 特权等级的 Ring 0 和 Ring 3。内核空间(Ring 0)具有最高权限,可以直接访问所有资源;用户空间(Ring 3)只能访问受限资源,不能直接访问内存等硬件设备,必须通过系统调用陷入到内核中,才能访问这些特权资源。


image.png

进程可以在用户空间运行,也可以在内核空间运行。当调用open()、read()、write()、close()系统函数, CPU会保存原来用户态的指令位置,然后更新CPU寄存器内核态指令的新位置。最后执行内核态函数。当系统调用结束后,CPU恢复原来的用户态,切换回用户空间继续执行进程。

可以看到用户态->内核态, 内核态->用户态这两个过程总共是产生了两次CPU上下文切换。不过,需要注意的是,系统调用过程中,并不会涉及到虚拟内存等进程用户态的资源。

进程上下文切换

进程上下文不仅包括了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的状态,与系统调用相比进程间的切换还需要把内容保存下来


image.png
  • 触发进程上下文切换的场景

根据调度策略,将CPU时间划片为对应的时间片,当时间片耗尽,当前进程必须挂起
系统资源不足的,在获取到足够资源之前进程挂起
当进程通过睡眠函数sleep或者sched_yield这样的方法将自己主动挂起时
高优先级进程导致当前进程挂起
硬件中断,导致当前进程挂起,转而执行内核中的中断服务程序

线程上下文切换
  • 不同进程之间的线程上下文切换,其过程和进程上下文切换大致相同。
  • 线程内部的线程进上下文切换。不需要切换进程的用户资源,只需要切换线程私有的数据和寄存器等。
    这会比进程上下文进程切换消耗的资源少,所以多线程相比多进程的优势。
中断上下文切换

为了快速响应硬件的事件(如USB接入),中断处理会打断进程的正常调度和执行,转而调用中断处理程序,
响应设备事件。而打断其它进程执行时,需要进行上下文切换。中断事件过多,会无谓的消耗CPU资源,导致进程处理时间延长。
对于一个CPU来说,中断处理比进程拥有更高的优先级, 所以中断上下文切换并不会与进程上下文切换同时发生。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容