




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
如果好看,请给个赞
•你有一个思想,我有一个思想,我们交换后,一个人就有两
个思想
•IfyoucanNOTexplainitsimply,youdoNOTunderstandit
wellenough
为什么要使用多线程?
CPU密集型程序
$并发编程适用于什么场景?
<I/O密集型程序
创建多少个线程合适?
面试会怎样问线程个数?
为什么要使用多线程?
防止并发编程出错最好的办法就是不写并发程序
1sb
看着我的刀,允许你
重新组织一下语言
既然多线程编程容易出错,为什么它还经久不衰呢?
A:那还用说,肯定在某些方面有特长呗,比如你知道的【它很快,非常快】
我也很赞同这个答案,但说的不够具体
并发编程适用于什么场景?
如果问你选择多线程的原因就是一个【快】字,面试也就不会出那么多幺蛾子了。
你有没有问过你自己
1.并发编程在所有场景下都是快的吗?
2.知道它很快,何为快?怎样度量?
想知道这两个问题的答案,我们需要一个从【定性】到【定量】的分析过程
使用多线程就是在正确的场景下通过设置正确个数的线程来最大
化程序的运行速度(我感觉你还是啥也没说)
将这句话翻译到硬件级别就是要充分的利用CPU和I/O的利用率
y场景+y级程个敕c▼运行速度
两个正确得到保证,也就能达到最大化利用CPU和I/O的目的了。最关键是,
如何做到两个【正确】?
在聊具体场景的时候,我们必须要拿出我们的专业性来。送你两个名词buff加
成
・CPU密集型程序
・I/O密集型程序
CPU密集型程序
一个完整请求,I/O操作可以在很短时间内完成,CPU还有很多
运算要处理,也就是说CPU计算的比例占很大一部分
假如我们要计算1+2+....100亿的总和,很明显,这就是一个CPU密集型程
序
在【单核】CPU下,如果我们创建4个线程来分段计算,即:
1.线程1计算[工,2$亿)
2以此类推
3.线程4计算[75-亿,工8亿]
我们来看下图他们会发生什么?
时间
由于是单核CPU,所有线程都在等待CPU时间片。按照理想情况来看,四个
线程执行的时间总和与一个线程5独自完成是相等的,实际上我们还忽略了四个
线程上下文切换的开销
所以,单核CPU处理CPU密集型程序,这种情况并不太适合使用多线程
此时如果在4核CPU下,同样创建四个线程来分段计算,看看会发生什么?
a
►时间
每个线程都有CPU来运行,并不会发生等待CPU时间片的情况,也没有线程
切换的开销。理论情况来看效率提升了4倍
所以,如果是多核CPU处理CPU密集型程序,我们完全可以最大化的利用
CPU核心数,应用并发编程来提高效率
I/O密集型程序
与CPU密集型程序相对,一个完整请求,CPU运算操作完成之后
还有很多I/O操作要做,也就是说I/O操作占比很大部分
我们都知道在进行I/O操作时,CPU是空闲状态,所以我们要最大化的利用
CPU,不能让其是空闲状态
同样在单核CPU的情况下:
单技CPU,I/O噌泉型
从上图中可以看出,每个线程都执行了相同长度的CPU耗时和I/O耗时,如
果你将上面的图多画几个周期,CPU操作耗时固定,将I/O操作耗时变为CPU
耗时的3倍,你会发现,CPU又有空闲了,这时你就可以新建线程4,来继续
最大化的利用CPUo
综上两种情况我们可以做出这样的总结:
线程等待时间所占比例越高,需要越多线程;线程CPU时间所占
比例越高,需要越少线程。
到这里,相信你已经知道第一个【正确】使用多线程的场景了,那创建多少个线
程是正确的呢?
创建多少个线程合适?
面试如果问到这个问题,这可是对你理论和实践的统考。想完全答对,你必须要
【精通/精通/精通】小学算术
从上面知道,我们有CPU密集型和I/O密集型两个场景,不同的场景当然需
要的线程数也就不一样了
CPU密集型程序创建多少个线程合适?
有些同学早己经发现,对于CPU密集型来说,理论上线程数量=CPU核数(逻辑)就
可以了,但是实际上,数量一般会设置为CPU核数(逻辑)+工,为什么呢?
《Java并发编程实战》这么说:
计算密(CPU)集型的线程恰好在某时因为发生一个页错误或者因
其他原因而暂停,刚好有一个"额外"的线程,可以确保在这种情况
下CPU周期不会中断工作。
所以对于CPU密集型程序,CPU核数(逻辑)+1个线程数是比较好的经验值的原
因了
I/O密集型程序创建多少个线程合适?
上面已经让大家按照图多画几个周期(你可以动手将I/O耗时与CPU耗时比例
调大,比如6倍或7倍),这样你就会得到一个结论,对于I/O密集型程序:
最佳线程数=(1/CPU利用率)=2+(I/O耗时/CPU耗时)
我这么体贴,当然担心有些同学不理解这个公式,我们将上图的比例手动带入到
上面的公式中:
三评级期末敝学考试题10。分
三年二经氤彳
设:
CPU耗时=1;
I/。耗时=2;
最隹绒程数:=1/(1/(1+2))=1+(2/1)=3(个)
这是一个CPU核心的最佳线程数,如果多个核心,那么I/O密集型程序的最佳
线程数就是:
最佳线程数=CPU核心数(2/CPU利用率)=CPU核心数1+(V。耗时/CPU
耗时)
说到这,有些同学可能有疑问了,要计算I/O密集型程序,是要知道CPU利
用率的,如果我不知道这些,那要怎样给出一个初始值呢?
按照上面公式,假如几乎全是I/O耗时,所以纯理论你就可以说是2N(N=CPU
核数),当然也有说2N+1的,(我猜这个1也是backup),没有找到具
体的推倒过程,在【并发编程实战-8.2章节】截图在此,大家有兴趣的可以自己
看看
Giventhesedefinitions:
NC[fu=numberofCPUs
Ucpu=targetCPUutilization,0<UCftlt<1
W
—=ratioofwaittimetocomputetime
Theoptimalpoolsizeforkeepingtheprocessorsatthedesiredutilizationis:
Nthreads=M?”*UCptl*(1+1)
YoucandeterminethenumberofCPUsusingRuntime:
理论上来说,理论上来说,理论上来说,这样就能达到CPU100%的利用率
如果理论都好用,那就用不着实践了,也就更不会有调优的事出现了。不过在初
始阶段,我们确实可以按照这个理论之作为伪标准,毕竟差也可能不会差太多,
这样调优也会更好一些
谈完理论,咱们说点实际的,公式我看懂了(定性阶段结束),但是我有两个疑
问:
1.我怎么知道具体的I/O耗时和CPU耗时呢?
2.怎么查看CPU利用率?
没错,我们需要定量分析了
幸运的是,我们并不是第一个吃螃蟹的仔儿,其实有很多APM(Application
PerformanceManager)工具可以帮我们得到准确的数据,学会使用这类工具,
也就可以结合理论,在调优的过程得到更优的线程个数了。我这里简单列举几个,
具体使用哪一个,具体应用还需要你自己去调研选择,受篇幅限制,暂不展开讨
论了
1.SkyWalking
2.CAT
3.zipkin
上面了解了基本的理论知识,那面试有可能问什么?又可能会以怎样的方式提问
呢?
面试小问
小问一
假设要求一个系统的TPS(TransactionPerSecond或者Task
PerSecond)至少为20,然后假设每个Transaction由一个线程完
成,继续假设平均每个线程处理一个Transaction的时间为4s
如何设计线程个数,使得可以在1s内处理完20个Transaction?
四耳级期末数学考试题iooG
四etW二共
答:
因为:1个线程1个TranjcahoHB寸间为彳
那每秒一个统程R能处理:1/4=0.25个TPS
所灰:1秒内萼处理20个T”,理论线程敬=20/0.25=80(个)
但是,但是,这是因为没有考虑到CPU数目。家里又没矿,一般服务器的CPU
核数为16或者32,如果有80个线程,那么肯定会带来太多不必要的线程上下
文切换开销(希望这句话你可以主动说出来),这就需要调优了,来做到最佳
balance
小问二
计算操作需要5ms,DB操作需要100ms,对于一台8个CPU的
服务器,怎么设置线程数呢?
如果不知道请拿三年级期末考试题重新做(今天晚自习留下来),答案是:
线程数=8*(1+100/5)=168(个)
那如果DB的QPS(QueryPerSecond)上限是1000,此时这个
线程数又该设置为多大呢?
五母级期末敝学考试题10。分
五年)丁嬴二央
因为:h=1000。,当前一个任务需等5+100=105M
那么一个线程每秒可乂处理的任务敬是1000/(105)
一么168个线程每秒可处理任务书就是168*1000/105=1(,00QPS
又因为QK上限是100。,所M级程数就季等9例减,夕为7(,8*1000/1(,00=105
同样,这是没有考虑CPU数目,接下来就又是细节调优的阶段了
因为一次请求不仅仅包括CPU和I/O操作,具体的调优过程还要考虑内存资
源,网络等具体内容
增加CPU核数一定能解决问题吗?
看到这,有些同学可能会认为,即便我算出了理论线程数,但实际CPU核数不
够,会带来线程上下文切换的开销,所以下一步就需要增加CPU核数,那我们
盲目的增加CPU核数就一定能解决问题吗?
在讲互斥锁的内容是,我故意遗留了一个知识:
阿姆达尔(AM川)思律:
它代表3处理器笄行运算后妓多提升的能力
CPU核数
程序并行百分比
程序率行百分比
怎么理解这个公式呢?
假设:
1-p=5%
s趋向于正无穷大
那么:
5的极限就是20
这个结论告诉我们,假如我们的串行率是5%,那么我们无论采用什么技术,最
高也就只能提高20倍的性能。
如何简单粗暴的理解串行百分比(其实都可以通过工具得出这个结果的)呢
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论