通俗易懂——线程,进程与中断调度

先说两个概念,因为这两个概念在下面会高频次的出现,请务必理解:
1,进程:每个正在运行的EXE就可以视为一个进程。进程独占内存空间,不与其他进程共享。进程不能直接供CPU计算。
2,线程:每个进程至少有1个线程,多至N个,同一进程下的所有线程共享内存空间,但每个线程独占CPU每个逻辑核心的运算周期。
换句话说,CPU的运算实质是程序的线程被CPU调用运算。


回想下以前单核的时代,我们PC上也会同时运行窗口化的网游,聊天的QQ,还用winamp放着背景音乐。这些程序都有着独立的进程和所属的线程,需要独立的占用CPU的运算周期,但我们实际使用时却感觉这些程序都在并行。事实上当时的单核CPU并不可能并行处理这些程序,只是根据程序实时的运行状态动态的分配不同长短的周期给不同的程序。当某一程序的线程占用了当前的运算周期时,其他线程必然要被暂停,等当前线程运算完毕后,或被优先级更高的请求中断了,其他线程才能继续计算。
想象下有一条流水线,既可以生产机箱,又可以生产电源。但流水线在任一时间只能生产一种东西,不能同时生产两种以上。现在车间主任A获取了今天的生产计划,第一个小时生产电源,第二个小时生产机箱,第三个小时生产电源。于是整条流水线及其配套设备都按着生产计划开始运转了:先用10分钟准备第一小时电源生产所需的配套工料(读取内存数据),然后用40分钟生产电源(运算),再用10分钟移除配套工料(释放寄存器)。这样第一小时的生产任务完成了。第二小时开始后同样的流程:先10分钟准备工料,再生产40分钟,最后10分钟撤除工料。第三小时同样的过程。车间主任按计划调度生产,圆满完成任务。


但是等等,我们第一第三小时不是都在生产电源吗?但我们第一小时的后10分钟和第三小时的前10分钟却都在搬工料,根本没生产啊。车间主任B意识到了问题所在,于是在第二天接到同样的生产任务后,果断调整计划,将第一第二小时都用来生产电源,第三小时用来生产机箱。于是B车间的电源产能比A车间整整高了25%(80分钟生产时间VS100分钟生产时间)。或者说,同样完成当天的生产任务(电源+机箱),B车间可以比A车间快20分钟完成。效率提升杠杠的。


结论:
1,CPU在不同线程之间切换,运算周期的开销和浪费都是巨大的。
2,一个好的中断调度单元(车间主任)能更合理的预测并分配CPU运算周期,从而提升效率。



但是Boss气冲冲的来找车间主任B问罪了。我让你第二小时生产机箱,是因为我答应了客户2小时后交货,你现在擅自更改计划,导致到时间了交不出货,带来巨大损失。光生产效率高有个P用!

结论:
3,如果没有准确的分支预测能力,还是老老实实做个按部就班的车间主任的好。


把车间主任B发配到流水线上干活后(其实P4时代INTEL就是真这么做的,他们认为与其把晶体管数量堆在没用的中断调度单元上,不如用来堆流水线长度堆频率),车间主任A继续回来掌管生产了。第三天的生产计划和第一天一样。但2小时5分钟后,正把电源的工料准备到一半时,Boss突然通知主任A,55分钟后要交付一批风扇,马上安排生产。主任A皱着眉头说不行啊Boss,堆了一半的电源的工料要撤下去得5分钟,准备风扇工料又要10分钟,这就2小时20分了,再加上生产时间45分钟,无论如何没法在3小时0分时交货啊。


已经被发配到流水线上B这时跳出来说到,作为车间主任,你丫不知道我们流水线旁的堆料空间到底有多大吗?何必撤电源的工料,直接准备风扇的工料就是了,时间正好来得及!经此一战,主任B重新得到Boss重用。并且Boss觉得扩大流水线旁的堆料空间是个好事,直接下令扩建了3倍空间,让流水线旁能同时准备三种工料。


结论:
4,好的车间主任不能光看流水线,还要看流水线旁的堆料空间(CPU缓存也得管起来)
5,堆料空间(缓存)越大越好。但如今地价这么贵,总扩张平面不是办法,得把高度利用起来(L2,L3缓存应运而生)。当然因为离流水线更远了,拿L2,L3里的料所需的时间也更长了。L1紧挨着流水线(独享)的才是最好的。


由于客户的古怪脾气(没错,就说PC玩家你们呢,需求没个准。哪像超算和服务器那么老实单纯,一个程序加载后就长时间只干这件事,几天都未必变一次),工厂每天的生产内容总需要每小时变更一次,大量的时间都浪费在了切换和准备工料上。Boss一合计,我干脆再增加一条流水线吧,总长度总产能翻番,客户脾气古怪时我就两条流水线不停的切换,和现在效果一样。但有时候客户对电源需求不间断时,我可以一条流水线一直生产电源,另一条不停切换生产机箱和风扇,这样电源因为没有切换时间了,生产效率将大幅提高。至于机箱和风扇的交货时间会延长,只要客户还能忍受没投诉,就不是问题啦。——于是,双核诞生了。(其实从单核到双核之间还有P4的超线程值得一说,这是中断调度一次重大突破,只有在中断调度本身已经能有很高的分支预测精度时,才可以做超线程。虽然当时P4的超线程并不完善甚至负作用更多,但也为后来i7的牛逼奠定了基础。篇幅所限舍弃)


