问题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. linux(centos8):安装java jdk 15 (java 15)

    一,下载jdk15 官方网站: https://www.oracle.com/java/ 下载页面: https://www.oracle.com/cn/java/technologies/javas ...

  2. tamcat7.0(安装文件下载)

    安装包:http://files.cnblogs.com/files/chenghu/apache-tomcat-7.0.27.rar http://files.cnblogs.com/files/c ...

  3. buuctf-misc-[BJDCTF 2nd]圣火昭昭-y1ng 1

    开局一张图片,flag全靠猜,那这个是不是和outguess工具有关呢?于是我们显示查看了图片的详细信息 看到是新佛曰,于是我们用新佛曰论禅解密:http://hi.pcmoe.net/buddha. ...

  4. 【API管理 APIM】APIM集成内部VNet后,自我访问出现(Unable to connect to the remote server)问题,而Remote Server正是APIM它自己

    问题描述 在使用APIM配置内部VNET后,如API-1正常配置访问后端服务器的一个接口,而API-2则是通过调用APIM中的API-1来作为backendUrl,会出现500错误. 经过测试,目前这 ...

  5. c# 误区系列(二)

    前言 继续整理误区系列,可能会对刚入门的新手有些帮助,然后希望有错误的地方可以指出. 正文 关于泛型方法的确定 class Person<T> { public void add(T a) ...

  6. kubernetes教程第一章-kubeadm高可用安装k8s集群

    目录 Kubeadm高可用安装k8s集群 kubeadm高可用安装1.18基本说明 k8s高可用架构解析 kubeadm基本环境配置 kubeadm基本组件安装 kubeadm集群初始化 高可用Mas ...

  7. VirtualBox 安装Ubuntu(16.04/18.04)时显示不全的解决方法

    是是系统分辨率不同导致的问题 Alt+鼠标左键 (16.04版本亲测有效,18.04版本亲测无效)或者Win+鼠标左键 (18.04版本亲测有效)拖动安装界面,即可显示内容.

  8. oVirt4.4虚拟机备份方法

    红帽oVirt于今年推出了oVirt 4.4,该版本在系统.存储.网络.用户界面等方面做出增强功能与优化更新,为oVirt用户提供功能更强大.更灵活的IT基础架构.云祺科技也于最近发布了全新版本云祺容 ...

  9. 【垃圾回收-CMS】Java内存回收实践经验 防止内存报警

    jdk6和7服务器端(-server) 默认的新生代的垃圾回收器为:PS Scavenge,老年代默认的垃圾回收器为:PS MarkSweep 目前项目使用了jdk7,tomcat7,经常出现内存堆使 ...

  10. FFmpeg 将大量图片合成为视频 video

    1.基本格式终端输入: ffmpeg -f image2 -i /home/ttwang/images/image%d.jpg tt.mp4其中/home/ttwang/images/images%d ...