首页 > 其他分享 >多线程频繁上下文切换

多线程频繁上下文切换

时间:2023-02-20 18:32:36浏览次数:30  
标签:上下文 线程 切换 时间 多线程 cpu

什么是上下文切换

在单核cpu中,多线程的执行是通过cpu的时间片分配,每个线程会分配到一个时间片,循环执行这些线程,线程时间片消耗完了就会进入等待状态,直到分配到新的时间片,因为时间片的时间非常短,所以cpu不停的切换线程执行,给我们造成了多线程同时运行的错觉。

cpu通过时间片循环执行线程任务,当线程的cpu时间片用完后会保存当前任务状态,方便下次获取到cpu时间片的时候能继续执行,当下次分配时间片后执行到该线程时,会重新加载该线程的任务状态,而这个从保存任务状态到重新加载的过程就叫上下文换。

上下文切换会带来什么影响

每次上下文切换也都要消耗cpu资源的,就好比看英文书一样,你边英文看边去看翻译,在你看翻译之前你必须要记住当前英文书看到了第几页,这样的切换是会影响读书的效率,同样上下文切换也会影响多线程的执行速度。

当前线程在时间片使用完前执行完毕,cpu进行线程切换,不会造成cpu资源浪费。

减少上下文切换

1.无锁并发编程:因为每次锁的竞争都会引起上下文切换
2.CAS算法:CAS算法是一种替代锁的方式,不需要加锁也能达到原子性(我更愿意说数据的一致性)
3.协程:一种比线程还要小的执行单位,能在单线程中进行多任务切换。

标签:上下文,线程,切换,时间,多线程,cpu
From: https://blog.51cto.com/u_15973676/6069215

相关文章

  • SVN 之切换账号
     简单来说两步就搞定了 第一步删除已缓存的数据 第二步输入要切换账号密码 具体步骤图解如下:第一步:点击TortoiseSVN找到设置   点击已保存数据点击清除......
  • 滑动silder切换图片,向上弹出设置层
     ////HelloWorldViewController.h//图片浏览////Createdbymahongminon14-5-15.//Copyright(c)2014年mahongmin.Allrightsreserved.//#import<UIKit/U......
  • Java多线程分块下载器
    '''javaimportjava.io.*;importjava.net.HttpURLConnection;importjava.net.URL;importjava.nio.file.Files;importjava.nio.file.Path;importjava.nio.file.S......
  • 安装n 以及使用n 切换node版本
    使用n安装并且切换node版本全局安装n使用n安装某个node版本n切换node版本全局安装nnpminstall-gn1使用n安装某个node版本安装最新稳定版node:nstable安装最新版本nod......
  • Linux-485收发切换延迟的解决方法 ——转载
     【前言】本文引用各种资料甚多,而引用出处标明并不详细,若有侵权,请联系删除。转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10381616.html一、问题描述R......
  • 简单多线程卖票代码
     publicclassThread2{publicstaticvoidmain(String[]args){ShareDatad=newShareData();//两个窗口卖票newThread(d).start();newThread(d).st......
  • .NET Core中批量注册上下文
    1.定义一个静态类HostBuilderExtend作为扩展1publicstaticclassHostBuilderExtend2{3publicstaticvoidRegister(thisWebApplicationBuilder......
  • 进程状态的切换
      当创建一个子进程后,该进程会进入就绪状态,再根据系统的调度,获得时间片,就进入运行状态,在运行状态的进程调用return等进程就结束了;如果在运行状态的进程调用read、write......
  • Exchanger多线程交换数据
    Exchanger用于两个线程之间(也可以多个线程)交换数据,交换器将自动匹配两个线程,将其数据互相传递.publicclassTest{publicstaticvoidmain(String[]args){......
  • 多线程计数 AtomicInteger
    大家在工作中肯定遇到过计数统计需求,单线程的情况下count直接定义int型就行,可是在多线程并发下会产生多个线程同时count++的情况,那么这种情况就需要用到AtomicInteger来保......