golang、c++,并发、并行(一)
本文内容纲要:
golang、c++,并发、并行(一)
正式接触golang大半个月,写了几个练习项目,让人有些感概。
Golang这样的自动化内存管理水平和并发调度能力,让我印象很深。
单是那样的内存管理水平,通过加入特定的并发优化c++内存池,我可以做到。
那种并发调度能力,通过引入复杂的调度算法,也勉强可以做到。
但是这两个加在一起,配合出色的跨平台标准库,组成这样的一个并发友好跨平台生态,这我五年之内可能都做不到。
没有用c++写过高并发代码的人,可能很难理解这种复杂的情绪。
这是一种,久渴的人,突然在沙漠中看到一片绿洲的感觉,惊喜万分;而后又发现原来这个绿洲一直就在你身旁。但你却不停错过的悔恨。
c++的高并发编程,一个听的人感觉很有逼格,写的人累死的事情。
这是在11版前,甚至连跨平台线程模型都没有的环境。
这是连标准库一个小小的random生成器都没有实现并发安全性的环境。
这是一个需要面对海量第三方库,然后基本上没有文档,和一堆编译问题和运行bug的环境。海量到,最后已经完全麻木,只感觉眼前不停地飞过一个又一个库名,一个又一个错误。等你费了吃奶的劲,终于都正常运行了。才又发现,只是串行情况下运行正常。那并发运行呢?
这是一个在沙子上建立的楼房。或许一声咳嗽后,就会顷刻倒塌。
就是这么一片糟糕的环境。扑面而来的蛮荒与原始,让你怀疑还活在上个世纪,活在穿孔卡片式计算机的时代。
06年,计算机正式进入多核元年。
以前只在大型机、小型机上,使用的昂贵玩意儿,开始大规模出现在桌面pc和廉价服务器上。
一个让硬件工程师,大松一口气,“终于他妈的,从功耗、主频陷阱解脱了。”他们成功的甩掉了一个沉重的包袱。
而软件工程师,开始戴上了沉重的枷锁。心里一万头。。。奔过。“免费午餐”正式结束。
并发、并行两个坑爹货正式进入大多数程序员的视野。
线程级的并发、并行
线程级并发,是一种使用多线程进行程序流程设计的方式。(和单核的指令级并行不同)
在单核时代,主要是应用于gui,网络通信等要求低延迟高响应的场景。
线程级并行,是一部分并发在多核cpu上的一种表现。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
简单举例:
程序a,包含100斤肉、50斤淀粉、10斤香辛料。
单核cpu,一座火腿肠工厂。
串行:
100斤肉-->50斤淀粉-->10斤香辛料-->火腿肠工厂-->火腿肠
把肉、淀粉、香辛料运入工厂,一分钟(60秒)后,工厂生产出160斤火腿肠。
现在客户说一分钟太久了,要一边运进原料一边生产出火腿肠。降低出货时间。
并发:
10斤肉-->5斤淀粉-->1斤香辛料-->火腿肠工厂-->火腿肠
(然后重复)
10斤肉-->5斤淀粉-->1斤香辛料-->火腿肠工厂-->火腿肠
。。。
现在可以做到0.1分钟(6秒钟)就生产出16斤火腿肠。
现在老板说火腿肠生产的太慢,要扩大工厂规模。于是找来了工程师,工程师说,继续扩大单个工厂成本太高,划不来。不如,再建一座新工厂。
程序a,包含100斤肉、50斤淀粉、10斤香辛料。
双核cpu,两座火腿肠工厂,工厂a、工厂b。
继续用上面并发生产方式:
(两座工厂同时生产)
10斤肉-->5斤淀粉-->1斤香辛料-->火腿肠工厂a-->火腿肠
10斤肉-->5斤淀粉-->1斤香辛料-->火腿肠工厂b-->火腿肠
现在0.1分钟(6秒钟)运入20斤肉、10斤淀粉、2斤香辛料,
(10*2斤肉、5*2斤淀粉、1*2斤香辛料)
生产出32(16*2)斤火腿肠。
这就是并行。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
下一篇结合语言继续扯。。。
本文内容总结:
原文链接:https://www.cnblogs.com/yipiancaidi/p/6485934.html