自己永远是孤单的,但你可以让其他人变得不孤单。 收藏本站
登陆 / 注册 搜索

阅读: 10.7K   回复: 3

[# 网络基础] 科普贴——什么是并发?

仗剑天涯论坛大牛 2017-11-23 23:54 |显示全部楼层

今生相逢便是缘分,何苦去怨恨,何苦去仇视。

主题破百
        办公室只有一个卫生间,一次只能容纳一个人方便,这个卫生间就是竞争条件(Race Condition)。
8 |& a7 {# v4 v0 b/ o7 _% m( @; p) j4 s  j! S, D% q
        当一个人进去后就在门口牌子上标识为“有人”,这个就相当于是线程的加锁,告诉其它同时间想要上厕所的人,这个资源已被我占位,其他人就需要等待,这叫wait。$ I4 b) y; k" I' ~

: A/ g+ z9 o; j
科普贴——什么是并发? Untitled-1.png
- o4 _# n+ F) Q% x; Y
        只有当前面的人出来后,并把牌子置为“无人”时,其它人才有机会使用。当只有一个蹲位时,一次只能进一个人,翻动一块牌子加一把锁,这个就叫互斥锁(Mutex)。
+ y4 _% Q0 s& g( V: \" O) U) x4 H5 c9 v( ?- `- ~3 u& P9 Q' x; G
        如果卫生间里有多个蹲位,再简单地用一块牌子来标识就不行了,需要做一个电子公告牌,进去一个人电子公告牌就把可用数量减1,出来一个人数量加1,
) Z8 b% t* \1 F& m/ j
7 h( |  p3 y% y& |' k/ n1 S9 L7 B        数量不为0时,有人来直接进去就行了不用等待,这个叫信号量(Semaphores)。$ L4 l+ _2 ~* I3 `9 Y

9 u* F4 q9 K. i0 U        如果出来的人是随机通知等待的某一个人,这叫notify,如果他是对着所有等待的人喊一嗓子,就是notifyAll。
' Y. e' {1 E: m) P0 b) y  A& E( N$ N# ~7 C2 L! S! `; k
        如果使用notify,有些倒霉的家伙可能永远也不会被通知到,这太不人性了,而如果使用nofityAll就意味着所有等待的人需要竞争资源,还是会在倒霉蛋永远轮不到。
) V" G" k& }0 a! G& l
- ^- _; p9 [  }) A8 p4 K        解决的办法一是按时间顺序先到先得,顺序进入,火车站的厕所经常会看到这种情况,总是有机会轮到自己,这叫公平锁(FairLock)。0 n* u" K: T1 R# \+ I$ o' |

  `$ A+ w8 D$ I7 M) w% C        还有一种情况,就是大老板也在排队,一般情况下大老板时间宝贵,可以优先考虑让他先上,这叫线程优先级,一共有10个级别。
8 W( @' V, E# p+ ?0 T1 Y! ^$ b8 h* U7 {, f* y0 o+ t8 x
        优先级只能保证级别高的优先被调度到,但不能保证一定会被调度到。% t( ^! y* X* Y+ z6 ?. q
9 f& z' N8 `0 R2 |3 Q9 b6 J- b
        两个好基友一起在蹲坑,只有一卷手纸,一个人去取时另一个就不能同时去取,这叫基于共享内存的线程间通信。
7 ]# B% W. K6 G5 Q7 Z% x$ i" m; }* f8 z6 r1 S: c8 T. ^
        或者:两个人都是烟鬼,但只带了一个打火机,一个人用完之后递给另外一个人.
1 @2 Z7 I- e& v' [  G0 X0 g9 j# h* f0 Q& ?* f2 U
        进程和线程的区别:一个办公区有多个卫生间,每个卫生间的资源是独立的,不会相互依赖,相当于是进程。" q) l# T& `/ @3 I/ r4 `

8 K3 u0 J- K: D3 A1 |4 N! y" ]        每个卫生间有多个蹲位,每个蹲位相当于是一个线程,蹲位越多并发处理能力越强。但多个同一个卫生间的多个蹲位共用一个洗手台,如果蹲位过多,洗手台的资源会成为瓶颈。& g; X+ s! C: H, e

8 E7 p. T# }" O1 }2 l
#f192:
0 z4 v. C# g, O1 P
        一本正经+ T7 @0 S1 {6 |: P5 {$ L% r
. `0 g* |% a! a
        1 v7 ?% R0 N. j; A. c9 y
       并发是指一次处理多件事。3 D/ L' l; \7 u, P; W
        并行是指一次做多件事。% C7 @7 k, o. X' j$ [0 P
        二者不同,但是有联系。8 \$ Z1 Z: m# }# F0 z$ X
        一个关于结构,一个关于执行。
% V4 t% F7 g% P7 r% U        并发用于制定方案,用来解决可能(但未必)并行的问题。
+ y8 k) v/ f- O! [7 v0 x  @/ T! D* H2 K
                 ——— Rob Pike Go语言的创造者之
7 r9 z5 z7 X3 \9 T  N$ |$ `
       真正的并行需要多个核心。现代的笔记本电脑有4个CPU核心,但是通常不经意间就有超过100个进程同时运行。8 G6 h0 E/ E: d: I' S6 G! M
$ x+ e' n  V/ N8 e) R
        因此,实际上大多数过程都是并发处理的,而不是并行处理。
0 s6 D$ T3 l1 q" t9 f+ b' m8 G3 j6 A* _  r+ }
        计算机始终运行着100多个进程,确保每个进程都有机会取得进展,不过CPU本身同时做的事情不能超过四件。' x$ y# I4 u  Y2 Y8 {- M# l

7 ^+ w8 @0 b$ c        十年前使用的设备也能并发处理100个进程,不过都在同一个核心里。. |6 d6 Q) {+ M7 t: h

" v8 ~( K. U7 w4 r! ~$ W2 W
上一篇
下一篇


小小白? 「龙战于野」 2019-9-14 00:40 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

看君一好帖,胜过千千万
屋顶,数星星 「出类拔萃」 2018-1-21 08:32 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

火钳刘明#j319:
雾月 「出类拔萃」 2018-1-21 10:44 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

寡人果如其母之聪慧。
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

关于本站|大事记|小黑屋|古黑论 网站统计

GMT+8, 2021-5-7 00:38 , Processed in 0.033126 second(s), 21 queries , Redis On.

© 2015-2021 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表