为什么会用到多线程?

讲个简单的版本:
你是一个很强壮的男人,你老板给你发布任务让你去买100瓶矿泉水。你一瓶一瓶的搬运感觉太麻烦,你决定一次拿10瓶,10次就解决了。
前提是你力气够大,这是非常重要的指标,10瓶就相当于10个线程,你就是CPU。
再讲下并发和并行:
并发就像多个人去抢一碗饭,你一口,我一口,抢到就是赚。上面那个男人就是并发,他只有两只手却拿了10瓶水,因为他力气大(CPU的计算力强)。
并行就是每个人都有自己的事情,比如一起看电影。
一个CPU是有多个物理核心的,就好比章鱼有8只手,效率刚刚的。但是往往再编程中并发数不是CPU决定的,是动态的。比如有100个人同时访问网站,计算机就开100个线程去接待(服务)。
举个例子,小明的学校在暑假布置了10门课的练习册,小明每天都要写一点10门课程的练习册,如果当天没写完就折一下页角标记一下,每天赶一点进度。老师每天打电话问你:小明,今天写作业了吗?,小明说:写了,老师感觉小明很听话。
CPU也是这样运算程序发布的任务,多线程时线程排队顺序执行,每个线程执行一小段时间,如果没完成任务就先标记下,继续下一个线程任务。
这个前提是线程数量大于CPU的物理核心了,每个核心只能一个一个执行,只要你执行的够快,用户就感觉是并行执行的。

发现很多文章都没有从本质上说清楚为什么需要多线程,灵感来自《JAVA并发的艺术》,总结一下(以下只是个人理解):

为什么联发科的“超多核”处理器玩游戏会卡?为什么处理器没有无限制的增加核心数?

因为日常生活需要集中运算力的需求多是游戏,游戏基本没有针对CPU多核心做优化。

举个例子:像大型端游,大部分的CPU计算力需要主攻玩家的互动状态,以及用户画面的实时更新。

这个过程计算的目标不多,但又不能拆分进行多线程计算,所以就讲究单线程(单核)的计算力。

这也就是为什么现在市面的cpu为什么不无限的增加cpu,因为游戏时需要单核的运算力。

但是当CPU把运算好的画面数据交给GPU渲染(输出到显示器)时,又讲究GPU的计算力了,因为GPU是典型的多核心运算。

这就用到了多线程,因为画面是一帧一帧显示的(注:视频是由很多张图片连续播放实现的,每一张称为一帧)。

实际上CPU和GPU运行原理一样,但是GPU有更多核心,目的就是提高并行的执行力,以快速的渲染视频。

在计算机中并行是真正的同时执行,需要多个物理核心的支持。并发是切换0时间片的概念(就是压榨核心的计算力)。

矛盾冲突:CPU开启多线程不就可以代替GPU了?

一个人的精力毕竟有限,你不能让我边吃边拉shi吧?就好比你的嘴用来吃饭,屁股我就不说了~

矛盾冲突:既然这样为什么不把CPU设计成多核的?

按我的理解是一方面实现按需选取配置,还有就是实现分工处理数据,

还有就是你看现在的显卡需要很多风扇才能压住温度,太猛了!!!

这就好比你为什么补涨两个嘴,消化完,直接从另一个嘴出来?

敲黑板:我们得明白计算机是模拟人脑造出来的,其实是人脑的代替品,你非要刨根问底,你得去研究宇宙了。

单线程处理的过程是这样的:

处理第一帧,然后第二帧,第三帧。。。。都在后面排队。假如每个图片输出需要5ms,1000张就需要5000ms。

敲黑板:

处理一帧画面用不了太多GPU的计算力,但还是会消耗少量时间。

就好比你切菜觉得很简单,我一次给你一个菜叶,连着给你100个试试?

多线程处理的过程是这样的:

比如我们开启10个线程,实际上就是一次拿出10帧画面,多个线程同时处理。目的就是压栈CPU的计算力

敲黑板:

多线程实际上加大了线程切换的开销,但是成功压榨GPU核心的计算力。我们还是切菜为例,不过这次我一次给你摆放10个菜叶,让你连着切没有休息的间隙,你很快切完1000个菜叶。

现在我们明白了,当处理大型任务时(游戏)可以使用单线程,处理碎片化任务时开启多线程。

就好比我搬一桶水基本把我们的力量全用上了,但是让我切一片菜叶,不费吹灰之力,我们可以同时切多个。

计算机里面的多线程并发并不是真正的同时运算。比如切菜叶它(cpu)是一个个切的,只不过它连续切,而且速度快,你看了一个假象,认为是并行(同时运行)的。

参考文档:http://ask.zol.com.cn/x/5690565.html

posted @ 2020-03-13 22:02  EggCode  阅读(600)  评论(0编辑  收藏  举报