如果喜欢,就把这一切当做是荣耀,而不是炫耀 收藏本站
登陆 / 注册 搜索

阅读: 10.4K   回复: 3

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

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

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

主题破百
        办公室只有一个卫生间,一次只能容纳一个人方便,这个卫生间就是竞争条件(Race Condition)。$ T" Q2 i" A6 B% g: h, C3 ^
( U) S% Z. G9 W" n; z  j, {
        当一个人进去后就在门口牌子上标识为“有人”,这个就相当于是线程的加锁,告诉其它同时间想要上厕所的人,这个资源已被我占位,其他人就需要等待,这叫wait。
* m2 s+ @7 j: }4 y7 k6 q8 c5 A6 N1 O% g
科普贴——什么是并发? Untitled-1.png

4 K1 B1 H7 C4 v2 [% ~0 @0 h7 p        只有当前面的人出来后,并把牌子置为“无人”时,其它人才有机会使用。当只有一个蹲位时,一次只能进一个人,翻动一块牌子加一把锁,这个就叫互斥锁(Mutex)。
( D! N  f+ d: B% U' ?! y: j" W% J0 c! Q' j
        如果卫生间里有多个蹲位,再简单地用一块牌子来标识就不行了,需要做一个电子公告牌,进去一个人电子公告牌就把可用数量减1,出来一个人数量加1,- v( V8 u! V" h

: [5 C) [1 g* t- e        数量不为0时,有人来直接进去就行了不用等待,这个叫信号量(Semaphores)。
* D* }( @5 g- T/ d
5 r4 @4 V! N$ E% R; {3 \0 u        如果出来的人是随机通知等待的某一个人,这叫notify,如果他是对着所有等待的人喊一嗓子,就是notifyAll。2 z1 e* q1 x* K' V6 j
0 n+ J. t( |& o( a
        如果使用notify,有些倒霉的家伙可能永远也不会被通知到,这太不人性了,而如果使用nofityAll就意味着所有等待的人需要竞争资源,还是会在倒霉蛋永远轮不到。5 @# X9 \" Y: i5 G! W' E
5 A3 S4 _5 _' F% c
        解决的办法一是按时间顺序先到先得,顺序进入,火车站的厕所经常会看到这种情况,总是有机会轮到自己,这叫公平锁(FairLock)。' D2 z) {, b4 Z, s
% ~4 `- G! s0 Q" s+ p
        还有一种情况,就是大老板也在排队,一般情况下大老板时间宝贵,可以优先考虑让他先上,这叫线程优先级,一共有10个级别。
) o4 V" [* K; [- x" s4 n! M2 c
3 j4 v+ f" J* F! ?; J* _4 _        优先级只能保证级别高的优先被调度到,但不能保证一定会被调度到。
3 H. b$ d( L* F7 |. T! W) X! k3 Y& V" i8 c6 [5 o8 s" ?* @
        两个好基友一起在蹲坑,只有一卷手纸,一个人去取时另一个就不能同时去取,这叫基于共享内存的线程间通信。
9 \. H9 ^4 r/ [4 u4 z5 S& F
7 ]1 `, @$ G6 k        或者:两个人都是烟鬼,但只带了一个打火机,一个人用完之后递给另外一个人.) v* @0 R2 ], h# t! v0 l+ F) d7 D

2 j. _- H9 K% S8 o6 C2 k        进程和线程的区别:一个办公区有多个卫生间,每个卫生间的资源是独立的,不会相互依赖,相当于是进程。
! g1 w9 e4 A/ `! s& k( t3 G. c. E2 q3 z' ]6 z" G6 F
        每个卫生间有多个蹲位,每个蹲位相当于是一个线程,蹲位越多并发处理能力越强。但多个同一个卫生间的多个蹲位共用一个洗手台,如果蹲位过多,洗手台的资源会成为瓶颈。
$ g9 M7 N: F1 A6 i/ N4 X6 y/ N9 y
#f192:
1 ]( ~: R( q2 c2 O: c1 M
        一本正经
" b3 \) [1 D) T+ f6 E- m+ j& F' h5 V3 s, r) K5 U
        
; A# r, C: A* R* z4 O9 K0 j
       并发是指一次处理多件事。& F: @& f' N! @: O3 ^
        并行是指一次做多件事。
; F- L% `# p" r2 P& ]; U        二者不同,但是有联系。7 q- C9 a- z2 C1 o
        一个关于结构,一个关于执行。, U6 F; F  e/ }; X4 q
        并发用于制定方案,用来解决可能(但未必)并行的问题。* I6 A, _  I/ A$ g9 Z

1 N0 O1 G8 M+ c, H; x5 C4 m+ d                 ——— Rob Pike Go语言的创造者之

4 y* h8 e( X9 q       真正的并行需要多个核心。现代的笔记本电脑有4个CPU核心,但是通常不经意间就有超过100个进程同时运行。% o% c0 y9 {7 B9 ?
2 Q9 H* x, R1 q2 A
        因此,实际上大多数过程都是并发处理的,而不是并行处理。' v" ?- L" z, ?3 J: m
) E, D, [% S, N( P) }
        计算机始终运行着100多个进程,确保每个进程都有机会取得进展,不过CPU本身同时做的事情不能超过四件。  F# A: J9 |, E8 b

3 {# u. I$ z" }! }5 G: w4 b- u        十年前使用的设备也能并发处理100个进程,不过都在同一个核心里。
) D6 j7 K& `* M$ c
8 `3 J) W3 ~" ]" L, x9 U
上一篇
下一篇


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

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

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

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

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

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

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

本版积分规则

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

GMT+8, 2021-2-26 15:17 , Processed in 0.033770 second(s), 22 queries , Redis On.

© 2015-2020 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表