主任B又跳出来说到:Boss,两条线我看不过来啊,让A和我一人看一条吧。Boss嘿嘿冷笑:一个车间只能有一个主任,否则你们两都下令要同一份工料,流水线岂不是要宕机?B说:我和A会保持沟通,确保不发生这种事。Boss继续冷笑:那以后每次准备工料,你们两是不是还要先花10分钟互相确认各自要什么,然后才下令啊?


结论:
6,不管新增多少条流水线,车间主任只能有一个。每多一个车间主任,互相之间的沟通成本成几何增加(2个主任一条线,3个主任3条线,4个主任6条线。。。),会立即抵消新增流水线带来的优势。


可怜的B主任在淫威大大的Boss压力下,投入到了一个人管两条线的艰巨工作中。他迅速发现了相比一条线时的巨大挑战:原来接到紧急任务时他只需要暂停当前任务,直接插入紧急任务即可。这完全不需要思考。但现在有了两条流水线,他该暂停哪一条流水线呢?如果紧急任务耗时很久,那么他又该不该把暂停下来的任务切换到另一条流水线上生产呢?还是等着Boss来催他了再切换?切早了怕Boss说这不是他要的,切晚了怕Boss骂他慢。B主任深切的意识到他原来的中学数学水平已经不够用了,需要恶补概率论,统筹学等大学课程了。


结论:
7,双核及以上时,中断调度的难度激增,没有一个强大的车间主任,没有极高的分支预测精度,多核并不会比单核表现的性能更高。曾经被否定的结论2,在多核时代却成为了一个必须达到的门槛。而符合结论3的主人们,则都将被淘汰出局。


凭着自己的聪明好学,B主任终于开始能迅速准确的分配两条流水线生产任务了。正当他觉得可以歇一口气时,一个晴天霹雳来了:客户从明天开始对机箱提出了新要求,要求机箱的生产速率翻倍。(鼓掌,说了这么久,和本主贴最相关的游戏多线程终于登场了)


客户想,你工厂不是有两条生产线吗?同时开工生产速度就应该翻番,这不是很简单很容易的事吗。客户说完转身走了,留下一脸懵逼的主任B在那发呆。


B主任迅速的理了一下,客户既然明确要求机箱生产速率翻倍,那么在生产机箱期间,再有电源和风扇的订单我就绝不理睬了。(PS4嘲讽脸:你丫是PC,怎么能学我们主机,那么多后台进程说不管就不管?你看,你妈正在QQ上喊你回家吃饭呢。主任B:老子豁出去了,就是不管了)。此其一。


其二,客户希望的是更快的获得一个机箱,因此两条流水线同时各做一个机箱,只是让客户每隔一个单位时间能获得2个一模一样的机箱,而让两条流水线各生产半边机箱,并在流水线尽头再拼接成一个完整的机箱,则客户可以每隔半个单位时间获得1个完整的机箱。虽然拼接(I/O)时没法让两条流水线同时工作,会导致效率略有损失,但总体上必然会比前一种方式以更短的间隔时间向客户提供机箱。

B主任很高兴自己能想到这么完美的方案,但是,理想很丰满,现实很骨感。第二天一投产,各种拖后腿的问题就来了。

先是客户死活要插一个电源在生产计划中,Boss被客户不胜其扰后强令主任B切换生产电源,结果另一条流水线上的右半边机箱堆积如山,但没有配套的左半边机箱来拼接,全是废品。主任B急急忙忙的更改生产计划,让单条流水线改为生产完整机箱。第一天最终变成了单条产能。


第二天主任B以死相逼,终于换来了客户绝不加单的承诺。然而风云突变,客户忽然中2病发作,一会要左半边机箱镀金,一会要右半边机箱镀银。由于两边的机箱生产工艺已经完全不同了,原本设想的很好的拼接也变得支离破碎,不是右边要等左边,就是左边要等右边。为了确保两边的生产能同时到达终点,主任B不断的介入工作分配,每次上料前都要亲自测算,有时左边1/3右边2/3,有时右边1/4左边3/4。再加上为镀金镀银准备工料,主任B累的两眼发黑,一命呜呼了。。。


在走向天堂的路上,主任B看到了他梦想中的田园时代:那里只有一条流水线,一条以光速运转的流水线。而他,只需要不断的把接到的生产任务插入即可。。。


结论:
8,下辈子投胎做个至强的中断调度单元吧。

展开阅读全文

没有更多推荐了,返回首页