zoukankan      html  css  js  c++  java
  • Linux性能优化实战学习笔记:第三讲

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

    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:如果突然断电了(中断),都得等。。

  • 相关阅读:
    初学python 遇到的坑
    golang 裸写一个pool池控制协程的大小
    自制C#版3DS文件的解析器并用SharpGL显示3DS模型
    [译+改]最长回文子串(Longest Palindromic Substring) Part II
    [译]最长回文子串(Longest Palindromic Substring) Part I
    [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之纹理Textures
    [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之网格Meshes
    [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之网格渲染器和过滤器Mesh renderers and filters
    [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之材质了解Materials
    [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之灯光介绍Lights
  • 原文地址:https://www.cnblogs.com/luoahong/p/10802102.html
Copyright © 2011-2022 走看看