转载自:https://juejin.im/post/5aa75d5af265da23906bad44
(一)CPU概念基础
1,超线程技术
-
什么是超线程技术?
超线程技术是一颗单核CPU把一个物理内核模拟成两个逻辑内核,这两个内核共享一个CPU资源,每个内核同一时刻只能处理一个线程。
-
超线程技术实现并行操作的原理?
一个线程在执行时会占用CPU资源,其他线程想要得到执行就必须等待该线程将CPU资源让出。
利用超线程技术,模拟出的两个逻辑内核共享同一个CPU资源,所以同一时刻可以有两个线程都占用CPU资源,因此这两个线程都可以得到执行,这就是实现同一时间执行两个线程的并行操作。
-
超线程的性能如何?
由于超线程技术是共享同一个CPU资源并不是真正拥有两个CPU,所以性能比不上两颗单核CPU一样在同一时间执行两个线程。
1,单核CPU
单核CPU同一时刻只能执行一个线程。
-
单核CPU中可以执行多线程吗?
可以;
在单核CPU中执行多线程程序,看起来像多个任务同时执行,实际上是系统帮忙切换线程去占用CPU资源,同一时刻还是只有一个线程得到执行而已。 -
单核CPU中执行多线程的性能怎么样?
在单核CPU执行多线程程序,更多的时候速度其实并没有变快,反而性能降低,因为线程之间的切换会增加开销。所以一般情况下,单核CPU不推荐使用多线程。
2,多核CPU
多核CPU就是基板上集成有多个单核CPU。
单核CPU同一时刻只能执行一个线程,因此集成多个单核CPU的多核CPU可以同时运行多个线程,比如双核CPU可以同时执行两个线程。
多核CPU要用多线程才能体现出优势。同样,多线程也要在多核CPU上才能体现出优势。
(二)并发与并行
1,什么是并发?什么是并行?
并发就是几件事切换着做,有效利用等待的时间。
并行就是几件事同时做。
2,举个栗子
-
并发的例子
程序猿小明把材料放进锅里,按下开关炖汤。炖汤要等60分钟。这60分钟小明并不需要在锅旁边等着,而是回到电脑桌前继续写程序。60分钟到了之后,小明停下写程序,揭开锅放点其他调料进去,还要继续炖个30分钟。在这30分钟,小明又回到电脑桌前继续写程序。
小明炖汤和写程序这两件事交替地执行,同一时刻只做一件事,但是这样却能有效利用等待炖汤的时间,大大提高了效率。
当然计算机的并发不同任务的切换速度非常快,看起来就像同时进行一样,实际上不是同时进行。
-
并行的例子
盛了一碗炖汤来到电脑桌前,小明左手敲代码,右手喝汤。在同一时刻,小明同时做多件事,这就是并行。
(三)多线程实现的是并发还是并行?
多线程可能被分配到同一个CPU内核中执行,也可能被分配到不同的CPU执行,分配过程是操作系统管理的,无法在程序中进行控制。所以我们写的多线程程序,可能是并行的,也可能是并发的,关键看运行过程中操作系统是将这多个线程分配到不同的CPU中还是同一个CPU中。
(四)多线程的应用场景
多线程可以帮助我们有效利用多核CPU的优势,提高性能;但是如果使用不当会导致数据不一致的问题。
1,需要及时响应
比如有一个线程是处理大量数据的耗时操作,如果不采取多线程,其他任务无法执行。这样用户只能等待该耗时操作执行完后才能得到其他信息或进行下一步操作,用户体验大大降低。
就比如有的程序运行一些耗时操作,看起来就像死机一样,给用户的体验特别不好。
如果采用多线程,那么在耗时操作处理的时候,可以让另一个线程去执行,反馈一些其他信息给用户,这样用户就知道程序并没有卡死。
2,解决性能问题
多线程主要用于解决因为并发而导致的性能问题。
比如我们要爬取某个小说网站的所有小说简介和所有小说正文,我们就可以考虑创建两个线程,一个线程专门用于爬取小说简介,一个线程专门用于爬取小说正文。
比如爬虫应用中,爬虫队列中存在很多未爬取的任务,此时开启多线程就可以大大提高性能,缩短爬取时间。
网友评论