问题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. 置Hugo的代码高亮

    +++ date="2020-10-17" title="设置Hugo的代码高亮" tags=["hugo"] categories=[&q ...

  2. spring boot:用rocketmq消息订阅实现删除购物车商品功能(spring boot 2.3.3)

    一,为什么要使用消息队列实现删除购物车商品功能? 消息队列主要用来处理不需要立刻返回结果的业务, 常见的例子: 用户在下单后,要清除原购物车中的商品, 这个处理过程不需要马上实现也不需要返回结果给用户 ...

  3. Logstash 国内加速下载 转

    Logstash. 国内直接从官网(https://www.elastic.co)下载比较困难,需要一些技术手段.这里提供一个国内的镜像下载地址列表,方便网友下载. 找不到想要的版本?您可以访问 索引 ...

  4. web功能测试

    web功能测试基础: https://www.cnblogs.com/wz123/p/9680484.html

  5. PHP程序员必须会的 45 个PHP 面试题

    Q1: == 和 === 之间有什么区别? 话题: PHP困难: 如果是两个不同的类型,运算符 == 则在两个不同的类型之间进行强制转换 === 操作符执行'类型安全比较' 这意味着只有当两个操作数具 ...

  6. 手把手教你如何制作和使用lib和dll

    本文的内容经过本人亲自调试,确保可用,实用,测试环境为win10+vs2015+C++ 目录 静态库 什么是静态库? 怎么创建 如何使用 静态库的第一种使用方法 静态库的第二种使用方法 动态链接库 动 ...

  7. Windows搭建Hexo系统

    date: 2018-11-16 17:10:51 updated: 2018-11-16 20:04:43 1.安装Git 下载Windows下的Git客户端并安装,安装很简单,基本一路Next下去 ...

  8. MacOs/Liunx主机搭建windows平台双机调试环境

    0x00 前言 本文的主要试用对象是Mac OS/Linux用户,对于想调试windows内核相关的一些东西时,需要搭建双机调试环境的一些记录.另外对于本机是windows的用户也完全试用,windo ...

  9. java并发编程与多线程基础学习一

    学习url:https://www.cnblogs.com/lixinjie/p/10817860.html https://www.cnblogs.com/JJJ1990/p/10496850.ht ...

  10. Swagger配置与使用

    问题:前后端分离时代的到来 前端需要测试后端数据 后端提供接口,实时更新接口的改动 一.Swagger简介 号称世界上最流行的api框架 Restful api文档在线自动生成工具-->api文 ...