问题1:

假如有一个计算任务,计算1-100的和,每10个数相加,需要占用一个cpu时间片(1s)。如果起一个线程(模拟没有线程切换),完成任务需要多长时间?如果起5个线程,完成任务需要消耗多久时间?如果起20个线程,完成任务需要多长时间?如果起20个线程呢?20个线程呢?50个线程呢?
假设1:cpu是单核cpu

假设2:每个线程的优先级一样。
假设3:cpu在两个线程之间切换的时间消耗是0.1s。
 
答:
1.如果起1个线程(模拟没有线程切换)就要消耗10s的cpu时间能完成任务。
2.如果起5个线程,每个线程处理20个数相加,所以要占用2个cpu时间片,即10s,cpu要切换9次,即0.9s,总耗时10s+0.9s=10.9s;
3.如果起10个线程,每个线程处理10个数相加,要消耗1个cpu时间,即10s,cpu要切换9次,即0.9s,总耗时10s+0.9s=10.9s。
4.如果起20个线程,每个线程处理5个数相加,占用0.5个时间片,即消耗10s,cpu要切换19次,即1.9s,总耗时10s+1.9s=11.9s。
5.如果起50个线程,每个线程处理2个数相加,占用0.2个时间片,即消耗10s,cpu要切换50次,即5s,总耗时10s+5s=15s。
 
总结:1个线程最快,起5个线程和10个线程的耗时是一样的,20个线程会更慢,所以线程数不是越多越好。
 
问题2:
 
假如有一个计算任务,计算1-100的和,每10个数相加,需要占用一个cpu时间片(1s),同时要在本地文件(模拟io阻塞)记一次数,会阻塞2s。如果起1个线程,完成任务需要耗时多少?如果起5个线程,完成任务需要消耗多久时间?如果起10个线程,完成任务需要多长时间?如果起20个线程呢?50个线程呢?
假设1:cpu是单核cpu

假设2:每个线程的优先级一样。
假设3:cpu在两个线程之间切换的时间消耗是0.1s。
 
答:
1.如果起1个线程(模拟没有线程切换)处理数字相加需要消耗10s,写文件(阻塞)要消耗20s,总共需要消耗10s+20s=30s。
2.如果起5个线程,每个线程处理20个数相加,每个线程处理数字相加要2s,阻塞要4s。第一轮cpu时间片轮转导致线程切换,每个线程都计算完各自的10个数字,五个线程计算数字要5s,并且cpu切换了4次,切换要用0.4s,所以第一轮耗时5s+0.4s+=5.4s;然后开始第二轮,因为第二轮每个线程都是处理写文件的事情,那是dma的事情,线程会阻塞出让cpu,所以cpu直接切换,连续切换四次,加上第一轮到第二轮的切换,一共5次切换,切换占用0.5s,所以第二轮cpu都是耗在线程切换上,第二轮耗时0.5s。然后开始第三轮,这时候第一个线程还要阻塞1.5s(2-0.5=1.5)才能开始执行三轮,所以这1.5s范围内,cpu是空闲的。过了1.5秒之后,开始第三轮和第四轮,分别和前面的第一轮和第二轮一样,分别是,第三轮耗时5.4s,第四轮耗时0.5s。但是第四轮第5个线程切换之后,还要等待2s,第五个线程才完成文件io。所以起五个线程,cpu要切换四轮,总消耗5.4s(第一轮)+0.5s(第二轮)+1.5s(等待io)+5.4s(第三轮)+0.5s(第四轮)+2s(io等待)=15.3s。
3.如果起10个线程,每个线程处理10个数相加,要消耗1个cpu时间,即10s,cpu要切换9次,即0.9s,第一轮耗时10s+9s=10.9s;第二轮因为是io阻塞,直接切换,要切换10次,切换耗时1s,然后继续等待第五个线程的io完成,等待1s(io要2s,切换线程过了1s,2-1=1)即可;所以总耗时是10.9s+1s+1s=12.9s。
4.如果起20个线程,每个线程处理5个数相加,第一轮切换29次线程,切换占用2.9s,计算数字需要10s,每切换两个线程,就io阻塞一次,ios阻塞10次,最后一次切换线程之后,还要等待最后一个线程的io,要等待2s。所以一共耗时2.9s+10s+2s=14.9s。
5.如果起50个线程,每个线程处理2个数相加,第一轮切换49次线程,切换占用4.9s,每切换5次线程,就io阻塞一次,计算数字要10s,,最后一次切换线程之后,还要等待最后一个线程的io,要等待2s。所以总耗时是:4.9s+10s+2s=16.9s。
 
总结:1个线程最快,起5个线程和10个线程的耗时是一样的,20个线程会更慢,所以线程数不是越多越好。
 
以下附上两个自己画的图,便于理解:
 

                    欢迎关注微信公众号“ismallboy”,请扫码并关注以下公众号,并在公众号下面回复“FGC”,获得本文最新内容。

 

 

