问题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. appium_android-常见的问题

    po模型的原则: 用公共方法代表UI所提供的功能 方法应该返回其他的PageObject或者返回用于断言的数据 同样的行为不同的结果可以建模为不同的方法 不要在方法内加断言 字段意义 不要暴露页面内部 ...

  2. 第十九章 DHCP原理介绍

    一.为什么使用DHCP 1.手动为局域网中大量主机配置IP地址.掩码.网关等参数的工作繁琐,容易出错 2.DHCP可以自动为局域网中主机完成TCP/IP协议配置 3.DHCP自动配置避免了IP地址冲突 ...

  3. 第三章 TCP/IP 模型

    一.产生背景 1.伴随着计算机网络的飞跃发展,各大厂商根据自己的协议生产出了不同的硬件和软件 2.为了实现网络设备间的互相通讯,ISO和IEEE相继提出了OSI参考模型及其TCP/IP模型 二.TCP ...

  4. 【转】Python3 如何优雅地使用正则表达式(完整版)

    转载自鱼c论坛 :  https://fishc.com.cn/thread-57073-1-1.html 注:本文翻译自 Regular Expression HOWTO,小甲鱼童鞋对此做了一些注释 ...

  5. oracle强制修改字符集

    首先查看服务端字符集 select * from v$nls_parameters where parameter = 'NLS_CHARACTERSET' NLS_CHARACTERSET WE8M ...

  6. PowerShell查看历史记录

    PowerShell的所有历史记录:   Get-Content (Get-PSReadLineOption).HistorySavePath   顺手写了一个掉用的函数:  function Get ...

  7. Linux系统Yum仓库制作

    在使用Linux系统的时候,通常需要安装许多软件,Linux系统通常安装软件有源码包安装(文件格式:.tar.gz 或.tar.bz2:安装过程:解压.环境检查.编译和安装).Rpm包安装(文件格式: ...

  8. 程序员小抄——GitHub 热点速览 Vol.44

    作者:HelloGitHub-小鱼干 这周热点是什么?youtube-dl!就是那个超过 72+ star,又因为版权问题被 GitHub 关闭的项目,GitHub Trending 上一篇" ...

  9. scrapy反反爬虫

    反反爬虫相关机制 Some websites implement certain measures to prevent bots from crawling them, with varying d ...

  10. python测试报告输出 htmltestrunner 及 中文乱码的解决方式

    下载HTMLTestRunner.py 第三方库 下载地址: python2:http://tungwaiyip.info/software/HTMLTestRunner.html 右键另存为下载HT ...