设为首页 加入收藏

TOP

golang、c++,并发、并行(一)
2017-09-30 13:36:30 】 浏览:5852
Tags:golang 并发 并行

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)斤火腿肠。

 

这就是并行。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

 

下一篇结合语言继续扯。。。

 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇gstunnel---一个网络安全管道 下一篇google的grpc在golang中的使用

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目