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

1、 上下文切换是什么?

上下文切换是对任务当前运行状态的暂存和恢复

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

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

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

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

4、 上下文切换分几种?

进程上下文切换、线程上下文切换、中断上下文切换

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

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

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

线程是调度的基本单位,进程是资源拥有的基本单位,同属一个进程的线程,发生上下文切换,

只切换线程的私有数据,共享数据不变,因此速度非常快。

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

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

二、上下文切换过程详解

1、进程上下文切换过程

(1)进程运行态为内核运行态和进程运行态。内核空间态资源包括内核的堆栈、寄存器等;用户空间态资源包括虚拟内存、栈、变量、正文、数据等


(2)系统调用(软中断)在内核态完成的,需要进行2次CPU上下文切换(用户空间-->内核空间-->用户空间),不涉及用户态资源,也不会切换进程。

(3)进程是由内核来管理和调度的,进程的切换只能发生在内核态。所以,进程的上下文不仅包括了用户空间的资源,也包括内核空间资源。

(4)进程的上下文切换过程:

(a)接收到切换信号,挂起进程,记录当前进程的虚拟内存、栈等资源存储;
(b)将这个进程在 CPU 中的上下文状态存储于起来;
(c)然后在内存中检索下一个进程的上下文;
(d)并将其加载到 CPU的寄存器中恢复;

  (e)还需要刷新进程的虚拟内存和用户栈;

  (f)最后跳转到程序计数器所指向的位置(即跳转到进程被中断时的代码行),以恢复该进程。

(5)、下列将会触发进程上下文切换的场景:

(a)、根据调度策略,将CPU时间划片为对应的时间片,当时间片耗尽,当前进程必须挂起。
(b)、资源不足的,在获取到足够资源之前进程挂起。
(c)、进程sleep挂起进程。
(d)、高优先级进程导致当前进度挂起
(e)、硬件中断,导致当前进程挂起

2、线程上下文切换的 过程

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

3、 中断上下文切换,如何理解?

为了快速响应硬件的事件(如USB接入),中断处理会打断进程的正常调度和执行,转而调用中断处理程序,

响应设备事件。而打断其它进程执行时,需要进行上下文切换。中断事件过多,会无谓的消耗CPU资源,导致进程处理时间延长。

对于一个CPU来说,中断处理比进程拥有更高的优先级

三、课后思考题

1、题目

最后,我想邀请你一起来聊聊,你所理解的CPU上下文切换,你可以结合今天的内容,总结自己的思路和看法,写下你的学习心得

2、经典留言

进程切换我想到了很多年前在银行柜台办理业务的情形。
1:银行分配各个窗口给来办理业务的人
2:如果只有1个窗口开放(系统资源不足),大部分都得等
3:如果正在办理业务的突然说自己不办了(sleep),那他就去旁边再想想(等)
4:如果突然来了个VIP客户,可以强行插队
5:如果突然断电了(中断),都得等。。

最新文章

  1. 基于JQuery的获取鼠标进入和离开容器方向的实现
  2. Solved: “Cannot execute a program. The command being executed was \roslyn\csc.exe”
  3. CSS3-04 样式 3
  4. Java中的位运算
  5. TeamTalk源码分析之服务端描述
  6. “Stamping” PDF Files Downloaded from SharePoint 2010
  7. js问的我醉的不要不要的。
  8. Jquery入门之----------选择器-------------
  9. PAT 1002
  10. PHP curl 参数详解
  11. 制作font-icon有感
  12. 变态最大值(nyoj)
  13. 基于Java SE的模拟双色球彩票系统
  14. Mybatis框架 基础
  15. 《剑指offer》数组中出现一半次数的数字
  16. Java基础语法入门
  17. Windows Docker 使用笔记
  18. linux软件管理 YUM命令
  19. appium入门级教程(1)—— appium介绍
  20. 循序渐进学.Net Core Web Api开发系列【0】:序言与目录

热门文章

  1. 大话设计模式Python实现-建造者模式
  2. 构建Shiny应用
  3. elementui树表修改子节点不能实时更新的解决办法
  4. Logstash:多个配置文件(conf)
  5. 端口快速扫描程序(c#版 一次可发起1000个连接)
  6. 使用 Floccus 插件和坚果云同步 Chrome 类浏览器书签
  7. runtime template in vuejs
  8. C 结构体、位域
  9. C#中全局作用域的常量、字段、属性、方法的定义与使用
  10. CTF必备技能丨Linux Pwn入门教程——ROP技术(上)