《常用正则表达式速查手册.pdf》由会员分享,可在线阅读,更多相关《常用正则表达式速查手册.pdf(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、如果好看,请给个赞你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply,you do NOT understand itwell enough为什么要使用多线程?并发编程适用于什么场景?$IC/OP密U密集集型型程程序序创建多少个线程合适?面试会怎样问线程个数?为什么要使用多线程?防止并发编程出错最好的办法就是不写并发程序1sb看着我的刀,允许你重新组织一下语言既然多线程编程容易出错,为什么它还经久不衰呢?A:那还用说,肯定在某些方面有特长呗,比如你知道的【它很快,非常快】我也很赞同这个答案,但说的不够具体并发编程适用于什
2、么场景?如果问你选择多线程的原因就是一个【快】字,面试也就不会出那么多幺蛾子了。你有没有问过你自己1.并发编程在所有场景下都是快的吗?2.知道它很快,何为快?怎样度量?想知道这两个问题的答案,我们需要一个从【定性】到【定量】的分析过程使用多线程就是在正确的场景下通过设置正确个数的线程来最大化程序的运行速度(我感觉你还是啥也没说)将这句话翻译到硬件级别就是要充分的利用C P U和I/O的利用率y场景+y 级程个敕 c 运 行速度两个正确得到保证,也就能达到最大化利用C P U和I/O的目的了。最关键是,如何做到两个【正确】?在聊具体场景的时候,我们必须要拿出我们的专业性来。送你两个名词b u f
3、f加成C P U密集型程序 I/O密集型程序C P U密集型程序一个完整请求,I/O操作可以在很短时间内完成,CPU还有很多运算要处理,也就是说C P U计算的比例占很大一部分假如我们要计算1+2+.100亿的总和,很明显,这就是一个C P U密集型程序在【单核】CPU下,如果我们创建4个线程来分段计算,即:1.线程1计算 工,2$亿)2 以此类推3.线程4计算 75-亿,工8亿 我们来看下图他们会发生什么?时间由于是单核C PU,所有线程都在等待C PU时间片。按照理想情况来看,四个线程执行的时间总和与一个线程5独自完成是相等的,实际上我们还忽略了四个线程上下文切换的开销所以,单 核 CPU
4、处 理 CPU密集型程序,这种情况并不太适合使用多线程此时如果在4核CPU下,同样创建四个线程来分段计算,看看会发生什么?a 时间每个线程都有C PU 来运行,并不会发生等待C PU 时间片的情况,也没有线程切换的开销。理论情况来看效率提升了 4 倍所以,如果是多核CPU处 理CPU密集型程序,我们完全可以最大化的利用CPU核心数,应用并发编程来提高效率I/O 密集型程序与 C PU 密集型程序相对,一个完整请求,CPU运算操作完成之后还有很多I/O 操作要做,也就是说I/O 操作占比很大部分我们都知道在进行I/O 操作时,CPU是空闲状态,所以我们要最大化的利用C PU,不能让其是空闲状态同
5、样在单核CPU的情况下:单技CPU,I/O噌泉型从上图中可以看出,每个线程都执行了相同长度的CPU耗 时 和 I/O 耗时,如果你将上面的图多画几个周期,CPU操作耗时固定,将 I/O 操作耗时变为CPU耗 时 的 3 倍,你会发现,CPU又有空闲了,这时你就可以新建线程4,来继续最大化的利用CPUo综上两种情况我们可以做出这样的总结:线程等待时间所占比例越高,需要越多线程;线 程CPU时间所占比例越高,需要越少线程。到这里,相信你已经知道第一个【正确】使用多线程的场景了,那创建多少个线程是正确的呢?创建多少个线程合适?面试如果问到这个问题,这可是对你理论和实践的统考。想完全答对,你必须要【精
6、通/精通/精通】小学算术从上面知道,我 们 有C P U密 集 型 和I/O密集型两个场景,不同的场景当然需要的线程数也就不一样了CPU密集型程序创建多少个线程合适?有些同学早己经发现,对 于C P U密集型来说,理论上线程数量=CPU核数(逻辑)就可以了,但是实际上,数量一般会设置为CPU核数(逻辑)+工,为什么呢?Java并发编程实战这么说:计 算 密(CPU)集型的线程恰好在某时因为发生一个页错误或者因其他原因而暂停,刚好有一个 额外 的线程,可以确保在这种情况下CPU周期不会中断工作。所以对于CPU密集型程序,C P U核数(逻辑)+1个线程数是比较好的经验值的原因了I/O 密集型程序
7、创建多少个线程合适?上面已经让大家按照图多画几个周期(你可以动手将I/O耗时与CPU耗时比例调大,比如6倍 或7倍),这样你就会得到一个结论,对 于I/O密集型程序:最 佳 线 程 数=(1/CPU利用率)=2+(I/O耗 时/CPU耗 时)我这么体贴,当然担心有些同学不理解这个公式,我们将上图的比例手动带入到上面的公式中:三评级期末敝学考试题 10。分三年二经氤彳设:C P U耗时=1;I/。耗时=2 ;最隹绒程数:=1/(1/(1+2)=1+(2/1)=3(个)这是一个CPU核心的最佳线程数,如果多个核心,那 么I/O密集型程序的最佳线程数就是:最佳线程数=CPU核心数(2/CPU利 用
8、率)=CPU核心数1+(V。耗 时/CPU耗 时)说到这,有些同学可能有疑问了,要计算I/O密集型程序,是要知道CPU利用率的,如果我不知道这些,那要怎样给出一个初始值呢?按照上面公式,假如几乎全是I/O耗时,所以纯理论你就可以说是2N(N=CPU核数),当然也有说2N+1的,(我猜这个1也 是backup),没有找到具体的推倒过程,在【并发编程实战-8.2章节】截图在此,大家有兴趣的可以自己看看Given these definitions:NCfu=number ofCPUsUcpu=target CPU utilization,0 UCftlt 1W=ratio of wait time
9、 to compute timeThe optimal pool size for keeping the processors at the desired utilization is:Nthreads=M?”*UCptl*(1+1)You can determine the number of CPUs using Runtime:理论上来说,理论上来说,理论上来说,这样就能达到CPU 100%的利用率如果理论都好用,那就用不着实践了,也就更不会有调优的事出现了。不过在初始阶段,我们确实可以按照这个理论之作为伪标准,毕竟差也可能不会差太多,这样调优也会更好一些谈完理论,咱们说点实际的,公
10、式我看懂了(定性阶段结束),但是我有两个疑问:1.我怎么知道具体的I/O耗时和CPU耗时呢?2.怎么查看CPU利用率?没错,我们需要定量分析了幸运的是,我们并不是第一个吃螃蟹的仔儿,其实有很多APM(ApplicationPerformance M anager)工具可以帮我们得到准确的数据,学会使用这类工具,也就可以结合理论,在调优的过程得到更优的线程个数了。我这里简单列举几个,具体使用哪一个,具体应用还需要你自己去调研选择,受篇幅限制,暂不展开讨论了1.SkyWalking2.CAT3.zipkin上面了解了基本的理论知识,那面试有可能问什么?又可能会以怎样的方式提问呢?面试小问小问一假设
11、要求一个系统的TPS(Transaction Per Second或 者 TaskPer Second)至少为2 0,然后假设每个Transaction由一个线程完成,继续假设平均每个线程处理一个Transaction的时间为4s如何设计线程个数,使得可以在1 s 内处理完2 0 个 Transaction?四耳级期末数学考试题iooG四 etW二 共答:因为:1 个线程1个TranjcahoH B寸间为彳那每秒一个统程R能处理:1/4=0.25个TPS所灰:1秒内萼处理20个T”,理论线程敬=20/0.25=80(个)但是,但是,这是因为没有考虑到CPU数目。家里又没矿,一般服务器的CPU核
12、数为16或者3 2,如果有80个线程,那么肯定会带来太多不必要的线程上下文切换开销(希望这句话你可以主动说出来),这就需要调优了,来做到最佳balance小问二计算操作需要5ms,DB操 作 需 要100m s,对 于 一 台8个CPU的服务器,怎么设置线程数呢?如果不知道请拿三年级期末考试题重新做(今天晚自习留下来),答案是:线 程 数=8*(1+100/5)=168(个)那如果D B的QPS(Query Per Second)上限是1000,此时这个线程数又该设置为多大呢?五母级期末敝学考试题1 0。分五年)丁嬴二央因为:h =1000。,当前一个任务需等5+100=105 M那么一个线程
13、每秒可乂处理的任务敬是1000/(105)一么1 6 8个线程每秒可处理任务书就是168*1000/105=1(,00 QPS又因为QK上限是100。,所M级程数就季等9例减,夕为7(,8*1000/1(,00=105同样,这是没有考虑C P U数目,接下来就又是细节调优的阶段了因为一次请求不仅仅包括C P U和I/O操作,具体的调优过程还要考虑内存资源,网络等具体内容增 加C PU核数一定能解决问题吗?看到这,有些同学可能会认为,即便我算出了理论线程数,但实际CPU核数不够,会带来线程上下文切换的开销,所以下一步就需要增加CPU核数,那我们盲 目 的 增 加CPU核数就一定能解决问题吗?在讲
14、互斥锁的内容是,我故意遗留了一个知识:阿姆达尔(A M川)思律:它代表3处理器笄行运算后妓多提升的能力CPU核数程序并行百分比程序率行百分比怎么理解这个公式呢?假设:1-p=5%s 趋向于正无穷大那么:5的极限就是20这个结论告诉我们,假如我们的串行率是5%,那么我们无论采用什么技术,最高也就只能提高2 0倍的性能。如何简单粗暴的理解串行百分比(其实都可以通过工具得出这个结果的)呢?来看 个 小Tips:Tips:临界区都是串行的,非临界区都是并行的,用单线程执行临界区的时间/用单线程执行(临界区+非临界区)的时间就是串行百分比现在你应该理解我在讲解synchronized关键字时所说的:最小
15、化临界区范围,因为临界区的大小往往就是瓶颈问题的所在,不要像乱用try catch那样一锅端总结多线程不一定就比但线程高效,比如大名鼎鼎的Redis(后面会分析),因为它是基于内存操作,这种情况下,单线程可以很高效的利用CPU。而多线程的使用场景一般时存在相当比例的I/O或网络操作另外,结合小学数学题,我们已经了解了如何从定性到定量的分析的过程,在开始没有任何数据之前,我们可以使用上文提到的经验值作为一个伪标准,其次就是结合实际来逐步的调优(综 合C P U,内存,硬盘读写速度,网络状况等)了最后,盲 目 的 增 加CPU核数也不一定能解决我们的问题,这就要求我们严格的编写并发程序代码了灵魂追问1.我们已经知道创建多少个线程合适了,为什么还要搞一个线程池出来?2.创建一个线程都要做哪些事情?为什么说频繁的创建线程开销很大?3.多线程通常要注意共享变量问题,为什么局部变量就没有线程安全问题呢?4下一篇文章,我们就来说说,你熟悉又陌生的线程池问题参考感谢前辈们总结的精华,自己所写的并发系列好多都参考了以下资料 Java并发编程实战 Java并发编程之美 码出高效 Java并发编程的艺术日 拱 一兵I原创
限制150内