为什么要学一学并发编程

世界上,很多事情在同时发生。

咖啡厅里同时坐着很多人,门口的马路上同时有多辆车通过。而盯着屏幕的你,还听着耳机里迷人的音乐,写代码的同时,还浏览新闻。

但不知道你有没有注意到,这里包含了两个“同时”。

“多辆车同时通过”,无论把时间切到多细,一分钟、一秒钟,甚至一微秒,都有多辆车在动作。这称为“并行”。

而“写代码的同时,浏览新闻”,当时间切到足够细时,只有一个动作在发生,在更长的长度上看,其实是两个动作交替进行。这称为“并发”。

Rob Pike有个演讲《Concurrency Is Not Parallelism》,详细说明了并发和并行。简单而言,并发是指程序的逻辑结构。并发的程序有两个或以上逻辑控制流,如果把这些控制流画成时序流程图,它们在时间线上是可以重叠的。并行是指程序的运行状态:某一时刻被多个CPU流水线同时处理。显然,并行需要硬件支持。

那么,不难理解:并发是并行的必要非充分条件。一个只有单一逻辑控制流的程序不可能被并行处理,而并发的程序在一个CPU流水线上执行也不是并行的。


并发是对问题更本质的描述,现实世界很多事情是并发的,而编程是对现实世界的建模。我们希望写出的代码也能有亲切的并发感。

实际上操作系统也是这么抽象的,“喝咖啡”、“写代码”、“看新闻”……这些完成特定动作的代码片段,称为任务。多个任务交替地在CPU中运行着,当然,多颗核心时,也可能并行地运行。

要不要运行某个任务,什么时候运行,运行多久,操作系统回答这些问题的过程,称为调度。需要注意的是,操作系统调度的单位不是任务,而是线程。线程是操作系统对并发的实现。

在同一个线程内的任务是严格按代码顺序执行的,只有多个线程上的任务才会交替执行。而我们写出的代码默认是在一个线程内的。这样一来,如果没有特别设计,代码是串行执行,而不是并发执行。

比如,某段代码先执行A部分,并把A的结果打印出来,接着执行与A没有任何关系的B部分,示意如下:



整体是一个任务,并按顺序一步步执行,总耗时是T(A)+T(print A) + T(B)。如果拆成两个任务,分别在各自线程中执行,示意如下:


B不必等A的print结束再执行,哪怕只有一颗CPU核心。因为一个调度单位变成了两个,当其中一个不占用CPU时间(print)时,另一个就可能被执行。总耗时不超过任一任务的耗时。

使用多个线程,让更多核心派上用场,提高了资源的利用率,加快了程序执行速度。同时还有助于获得更高的吞吐率。当某个线程在等待I/O操作完成,另一个线程可以继续运行,使得程序整体能在I/O阻塞时继续工作。好比在等公交车到站的同时看手机,而不是等上车后才开始看。

了解并发的好处之后,也得听一听反对的声音,尤其是当这个声音来自于linux和git之父Linus时。2014年,Linus说道:

Where the hell do you envision that those magical parallel algorithms would be used?

The only place where parallelism matters is in graphics or on the server side, where we already largely have it. Pushing it anywhere else is just pointless.

Trust me, concurrency is hard. There's a reason all the examples of "look how easy it is to parallellize things" tend to use simple arrays and don't ever have allocations or freeing of the objects.

People who think that the future is highly parallel are invariably completely unaware of just how hard concurrency really is.

并发编程并不是没有代价的,而且可以说有高昂的代价。虽然人可以同时做多件事,但不意味着擅长同时做多件事,也不代表同时做的效率更高。相反,人擅长的是串行模式,专注于一件事,做完之后再做另一件。

并发程序的设计和实现异常复杂。如何恰当地切分功能就已经很考验人,再考虑到多线程的乱序执行,以及线程之间的协调需求,只要稍不留神,就会失之毫厘、谬以千里。开发、阅读和调试都相当困难,即使是实战多年的并发专家,也不敢掉以轻心。

因此,需要更加审慎地对待并发技术,不盲目使用。先实现功能,再关心性能是否足够。

The strategy is definitely: first make it work, then make it right, and, finally, make it fast.——Kent Beck

当然,Linus也认可并发在显卡和服务器编程领域的必要性。对于前者,由于深度学习的全面流行,显卡厂商Nvidia股份一再创新高,其火爆程度可见一斑。为并发而生的Golang(语言级别的并发支持,简单的并发模型)在服务器端大行其道,也证明了Linus所言非虚。

并发编程领域所关注的问题,主要包括:

  • 如何抽象与建模
  • 并发粒度的控制
  • 工作者的调度
  • 工作者间的协作

通常,对这些问题的考虑只发生在同一程序内,甚至只是其中某一模块或功能点。但如果缩小一下放大镜,从更高的位置看全景图,则会发现并发编程和分布式编程颇有几分相似。并发系统内,同一进程内不同线程之间的关系,对应了分布式系统中,不同机器上部署的进程之间的关系。而线程和进程有很多相似之处,只不过分布式系统多了网络相关的故障。因此,对并发编程的学习和研究,对分布式系统架构的设计也有借鉴意义。

REF.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,829评论 1 331
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,603评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,846评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,600评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,780评论 3 272
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,695评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,136评论 2 293
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,862评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,453评论 0 229
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,942评论 2 233
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,347评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,790评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,293评论 3 221
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,839评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,448评论 0 181
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,564评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,623评论 2 249

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,472评论 25 707
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 41,988评论 11 349
  • 6:50起床,这次孩子们毫无困难,还没下楼顺风车司机就来电话了说已经到酒店楼下了,比预定时间早了20分钟。 还是按...
    明月归来阅读 225评论 0 0
  • 今天没练功,做了艾灸和刮痧。灸肾俞时精神,灸神阙时睡了。刮大肠经,上臂部好多大疙瘩,痛感不算太重,打嗝,然后大疙瘩...
    邵清清静阅读 195评论 2 2
  • 怎么说呢,这本书看完,有种一顿饭吃得不香不臭、饥不饥饱不饱的感觉。 笃信某教、从字面意思理解圣经并将其作为生活指导...
    一条污蚣阅读 409评论 0 0