问题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 ...

  10. 【Linux内核】CPU和线程

    首先明确一个概念,Linux系统中甚至没有真正的线程.不过,可以认为Linux是系统的线程是内核线程,所有调度是基于线程的. 1.线程分类 一个进程由于其运行空间的不同, 从而有内核线程和用户进程的区 ...

随机推荐

  1. SAM4E单片机之旅——18、通过AFEC(ADC)获取输入的电压

    很多时候,一个电压不仅仅需要定性(高电平或者低电平),而且要定量(了解具体电压的数值).这个时候就可以用到模数转换器(ADC)了.这次的内容是测量开发板搭载的滑动变阻器(VR1)的电压,然后把ADC转 ...

  2. Linux定时任务Crontab详解_定时备份

    文章来源:http://blog.chinaunix.net/uid-7552018-id-182133.html 今天做了个数据库的备份脚本,顺便系统得学习一下Linux下定时执行脚本的设置.Lin ...

  3. samba linux windows 请联系管理员

    在使用Samba进行建立Window与Linux共享时,要是不能访问,出现“您可能没有权限使用网络资源”, 那就是SELinux在作怪了 要是想让共享目录能访问,可以使用命令 #setenforce ...

  4. JavaScript break和continue 跳出循环

    在JavaScript中,使用 break 和 continue 语句跳出循环: break语句的作用是立即跳出循环,即不再执行后面的所有循环: continue语句的作用是停止正在执行的循环,直接进 ...

  5. 关于 Log4Net

    Log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件.数据库.EventLog等),日志就是程序的黑匣子,可以通过日志查看系统的运行过程,从而发现系统的问题.日志的作用:将运 ...

  6. mongodb的tailCursor的设计思想

    http://derickrethans.nl/mongodb-and-solr.html 这是mongodb的php客户端的写法

  7. 团队作业8——第二次项目冲刺(Beta阶段)--5.25 5th day

    团队作业8--第二次项目冲刺(Beta阶段)--5.25 fifth day Day five: 会议照片 项目进展 Beta冲刺的第四天,以下是今天具体任务安排: 队员 昨天已完成的任务 今日计划完 ...

  8. 验证性控件的使用--验证两个文本框至少有一个不为空CustomValidator

    转:http://blog.163.com/zhaowencong_2010/blog/static/20402815220122103155643/ 有时候我们在注册一个帐号时要求我们留下电话号码, ...

  9. [转]Docker到底是什么?为什么它这么火?

    如果你是数据中心或云计算IT圈子的人,这一年多来应该一直在听到普通的容器.尤其是Docker,关于它们的新闻从未间断过.Docker1.0在今年6月发布后,声势更是达到了前所未有的程度. 动静之所以这 ...

  10. 前后端交互之封装Ajax+SpringMVC源码分析

    为什么需要封装呢?因为用的多,我想将其封装成函数,当我想用它时,只需将那个函数对应的js文件引入即可,而不要重复写很多相同代码,利于开发效率的提高. 无论是$.ajax或$.post.$.get等,在 ...