为什么说线程太多,cpu切换线程会浪费很多时间?的更多相关文章

  1. cpu切换线程上下文会耗费多少时间

    cpu切换线程上下文会耗费多少时间,有人在linux下面使用不同的cpu测试过,需要1000ns以上的时间 https://blog.tsunanet.net/2010/11/how-long-doe ...

  2. 绑定线程到特定CPU处理器

    参考这篇文章 http://blog.chinaunix.net/uid-27761170-id-5050258.html 代码如下: #define _GNU_SOURCE #include < ...

  3. 图解并发与并行-分别从CPU和线程的角度理解

    本文作为图解java并发编程的第三篇,前2篇访问地址如下所示: 图解进程线程.互斥锁与信号量-看完还不懂你来打我 8成以上的java线程状态图都画错了--图解java并发第二篇 一.CPU角度的并发与 ...

  4. Linux进程或线程绑定到CPU

    Linux进程或线程绑定到CPU 为了让程序拥有更好的性能,有时候需要将进程或线程绑定到特定的CPU,这样可以减少调度的开销和保护关键进程或线程. 进程绑定到CPU Linux提供一个接口,可以将进程 ...

  5. Java多线程系列1 线程创建以及状态切换

    我们知道线程线程有三种创建方式 1实现Runnable接口 2 继承Thread类 3使用Callable和Future接口创建线程.具体是创建Callable接口的实现类,并实现clall()方法. ...

  6. windbg 边学边记attach 进程和open dump的两个方式查看线程的占用cpu资源

    首先我是attach到进程的方式,附加到进程把. vs里边有个远程调试就是通过连接到远程机附加到进程操作的.在 有公网IP情况下挺好用,但涉及到nat穿越之类的,因为用户的不方便设置,这种调试方式也有 ...

  7. CPU和线程的关系

    比如,电脑开了两个程序qq和qq音乐,假设这两个程序都只有一个线程.人能够感觉到CPU切换的频率是一秒一次,假设当前cpu计算速度是1秒1次,那么我们就能明显感到卡顿,当聊天,点击发送按钮时候,qq音 ...

  8. 线程池线程数与(CPU密集型任务和I/O密集型任务)的关系

    近期看了一些JVM和并发编程的专栏,结合自身理解,来做一个关于(线程池线程数与(CPU密集型任务和I/O密集型任务)的关系)的总结: 1.任务类型举例: 1.1: CPU密集型: 例如,一般我们系统的 ...

  9. 关于CPU核心,线程,进程,并发,并行,及java线程之间的关系

    前言:作为一个转行java的小白,一直搞不清楚java中的多线程.于是来梳理一下关于CPU核心,线程,进程,并发,并行,及java线程之间的关系, 1.CPU角度来看: 我们以Intel的Core i ...

随机推荐

  1. spring boot:用swagger3生成接口文档,支持全局通用参数(swagger 3.0.0 / spring boot 2.3.2)

    一,什么是swagger? 1,  Swagger 是一个规范和完整的文档框架, 用于生成.描述.调用和可视化 RESTful 风格的 Web 服务文档 官方网站: https://swagger.i ...

  2. Centos7 安装python环境

    保留python2 找到python所在位置,把python指向python2.7备份 [root@sun /usr/bin]# cd ~ [root@sun ~]# whereis python p ...

  3. Linux文件系统和管理-2文件操作命令(上)

    文件操作命令 文件 文件也包括目录 目录是一种特殊的文件 目录 一个目录名分成两部分 所在目录 dirname 父目录的路径 文件名 basename 本身就是两个命令 [root@C8-1 misc ...

  4. MVC登录

    前言 最近没什么好写的,准备把MVC的登录再写一下,巩固一下 HTML @{ Layout = null; } <!DOCTYPE html> <html> <head& ...

  5. 10 张图打开 CPU 缓存一致性的大门

    前言 直接上,不多 BB 了. 正文 CPU Cache 的数据写入 随着时间的推移,CPU 和内存的访问性能相差越来越大,于是就在 CPU 内部嵌入了 CPU Cache(高速缓存),CPU Cac ...

  6. 关于GIT配置公私钥

    问题:pull代码时显示 原因:公钥与私钥对不上,或者没有配置导致 解决: 1.生成私钥:TortoiseGIT → PuttyGen → Generate(点击后鼠标晃动会加速)→Save Priv ...

  7. FastCGI协议分析

    不知道什么时候,就开始有了让HomeServer支持PHP的念头.于是分析起了FastCGI协议.FastCGI用于WebServer与WebApplication之间的通讯,例如Apache与PHP ...

  8. Java学习的第二十一天

    1.综合实例 error异常:error指的是错误,通常是程序员不可能通过代码来解决的问题,底层环境或硬件问题,也就是说在程序中用户不用捕获error及任何error子类的异常. exception指 ...

  9. 2.5远程仓的库使用-2.7Git别名

    2.5 远程仓库的使用 查看远程仓库 git remote # -v 选项会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL 添加远程仓库 git remote add <sho ...

  10. SVG--D3--血缘关系树

    最近的工作与可视化有关,有展示血缘关系树的需求 ,类似于这样: 碰巧搜到 D3(用于可视化的js库,作者吕之华),瞬间无法自拔,它的树状图功能基于SVG.js ,暴露的可操作入口也简洁恰当,能帮助你快 ...