精华内容
下载资源
问答
  • 进程、线程上下文切换开销

    千次阅读 2020-09-10 11:21:07
    进程、线程上下文切换开销 虚拟内存与地址空间映射关系 虚拟内存是操作系统为每个进程提供的一种抽象,每个进程都有属于自己的、私有的、地址连续的虚拟内存,当然我们知道最终进程的数据及代码必然要放到物理...

    虚拟内存与地址空间映射关系

    虚拟内存是操作系统为每个进程提供的一种抽象,每个进程都有属于自己的、私有的、地址连续的虚拟内存,当然我们知道最终进程的数据及代码必然要放到物理内存上,那么必须有某种机制能记住虚拟地址空间中的某个数据被放到了哪个物理内存地址上,这就是所谓的地址空间映射,也就是虚拟内存地址与物理内存地址的映射关系,那么操作系统是如何记住这种映射关系的呢,答案就是页表,页表中记录了虚拟内存地址到物理内存地址的映射关系。有了页表就可以将虚拟地址转换为物理内存地址了,这种机制就是虚拟内存。

    进程上下文切换与线程上下文切换的对比

    进程切换

    切换虚拟地址空间,切换内核栈和硬件上下文

    线程切换

    切换内核栈和硬件上下文

    进程与线程的区别?

    (1)进程有自己的独立地址空间,线程没有

    (2)进程是资源分配的最小单位,线程是CPU调度的最小单位

    (3)进程和线程通信方式不同(线程之间的通信比较方便。同一进程下的线程共享数据(比如全局变量,静态变量),通过这些数据来通信不仅快捷而且方便,当然如何处理好这些访问的同步与互斥正是编写多线程程序的难点。而进程之间的通信只能通过进程通信的方式进行。)

    (4)进程上下文切换开销大,线程开销小

    (5)一个进程挂掉了不会影响其他进程,而线程挂掉了会影响其他线程

    (6)对进程操作一般开销都比较大,对线程开销就小了

    为什么进程上下文切换比线程上下文切换代价高?

    进程切换分两步:

    1.切换页目录以使用新的地址空间

    2.切换内核栈硬件上下文

    对于linux来说,线程和进程的最大区别就在于地址空间,对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的。

    切换的性能消耗:

    1、线程上下文切换和进程上下问切换一个最主要的区别是线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的。这两种上下文切换的处理都是通过操作系统内核来完成的。内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。

    2、另外一个隐藏的损耗是上下文的切换会扰乱处理器的缓存机制。简单的说,一旦去切换上下文,处理器中所有已经缓存的内存地址一瞬间都作废了。还有一个显著的区别是当你改变虚拟内存空间的时候,处理的页表缓冲(processor's Translation Lookaside Buffer (TLB))被全部刷新,这将导致内存的访问在一段时间内相当的低效。但是在线程的切换中,不会出现这个问题。

    切换开销

    最显著的性能损耗是将保存寄存器中的内容

    CPU高速缓存失效

    页表查找是一个很慢的过程,因此通常使用Cache来缓存常用的地址映射,这样可以加速页表查找,这个cache就是TLB.当进程切换后页表也要进行切换,页表切换后TLB就失效了,cache失效导致命中率降低,那么虚拟地址转换为物理地址就会变慢,表现出来的就是程序运行会变慢

    如何避免

     

    展开全文
  • 如何减少线程上下文切换

    千次阅读 2019-04-15 22:35:18
    频繁的线程上下文切换会成为一个系统瓶颈,本来引入线程就是为了提高系统运行效率,这下倒好了,频繁的线程上下文切换可能会给系统造成更大的系统开销,让系统苦不堪言。 首先了解一下,线程切换似乎有两种方式,第...

    频繁的线程上下文切换会成为一个系统瓶颈,本来引入线程就是为了提高系统运行效率,这下倒好了,频繁的线程上下文切换可能会给系统造成更大的系统开销,让系统苦不堪言。

    首先了解一下,线程切换似乎有两种方式,第一种是抢占式,第二种是时间片轮转。

     

    抢占式一般跟锁竞争有关,那么如果我们减少锁竞争,是不是就可以减少上下文切换。

     

    时间片轮转一般跟时间片有关,那么如果我们减少线程数或者使用协程,是不是也可以减少上下文切换呢。

     

     

    展开全文
  • 线程上下文切换

    2020-04-25 10:53:13
    线程上下文切换 什么时候会发生上下文切换? 按导致上下文切换的因素划分,可将上下文切换分为两点: 自发性上下文切换 非自发性上下文切换 自发性上下文切换指线程由于自身因素导致的切出。通过调用下列方法会导致...

    线程上下文切换

    什么时候会发生上下文切换?
    按导致上下文切换的因素划分,可将上下文切换分为两点:

    自发性上下文切换
    非自发性上下文切换
    

    自发性上下文切换指线程由于自身因素导致的切出。通过调用下列方法会导致自发性上下文切换:

    Thread.sleep()
    Object.wait()
    Thread.yeild()
    Thread.join()
    LockSupport.park()等
    

    非自发性上下文切换指线程由于线程调度器的原因被迫切出。
    发生下列情况可能导致非自发性上下文切换:

    切出线程的时间片用完
    有一个比切出线程优先级更高的线程需要被运行
    虚拟机的垃圾回收动作
    

    上下文切换的开销

    上下文切换的开销包括直接开销和间接开销。
    

    直接开销有如下几点:

    操作系统保存回复上下文所需的开销
    线程调度器调度线程的开销
    

    间接开销有如下几点:

    处理器高速缓存重新加载的开销
    上下文切换可能导致整个一级高速缓存中的内容被冲刷,即被写入到下一级高速缓存或主存
    

    展开全文
  • 在进行并发编程时,如果希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战,比如上下文切换的问题、死锁的问题,以及受限于硬件和软件的资源限制问题,本文要研究的是上下文切换的问题。 什么是上下文...

    并发编程的目的是为了让程序运行得更快,但是并不是启动更多的线程就能让程序最大限度地并发执行。在进行并发编程时,如果希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战,比如上下文切换的问题、死锁的问题,以及受限于硬件和软件的资源限制问题,本文要研究的是上下文切换的问题。

     

    什么是上下文切换

    即使是单核CPU也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程时同时执行的,时间片一般是几十毫秒(ms)。

    CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再次加载这个任务的状态,从任务保存到再加载的过程就是一次上下文切换

    这就像我们同时读两本书,当我们在读一本英文的技术书籍时,发现某个单词不认识,于是便打开中英文词典,但是在放下英文书籍之前,大脑必须先记住这本书读到了多少页的第多少行,等查完单词之后,能够继续读这本书。这样的切换是会影响读书效率的,同样上下文切换也会影响多线程的执行速度。

     

    上下文切换代码测试

    下面的代码演示串行和兵法执行并累加操作的时间:

    public class ContextSwitchTest
    {
        private static final long count = 10000;
        
        public static void main(String[] args) throws Exception
        {
            concurrency();
            serial();
        }
        
        private static void concurrency() throws Exception
        {
            long start = System.currentTimeMillis();
            Thread thread = new Thread(new Runnable(){
                public void run()
                {
                    int a = 0;
                    for (int i = 0; i < count; i++)
                    {
                        a += 5;
                    }
                }
            });
            thread.start();
            int b = 0;
            for (long i = 0; i < count; i++)
            {
                b --;
            }
            thread.join();
            long time = System.currentTimeMillis() - start;
            System.out.println("Concurrency:" + time + "ms, b = " + b);
        }
        
        private static void serial()
        {
            long start = System.currentTimeMillis();
            int a = 0;
            for (long i = 0; i < count; i++)
            {
                a += 5;
            }
            int b = 0;
            for (int i = 0; i < count; i++)
            {
                b --;
            }
            long time = System.currentTimeMillis() - start;
            System.out.println("Serial:" + time + "ms, b = " + b + ", a = " + a);
        }
    }

    修改上面的count值,即修改循环次数,看一下串行运行和并发运行的时间测试结果:

    循环次数串行执行耗时/ms并发执行耗时/ms串行和并发对比
    1亿7850并发快约0.5倍
    1000万106并发快约0.5~1倍
    100万32差不多
    10万22差不多
    1万01差不多,十几次执行下来,总体而言串行略快

    从表中可以看出,100次并发执行累加以下,串行执行和并发执行的运行速度总体而言差不多,1万次以下串行执行甚至还可以说是略快。为什么并发执行的速度会比串行慢呢?这就是因为线程有创建和上下文切换的开销

     

    引起线程上下文切换的原因

    对于我们经常使用的抢占式操作系统而言,引起线程上下文切换的原因大概有以下几种:

    1. 当前执行任务的时间片用完之后,系统CPU正常调度下一个任务
    2. 当前执行任务碰到IO阻塞,调度器将此任务挂起,继续下一任务
    3. 多个任务抢占锁资源,当前任务没有抢到锁资源,被调度器挂起,继续下一任务
    4. 用户代码挂起当前任务,让出CPU时间
    5. 硬件中断

     

    上下文切换次数查看

    在Linux系统下可以使用vmstat命令来查看上下文切换的次数,下面是利用vmstat查看上下文切换次数的示例:

    CS(Context Switch)表示上下文切换的次数,从图中可以看到,上下文每秒钟切换500~600次左右。

    如果要查看上下文切换的时长,可以利用Lmbench3,这是一个性能分析工具。

     

    如何减少上下文切换

    既然上下文切换会导致额外的开销,因此减少上下文切换次数便可以提高多线程程序的运行效率。减少上下文切换的方法有无锁并发编程、CAS算法、使用最少线程和使用协程。

    • 无锁并发编程。多线程竞争时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash取模分段,不同的线程处理不同段的数据
    • CAS算法。Java的Atomic包使用CAS算法来更新数据,而不需要加锁
    • 使用最少线程。避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态
    • 协程。在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换

    【毒鸡汤:我相信乔布斯说的,只有那些疯狂到认为自己可以改变世界的人才能真正地改变世界。面对压力,我可以挑灯夜战、不眠不休;面对困难,我愿意迎难而上、永不退缩。

    展开全文
  • 线程上下文切换详解

    万次阅读 多人点赞 2019-05-30 14:35:17
    什么是上下文切换? CPU通过分配时间片来执行任务,当一个任务的时间片用完,就会切换到另一个任务。在切换之前会保存上一个任务的状态,当下次再切换到该任务,就会加载这个状态。 ——任务从保存到再加载的过程...
  • 线程上下文切换

    2019-06-25 16:37:00
    这种一个线程被暂停,即被剥夺处理器使用权,另一个线程选中开始或者继续运行的过程就叫:线程上下文切换。 切出: 一个线程被剥夺处理器的使用权而被暂停运行就被称为切出。 切入: 一个线程被操作系统选中或者开始...
  • Java应用中线程是不是开的越多越好,开多少合适,如何减少上下文切换开销?,如何写个shell脚本获取上下文切换的开销?
  • 上下文切换 (CS)是基础操作系统提供的宝贵服务。... 所需的开销和时间称为上下文切换开销。 何必呢? 随着上下文切换的增加,CPU缓存中可用的上下文数据的可能性很小,因此需要从主内存中获取,这比从...
  • 进程、线程上下文切换

    千次阅读 2020-05-24 22:12:02
    上下文切换(有时也称做进程切换或任务切换)是指 CPU 从一个进程或线程切换到另一个进程或线程上下文切换可以认为是内核(操作系统的核心)在 CPU 上对于进程(包括线程)进行以下的活动:(1)挂起一个进程,将...
  • 进程/线程上下文切换会用掉你多少CPU?进程上下文切换一个简单的进程上下文切换开销测试实验 进程 进程是操作系统的问题大发明之一,对应用程序屏蔽了CPU调度、内存管理等硬件细节,而抽象出一个进程的概念,让应用...
  • Java线程上下文切换

    2020-12-23 15:10:37
    虽然并不是真正意义的“同一时间点”,而是 多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。 再后来发展到多线程技术,使得在一个程序...
  • 基本功:线程上下文切换

    万次阅读 多人点赞 2019-05-31 22:06:42
    更多的线程意味着线程创建销毁开销加大、上下文非常频繁,你的程序反而不能支持更高的TPS。可以看另一篇《Java从线程安全到synchronized和Lock探索》 时间片 多任务系统往往需要同时执行多道作业。作业数往往大于...
  • 线程上下文切换

    2020-10-03 10:03:32
    文章目录上下片切换减少上下文切换开销: 上下片切换 单核CPU也支持多线程执行代码,通过分配时间片来实现多线程,切到下一个任务前会保留上一个任务的状态,方便回来,这也称之为上下片切换(切换所需的开销,...
  • 锁开销和上下文切换开销

    千次阅读 2017-07-07 10:21:47
    一、互斥锁的开销主要在内核态与用户态的切换:  申请锁时,从用户态进入内核态,申请到后从内核态返回用户态(两次切换);没有申请到时阻塞睡眠在内核态。使用完资源后释放锁,从用户态进入内核态,唤醒阻塞等待...
  • 线程数量设置太大,可能带来资源的过度竞争,导致上下文切换,带来的额外的系统开销 上下文切换 1.在单处理器时期,操作系统就能处理多线程并发任务,处理器给每个线程分配CPU时间片,线程在CPU时间片内执行任务...
  • 什么是上下文切换 即使是单核CPU也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程...
  • 线程中两个必要的开销线程的创建、上下文切换 上下文切换: 概念: 当前任务执行一个时间片后会切换到下一个任务。在切换之前,上一个任务的状态会被保存下来,下次切换回这个任务时,可以再加载这个任务的...
  • 线程中两个必要的开销线程的创建、上下文切换。下文主要讲的是上下文切换 1. 上下文切换的概念? 上下文切换是指CPU的控制权由运行任务转移到另外一个就绪任务时所发生的事件。 通俗的说,上下文切换就是从当前...
  • 1、什么是线程上下文 2、哪些可以引发上下文切换 3、怎么查看上下文切换 4、怎么减少上下文切换,对实际的应用场景的理解 记得在两年前,翻开《Java并发编程的艺术》开篇就讲的上下文切换可能使多线程比串行...
  • 通过上一讲的讲解,相信你对上下文切换已经有了一定的了解了。如果是单个线程,在 CPU 调用之后,那么它基本上是不会被调度出去的。如果可运行的线程数远大于 CPU 数量,那...
  • 当一个计算机是多道程序设计系统时,会频繁的有很多进程或者线程来同时竞争 CPU 时间片。当两个或两个以上的进程/线程处于就绪状态时,就会发生这种情况。如果只有一个 CPU 可用,那么必须选择接下来哪个进程/线程...
  • 虽然并不是真正意义的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。 再后来发展到多线程技术,使得在一个程序...
  • 线程上下文切换

    千次阅读 2017-12-30 22:05:40
    本人写博客是为了加深对知识内容的理解,文中的大部分...这么问也就说明答案是否定的,而这道题的精髓就在于你能不能说出上下文切换这几个字。那什么是上下文切换呢? 上下文切换 定义1:即使是单核的cpu也能够执行
  • ##上下文切换 JAVA虚拟机的多线程是通过线程轮流切换并分配CPU时间片的方式实现的. CPU通过给每个线程分配CPU时间片来让线程执行代码,时间片是CPU分配给线程执行的时间,CPU通过不停的切换线程,并给线程时间片让它...
  • 2.当CPU结束运行一个线程,转去执行另外一个线程,这个过程就叫做线程上下文切换 上下文 1.在发生切换的时候,当前线程的任务可能并没有执行完毕。所以在切换时需要保存线程切换前的运行状态,以便下一次,可以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 55,671
精华内容 22,268
关键字:

线程上下文切换开销