• D白菜
    2018-11-26
    今天的课抽象的东西很多,还需要时间理解消化。对学习做了个简单的总结,初学者有何很多地方理解不对,请老师和童鞋们多多指正。
    1、多任务竞争CPU,cpu变换任务的时候进行CPU上下文切换(context switch)。CPU执行任务有4种方式:进程、线程、或者硬件通过触发信号导致中断的调用。
    2、当切换任务的时候,需要记录任务当前的状态和获取下一任务的信息和地址(指针),这就是上下文的内容。因此,上下文是指某一时间点CPU寄存器(CPU register)和程序计数器(PC)的内容, 广义上还包括内存中进程的虚拟地址映射信息.
    3、上下文切换的过程:
          (1)记录当前任务的上下文(即寄存器和计算器等所有的状态);
          (2)找到新任务的上下文并加载;
          (3)切换到新任务的程序计算器位置,恢复其任务。
    4、根据任务的执行形式,相应的下上文切换,有进程上下文切换、线程上下文切换、以及中断上下文切换三类。
    5、进程和线程的区别:
    进程是资源分配和执行的基本单位;线程是任务调度和运行的基本单位。线程没有资源,进程给指针提供虚拟内存、栈、变量等共享资源,而线程可以共享进程的资源。
    6、进程上下文切换:是指从一个进程切换到另一个进程。
    (1)进程运行态为内核运行态和进程运行态。内核空间态资源包括内核的堆栈、寄存器等;用户空间态资源包括虚拟内存、栈、变量、正文、数据等
    (2)系统调用(软中断)在内核态完成的,需要进行2次CPU上下文切换(用户空间-->内核空间-->用户空间),不涉及用户态资源,也不会切换进程。
    (3)进程是由内核来管理和调度的,进程的切换只能发生在内核态。所以,进程的上下文不仅包括了用户空间的资源,也包括内核空间资源。
    (4)进程的上下文切换过程:
       (a)接收到切换信号,挂起进程,记录当前进程的虚拟内存、栈等资源存储;
       (b)将这个进程在 CPU 中的上下文状态存储于起来;
       (c)然后在内存中检索下一个进程的上下文;
       (d)并将其加载到 CPU的寄存器中恢复;
       (3)还需要刷新进程的虚拟内存和用户栈;
       (f)最后跳转到程序计数器所指向的位置(即跳转到进程被中断时的代码行),以恢复该进程。
    (5)、下列将会触发进程上下文切换的场景:
      (a)、根据调度策略,将CPU时间划片为对应的时间片,当时间片耗尽,当前进程必须挂起。
      (b)、资源不足的,在获取到足够资源之前进程挂起。
      (c)、进程sleep挂起进程。
      (d)、高优先级进程导致当前进度挂起
      (e)、硬件中断,导致当前进程挂起
    7、线程上下文切换:
    (1)、不通进程之间的线程上下文切换,其过程和进程上下文切换大致相同。
    (2)、进程内部的线程进上下文切换。不需要切换进程的用户资源,只需要切换线程私有的数据和寄存器等。这会比进程上下文进程切换消耗的资源少,所以多线程相比多进程的优势。
    8、中断上下文切换
    快速响应硬件的事件,中断处理会打断进程的正常调度和执行。同一CPU内,硬件中断优先级高于进程。切换过程类似于系统调用的时候,不涉及到用户运行态资源。但大量的中断上下文切换同样可能引发性能问题。

    有些疑惑,想请教老师,
    (1)从用户态和内核态之间的转变过程通过系统调用,那么系统调用属于一种上下文切换吗?如果是上下文切换,属于哪一类上下文切换呢,和进程上下文切换的关系是什么?
    (2)指令寄存器和程序计算器,这两个东东比较模糊。
    展开

    作者回复: 👍课代表来了

    (1)系统调用属于同进程内的CPU上下文切换;
    (2)分别是CPU用来存储指令和下一条要执行指令的寄存器

     3
     105
  • 龙猫
    2018-11-26
    怎么知道cpu是耗费在上下文切换呢?
     1
     26
  • 炀☁️
    2018-11-27
    cpu上下文切换就好比一个人有好多朋友要拜访,有的朋友房子大(进程),进进出出里三层外三层,有的朋友住帐篷(线程),就拉开帐篷聊聊天,有的朋友就隔着窗户说两句话打个照面路过(中断)

    作者回复: 😊很棒的比喻

    
     17
  • 石维康
    2018-11-26
    课程内容中说"用户空间(Ring 3)只能访问受限资源,不能直接访问内存等..",其实在用户态,还是可以直接访问属于用户态的内存的吧
     1
     17
  • MoFanDon
    2018-11-26
    以前的确是没怎么注意 CPU上下文切换,进程上下文切换 是不同的。学习了。
    
     16
  • 小花
    2019-03-25
    进程切换我想到了很多年前在银行柜台办理业务的情形。
    1:银行分配各个窗口给来办理业务的人
    2:如果只有1个窗口开放(系统资源不足),大部分都得等
    3:如果正在办理业务的突然说自己不办了(sleep),那他就去旁边再想想(等)
    4:如果突然来了个VIP客户,可以强行插队
    5:如果突然断电了(中断),都得等。。
    展开

    作者回复: 赞,太形象了

    
     15
  • Q
    2018-12-25
    学习总结:

    * 上下文切换是什么?
    上下文切换是对任务当前运行状态的暂存和恢复
    * CPU为什么要进行上下文切换?
    当多个进程竞争CPU的时候,CPU为了保证每个进程能公平被调度运行,采取了处理任务时间分片的机制,轮流处理多个进程,由于CPU处理速度非常快,在人类的感官上认为是并行处理,实际是"伪"并行,同一时间只有一个任务在运行处理。
    * 上下文切换主要消耗什么资源,为什么说上下文切换次数过多不可取?
    根据 Tsuna 的测试报告,每次上下文切换都需要几十纳秒到到微秒的CPU时间,这些时间对CPU来说,就好比人类对1分钟或10分钟的感觉概念。在分秒必争的计算机处理环境下,浪费太多时间在切换上,只能会降低真正处理任务的时间,表象上导致延时、排队、卡顿现象发生。
    * 上下文切换分几种?
    进程上下文切换、线程上下文切换、中断上下文切换
    * 什么情况下会触发上下文切换?
    系统调用、进程状态转换(运行、就绪、阻塞)、时间片耗尽、系统资源不足、sleep、优先级调度、硬件中断等
    * 线程上下文切换和进程上下文切换的最大区别?
    线程是调度的基本单位,进程是资源拥有的基本单位,同属一个进程的线程,发生上下文切换,只切换线程的私有数据,共享数据不变,因此速度非常快。
    * 中断上下文切换,如何理解?
    为了快速响应硬件的事件(如USB接入),中断处理会打断进程的正常调度和执行,转而调用中断处理程序,响应设备事件。而打断其它进程执行时,需要进行上下文切换。中断事件过多,会无谓的消耗CPU资源,导致进程处理时间延长。
    * 有哪些减少上下文切换的技术用例?
    数据库连接池(复用连接)、合理设置应用的最大进程,线程数、直接内存访问DMA、零拷贝技术
    展开

    作者回复: 👍

     1
     13
  • 衣申人
    2018-11-26
    老师您好,有三个问题不是很理解:

    1.系统调用的过程是上下文切换的话,那么函数调用是不是也可以叫上下文切换?
    2.进程上下文切换,还需要刷新虚拟内存,是什么意思呢?上下文切换应该是把进程在cpu中的状态信息保存到内存,然后读取另一个进程内存中的状态信息到cpu,为什么涉及虚拟内存的刷新?还会影响到TLB?
    3.CPU时间片是固定大小的吗?如果是,那么如果每个进程都正常获得时间片和到期释放,那么不管进程数量多少,是不是单位时间内的上下文切换次数是一定的?

    盼望老师解答,谢谢。
    展开
     2
     11
  • 玉剑冰锋
    2018-11-30
    Ring1和Ring2代表啥意思?
     1
     8
  • sotey
    2018-11-26
    交作业: 老师,在我的理解,CPU上下文是指程序执行的指令和环境变量和内存位置,上下文切换是CPU把当前正在执行的程序上下文从CPU内容(寄存器和计数器)保存到内存,内存的分层结构这里暂不关注(因为我也一知半解),再把需要执行的程序从内存里保存的上下文加载到CPU内(寄存器)交给CPU执行。进程和线程以及中断其实大致过程是一样的,由于离内核的距离不同,需要切换的内容量不同,因此切换效率是不同的。以上为今天的作业,请老师审阅。
    
     8
  • 地心引力
    2018-11-29
    进程调用系统调用,从用户态切换到内核态需要保存进程的上下文,而中断发生时,中断处理程序也是在内核态运行,但此时为什么就不需要保存进程的上下文呢,这种差别的本质原因是什么,望老师指教

    作者回复: 不是不保存进程上下文,而是不需要刷新虚拟内存这些用户空间的数据,但具体到内核中的状态肯定还是要刷新的

    
     6
  • Maxwell
    2018-11-26
    上下文切换多高算高呢?
    
     6
  • 付坤
    2018-11-26
    请老师帮忙解答一个疑问,在 Kubernetes 编排的这种虚拟化技术中,当给某个容器限定只有一个 CPU 时,容器内的镜像是拥有 24 CPU 的,那么在这种情况下,业务内是当成只存在一个 CPU 使用,还是 拥有 24 个,但每个 CPU 的能力只有一个正常CPU的 1/24 ?不同的使用方式,应该会影响到 CPU 的上下文切换。
    
     5
  • 王崧霁
    2018-11-26
    进程是资源分配的最小单位,线程是任务调度执行的最小单位,每个进程都有一个主线程,从这个角度说是不是只有线程的上下文切换,而所谓进程上下文切换实则是进程之间获取地址空间等资源的系统调用; 中断分硬中断和软中断,他们的上下文切换又有什么区别哪?
    
     4
  • 耿长学
    2018-11-26
    老师,推荐基本性能相关的书籍吧
     1
     4
  • 王晓冉
    2018-11-27
    内核堆栈能详细介绍下吗?
    
     3
  • Linuxer
    2018-11-26
    进程上下文切换包括,进程之间上下文切换,线程之间上下文切换,中断上下文切换。其中跨进程的线程上下文切换等同进程上下文切换,前面关于cpu寄存器,全局变量等需不需要保存都好理解,只是中断上下文切换为什么不需要保存虚拟内存和全局变量等?
     1
     3
  • 肖韬
    2019-08-10
    老师,问一个问题

    在保存当前进程的内核状态和 CPU 寄存器之前,需要先把该进程的虚拟内存、栈等保存下来;而加载了下一进程的内核态后,还需要刷新进程的虚拟内存和用户栈。

    进程的虚拟内存这些数据保存在哪里呢?是保存虚拟内存的地址还是内容?
    
     2
  • sunsweet
    2019-02-08
    开销排名:进程上线文切换>同进程线程上线文切换>中断上线文切换>内核模式切换>协程上线文切换>用户态函数调用上下文切换
    对吗???

    作者回复: 差不多,不过最后两个应该要看具体情况的

    
     2
  • 张德
    2018-12-06
    打卡打卡 小白变大神
    
     2
我们在线,来聊聊吧