本期开始,冬瓜哥将分三次为大家全面介绍流水线有关的知识。
试想两个人在接力搬东西,如果这两个人的速度能保持完全一样,那么配合会非常完美,我左手拿东西传到右手,你左手刚好空出来拿到我右手递给你的东西。但是突然你感觉头上痒的不行了,去挠了一下,这下好了,我就得暂停,等你挠完了再继续。此时我多么想你跟前有个篮子啊,这样我就可以放在篮子里,你爱挠哪挠哪,挠完了你自己从篮子里拿走。
对啊,程序员也是这么想的。两个设备之间、两个程序之间,要想达到高吞吐量,就得这样将信息的传递异步化,而不是同步化。
传递东西有两种方式:
A. 同步等停方式。源头某角色生成一样物品,然后让第一个人用左手从源头拿走,传递给他的右手,传递给第二个人的左手,东西传给第二个人之后,第一个人不做任何动作,纯等待源头再交给他另一样物品。
想象一下,如果整个传递路径上只有两个人还算好,如果有10个人,可以想象,这样物品从源头传递到目的端所需要的时间将会非常长,而在这段时间内,源头不会再传递任何物品,这10个人中总有9个人闲着没事。一样物品从第一个人传递到最后一个人所经历的时间,被称为这条传递链的时延/延迟。假设每个人从拿到物品到传递给下一个人,需要1ms的时间,那么由10个人组成的传递链,整个传递链从头传递一次就需要10ms的时间(该传递链条的时延=10ms),那么这条传递链每秒可以传递1000ms/10ms=100个物品,也就是100物品/s,这就是该传递链的吞吐量。
问一下:同步模式下,如何增加传递链的吞吐量?答案似乎只有一个:降低传递链的总时延。如何降低呢?要么提高每个人的处理速度,要么砍掉不必要的人。
人们天然的会想到,能否让源头源源不断的将物品传递个第一个人,第一个人也源源不断的传递给第二个人,以此类推。于是有了异步方式。
B. 异步流水线方式。源头让第一个人左手拿走一个物品,第一个人把物品传递到自己右手后,马上再从源头拿一样物品。一瞬间,第一个人左手和右手同时拿着两个物品。当第二个人结果第一个物品后,第一个人左手再将第二个物品传递给右手,左手空出,可以再从源头拿第三个物品。第二个人向第三个人传递时也这样去做。这就是异步传递模式。问一下:这种传递模式下,一样物品从源头到目的,经历了多长时间?当然还是10ms,没的说,也就是说,传递链总时延并没有变化,每样物品从源头传递到目的依然还是10ms。答对了,加十分。
问一下:此时该传递链每秒能传递多少样物品?这问题得分析一下,第一样物品从源头传递到目的当然需要10ms,但是第二样物品在第一样物品到达之后的1ms(最后一个人从左手传到右手的时间)也到达了,同理,后续所有的物品都是相隔1ms间距,一个接一个的到达了。那么就可以算出来在1000ms内,头10ms传递了一样物品,后990ms每1ms可以传递一样物品,这样的话,吞吐量变为990+1=991物品/s。吞吐量几乎提升了10倍!
问一下:在这个基础上,想进一步提升吞吐量,共有几种方式?自然,第一种方式是降低每个人从左手传递到右手的时间;这样最见效,比如降低到0.5ms,则吞吐量将为:1+(1000-5)/0.5=1991物品/s。第二种则是减少传递链上的人的数量,这样可以将第一个物品所需的10ms降低,比如,降低到2个人,那么吞吐量将为1+(1000-2)/1=998物品/s,似乎提升并不是很大。第三种则是再增加一条或者多条传递链,多条一起传递,那直接性