回答 硬件通过触发信号,会导致中断处理程序的调用,也是一种常见的任务 所以,根据任务的不同,CPU 的上下文切换可以分为不同的场景 进程上下文切换 线程上下文切换 中断上下文切换 系统调用 Linux 比如内存不足)时,要等到资源满足后才可以运行,这个时候进程也会被挂起,并由系统调度其他进程运行 4 - sleep 函数 当进程通过睡眠函数 sleep 这样的方法将自己主动挂起时,自然也会重新调度 5 线程上下文切换的场景一 前后两个线程属于不同进程 此时,因为不同进程的资源不共享,所以线程上下文切换 等同于 进程上下文切换 线程上下文切换的场景二 前后两个线程属于同一个进程 此时,因为同一进程的资源是共享的 ,所以在切换时,虚拟内存这些资源就保持不动 只需要切换线程的私有数据、寄存器等不共享的数据 多线程的优势 线程上下文切换对比进程上下文切换,很明显切换消耗的资源会更少,所以多线程比多进程更有优势 中断上下文切换 CPU 上下文切换的总结 CPU 上下文切换,是保证 Linux 系统正常工作的核心功能之一,一般情况下不需要关注【CPU 上下文切换是正常工作的核心功能】 但过多的上下文切换,会把 CPU 时间消耗在寄存器
文章目录 前言 上下文切换 上下文切换会消耗资源吗? 如何减少上下文切换导致额外的开销 前言 曾经有一份丰厚的报酬摆在我面前,我没有珍惜。直到失去之后我才意识到,我可以会写线程上下文切换。 ---- 上下文切换 这就是上下文切换。 CPU通过分配时间片来执行任务,当一个任务的时间片用完,就会切换到另一个任务。在切换之前会保存上一个任务的状态,当下次再切换到该任务,就会加载这个状态。 ---- 上下文切换会消耗资源吗? 那当然啊。 是因为线程上下文切换导致额外的开销。 在Linux系统下可以使用vmstat命令来查看上下文切换的次数(上一篇讲过这个) ---- 如何减少上下文切换导致额外的开销 减少上下文切换次数便可以提高多线程的运行效率。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
因此,CPU 上下文切换至少有三种不同的类型: 进程上下文切换 线程上下文切换 中断上下文切换 让我们一一来看看。 进程上下文切换是指从一个进程切换到另一个进程,而系统调用期间始终运行同一个进程 系统调用过程通常被称为特权模式切换,而不是上下文切换。但实际上,在系统调用过程中,CPU 的上下文切换也是不可避免的。 中断上下文切换 除了前面两种上下文切换之外,还有另外一种场景也输出 CPU 上下文切换的,那就是中断。 为了快速响应事件,硬件中断会中断正常的调度和执行过程,进而调用中断处理程序。 0 1230 1.00 0.00 iscsid 08:06:34 0 4089 1.00 0.00 kworker/1:5 ,是指进程无法获取所需资源,导致的上下文切换,比如说,I/O,内存等系统资源不足时,就会发生自愿上下文切换。
每种处理器都提供了硬件级别的上下文切换,比如x86架构下的TSS段,TSS段包括了一个任务执行的所需要的所有上下文,主要有:1.通用寄存器和段寄存器。 5.链接到前一任务的链指针。所以上下文切换也很简单,直接用call或者jmp指令调度任务。同样ARM架构也有快速上下文切换技术。 但是Linux为了适用更多的cpu架构没使用处理器相关的上下文切换技术,而是大部分通过软件实现。linux上下文切换就在schedule()函数里,很多地方都会调用这个函数。 经过前面的代码计算后找出下一个要执行的任务,然后开始执行上下文切换。 /*保存prev 的ebp*/ \ "movl %%esp,%0\n\t" /* 保存prev内核栈指针,保存到当前进程的thread结构 */ \ "movl %5,
所以任务从保存到再加载的过程就是一次上下文切换。 很明显上下文切换会影响多线程的执行速度。 如何减少上线文切换 减少上下文切换的方法有 1、无锁并发编程。 减少上下文切换的例子 下面我们看一个通过减少线上大量WAITING的线程,来减少上下文切换次数的例子: 使用jstack命令dump线程信息,看看pid为3117的进程里的线程都在做什么 sudo 统计所有线程分别处于什么状态,发现300多个线程处于WAITING(onobjectmonitor)状态 grep java.lang.Thread.State dump17 | awk '{print $2$3$4$5} grep java.lang.Thread.State dump17 | awk '{print $2$3$4$5}' | sort | uniq -c 44 RUNNABLE 22 TIMED_WAITING 这种切换称为“上下文切换”(“context switch”)。CPU会在一个上下文中执行一个线程,然后切换到另外一个上下文中执行另外一个线程。上下文切换并不廉价,是比较耗时的
各个进程之间是共享 CPU 资源的,在不同的时候进程之间需要切换,让不同的进程可以在 CPU 执行,那么这个一个进程切换到另一个进程运行,称为进程的上下文切换。 所以,进程的上下文切换不仅包含了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的资源。 大家需要注意,进程的上下文开销是很关键的,我们希望它的开销越小越好,这样可以使得进程可以把更多时间花费在执行程序上,而不是耗费在上下文切换。 发生进程上下文切换有哪些场景? 1. 当有优先级更高的进程运行时,为了保证高优先级进程的运行,当前进程会被挂起,由高优先级进程来运行; 5.
多线程之上下文切换 1.1. 定义 1.2. 上下文切换的分类和诱因 1.2.1. 自发性的上下文切换 1.2.2. 非自发性上下文切换 1.3. 上下文切换的花销 1.3.1. 间接开销 多线程之上下文切换 定义 在单处理器的情况下,每个线程的执行时间是根据时间片大小决定或者自身的其他原因,如果一个线程被迫或者主动暂停运行时,另外一个线程(可能是同一个进程中的线程或者其他进程中的 自发性的上下文切换 自发性上下文切换是指线程由于自身因素导致的切出。 IO操作(如读取文件) 或者等待其他线程的持有的锁也会导致自发性上下文切换 非自发性上下文切换 由于线程调度器的原因被迫切出 时间片用完 一个更高优先级的线程需要运行 垃圾回收器在执行垃圾回收的过程中可能也是需要暂停线程才能完成工作 上下文切换的花销 上下文切换的花销是必须的,即使在多核的处理器系统中上下文切换也是必须的,因为我们需要执行的线程的数量总是大于处理器的数量。
本文将从这以下两个方面来展开 上下文切换有哪些类型以及可能出现的场景 衡量各场景上下文切换耗时 1, 上下文切换类型及场景 上下文大体上可以分为两类 进程上下文 中断上下文 进程上下文具体包括: (1 中断上下文具体包括: (1)硬件传递过来的参数 因此上下文切换可以分为以下几类: (1)进程之间的上下文切换:A进程切换到B进程 (2)进程和中断之间的上下文切换:进程A被中断打断 (3)中断之间的上下文切换 (本文所有数据均是Intel(R) Xeon(R) V4和V5 CPU上得到)而在虚拟机上,一次系统调用更是可能达到 240ns ,从perf来看,system_call_after_swapgs函数消耗 [5.png] contextswitch contextswitch这里还增加了在同一个NUMA上的测试,从测试数据看,两个进程如果调度到同一个NUMA上时,耗时会更短。 [6.png] 从测试数据看: 如果两个进程跨NUMA,一次上下文切换的耗时在2500ns 如果两个进程在同NUMA,一次上下文切换的耗时在1500ns 在虚拟机里面,跨核的上下文切换会更大,因为vcpu
它们都是CPU在运行时必须依赖的环境,因此也被称作为CPU上下文 CPU上下文切换 CPU上下文切换就是把前一个任务的上下文(也就是CPU寄存器和程序计数器)保存起来,然后加载新任务的上下文开始执行。 根据CPU执行的任务的不同,上下文切换分为这三种:进程上下文切换、线程上下文切换,中断上下文切换 进程上下文切换 每次进程的上下文切换将会花费几十纳秒到数微秒的时间,过多的进程上下文切换就是我们上篇文章提到过系统负载过高的原因之一 以下这些场景都会引起进程的上下文切换: 我们知道在多核CPU中,为了公平调度,CPU的时间是分为一段段的时间片然后分配给各个进程的,当某个进程的时间片用完之后,就会被系统挂起,从而让CPU切换到其他进程 ,这个进程也有可能被挂起 当这个进程需要的资源不足以维持运行时,该进程也会被挂起以等待足够的资源 进程内部可以使用sleep等函数主动将自己挂起 当多个进程竞争临界资源发生死锁时 发生硬件中断时 线程上下文切换 ,这也是多线程应用相较于多进程应用的优势所在 中断上下文切换 中断上下文切换是为了响应硬件的各种事件设计出来的,中断程序会打断进程的正常执行。
二: 什么是上下文切换? 任务从保存到再加载的过程就是一次上下文切换。 三:上下文切换产生的问题? 影响多线程的执行速度。 四:并发执行不一定比串行执行快。 因为线程有创建和上下文切换的开销。 public void run() { int a=0; for(long i=0;i<count;i++){ a+=5; start=System.currentTimeMillis(); int a=0; for(long i=0;i<count;i++){ a+=5;
上下文切换的原因 ---- 多线程编程中,我们知道线程间的上下文切换会导致性能问题,那么是什么原因造成的线程间的上下文切换。我们先看一下线程的生命周期,从中看一下找找答案。 ? 图中,一个线程从RUNNABLE到RUNNING的过程就是线程的上下文切换,RUNNING状态到BLOCKED、再到RUNNABLE、再从RUNNABLE到RUNNING的过程就是一个上下文切换的过程。 我们看到,多线程的上下文切换实际上就是多线程两个运行状态的相互切换导致的。 我们知道两种情况可以导致上下文切换:一种是程序本身触发的切换,这种我们一般称为自发性上下文切换,另一种是系统或者虚拟机导致的上下文切换,我们称之为非自发性上下文切换。 ,自发和非自发的调用操作,都会导致上下文切换,会导致系统资源开销。
这称为模式切换而不是上下文切换,因为它不会改变当前进程。 上下文切换是多任务操作系统的一个基本特性。多任务操作系统是指多个进程在单个CPU上同时执行,并且彼此互不干扰。 这种并发幻觉是通过快速连续发生的上下文切换(每秒数十或数百次)来实现的。这些上下文切换发生的原因是进程自愿放弃它们在CPU中的时间,或者是调度器在进程耗尽其CPU时间片时进行切换。 Intel 80386和更高的cpu包含对上下文切换的硬件支持。然而,大多数现代操作系统执行软件上下文切换(可在任何CPU上使用),而不是硬件上下文切换以获得更好的性能。 软件上下文切换的一个主要优点是,硬件机制可以保存几乎所有的CPU状态,而软件可以更有选择性地只保存实际需要保存和重新加载的部分。然而,关于这对于提高上下文切换的效率到底有多重要还存在一些问题。 事实上,尽管从CPU时间消耗的绝对值来看,上下文切换的成本一直在下降,但这似乎主要是由于CPU时钟速度的提高,而不是上下文切换本身效率的提高。
文章目录 什么是上下文切换 进程上下文切换 线程上下文切换 中断上下文切换 如何减少上下文切换 来个例子亲身感受下 什么是上下文切换 在多任务操作系统中,为了提高CPU的利用率,可以让当前系统运行远多于 简而言之,上下文切换,就是CPU把自己的时间片分配给不同的任务执行的过程。 根据任务类型的不同,上下文切换又分为三种类型: ●进程上下文切换。 ●线程上下文切换。 ●中断上下文切换。 进程的上下文切换和线程的上下文切换相同,进程切换之后,再恢复执行时,还是需要沿着上一次执行的位置继续运行,但是与线程相比,进程的上下文切换的损耗会更大。 现在,相信读者能够理解为什么要设计线程,因为线程的上下文切换对资源的保存和恢复占用更少,从而使得线程的上下文切换的时间更短。 即便如此,中断导致的上下文切换仍然会消耗CPU资源。 如何减少上下文切换 既然频繁的上下文切换会影响程序的性能,那么如何减少上下文切换呢?
上下文切换(有时也称做进程切换或任务切换)是指 CPU 从一个进程(或线程)切换到另一个进程(或线程)。上下文是指某一时间点 CPU 寄存器和程序计数器的内容。 所以任务从保存到再加载的过程就是一次上下文切换。 上下文切换通常是计算密集型的,意味着此操作会消耗大量的 CPU 时间,故线程也不是越多越好。 如何减少系统中上下文切换次数,是提升多线程性能的一个重点课题。
第一时间看干货文章 1 CPU 上下文切换是保证 Linux 系统正常运行的核心功能。可分为进程上下文切换、线程上下文切换和中断上下文切换。 例如 vmstat 5(5 秒输出间隔): 让我们看一下输出: cs(context switch):每秒上下文切换的次数。 in(interrupt):每秒的中断数。 添加 -w 选项,您可以看到每个进程的上下文切换: 例如: # Output interval is 5 $ pidstat -w 5 Linux 4.15.0 (ubuntu) 09/23/18 其中,cswch 表示每秒自愿上下文切换的次数,nvcswch 表示每秒非自愿上下文切换的次数。 自愿上下文切换:指进程无法获得所需资源而导致的上下文切换。 0 1230 1.00 0.00 iscsid 08:06:34 0 4089 1.00 0.00 kworker/1:5
什么是上下文切换?线程上下文切换是指一个线程在执行过程中,由于某种原因暂时停止执行,并将控制权转移到其他线程,然后再返回到原线程继续执行的过程。 在介绍线程上下文切换之前,先看两个问题(答案在最后)。问题1:是不是线程越多,执行效率越高?问题2:单核cpu多线程执行有没有意义?上下文切换分类? 线程上下文切换可以分为两种类型:自愿上下文切换和非自愿上下文切换。自愿上下文切换发生在应用程序显式地创建新线程并让旧线程进入等待状态时。 非自愿上下文切换则由系统决定,例如当一个线程正在等待某个事件(如I/O操作)时,系统会暂停该线程的执行,并切换到另一个可运行的线程。线程上下文切换的原因?线程上下文切换的原因有多种,例如:1. 总之,了解线程上下文切换的概念和过程对于进行多线程编程和应用开发非常重要。通过合理地设计程序和优化线程调度策略,可以减少不必要的上下文切换并提高系统性能。
因此,CPU 上下文切换至少有三种不同的类型: 进程上下文切换 线程上下文切换 中断上下文切换 让我们一一来看看。 进程上下文切换是指从一个进程切换到另一个进程,而系统调用期间始终运行同一个进程 系统调用过程通常被称为特权模式切换,而不是上下文切换。但实际上,在系统调用过程中,CPU 的上下文切换也是不可避免的。 进程上下文切换 vs 系统调用 那么进程上下文切换和系统调用有什么区别呢?首先,进程是由内核管理的,进程切换只能发生在内核态。 中断上下文切换 除了前面两种上下文切换之外,还有另外一种场景也输出 CPU 上下文切换的,那就是中断。 为了快速响应事件,硬件中断会中断正常的调度和执行过程,进而调用中断处理程序。 另外,和进程上下文切换一样,中断上下文切换也会消耗 CPU。过多的切换次数会消耗大量的 CPU 资源,甚至严重降低系统的整体性能。
目录 1.什么是CPU上下文切换 2.CPU上下文切换的类型 3.如何查看系统中的上下文切换 4.案例 5.总结 ---- 读过倪朋飞的《Linux性能优化实战》经常说的 CPU 上下文切换是什么意思? 5.发生硬件中断,CPU上的进程会被中断挂起,来执行中断程序。 以上是导致进程切换问题的常见原因。 0 11 7 0 0 1936184 0 1363776 0 0 0 0 33869 1595752 12 84 5 0 0 5 0 0 1936184 0 1363776 0 0 0 0 32162 1607547 12 80 8 0 0 5 0 0 1936184 5.总结 本文学习了CPU上下文切换的概念以及中断的类型。
Java线程面试题:什么是线程上下文切换?为什么要减少上下文切换? 而将这些信息保存起来、加载其他线程运行所需的上下文信息,然后再切换到该线程继续执行的过程就被称为线程上下文切换。 减少上下文切换的原因如下: 系统运行时会出现很多线程切换的情况,如果上下文切换时间过长,会造成 CPU 时间浪费,导致系统效率低下; 上下文切换需要保存和恢复线程的状态,需要大量地在内存中进行数据读写操作 同时,在多个核心 CPU 中切换线程也会造成不必要的上下文切换,影响多核性能。 为了减少上下文切换,可以采用以下几种措施: 减少线程的数量,减少线程之间的竞争。 使用同步机制避免线程资源争用,减少上下文切换。 总结:线程上下文切换是多线程编程过程中普遍存在的一个问题,但是过多的上下文切换会造成资源和时间的浪费,影响系统的效率。