少年心意,一如明月松间的青石流水,那些年里看到了,却不懂。 收藏本站
登陆 / 注册 搜索

阅读: 12.2K   回复: 3

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

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

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

主题破百
        办公室只有一个卫生间,一次只能容纳一个人方便,这个卫生间就是竞争条件(Race Condition)。
1 H. G4 r# K, L9 _3 Q9 S+ y" t( |3 ]9 n- ~
        当一个人进去后就在门口牌子上标识为“有人”,这个就相当于是线程的加锁,告诉其它同时间想要上厕所的人,这个资源已被我占位,其他人就需要等待,这叫wait。
! i% A/ t3 ^2 Q( |6 Y+ g0 d  U4 l
+ j0 a- r9 K2 n, G8 b2 }2 ?
科普贴——什么是并发? Untitled-1.png

, U  T7 X& I& d- W- m# ^9 h        只有当前面的人出来后,并把牌子置为“无人”时,其它人才有机会使用。当只有一个蹲位时,一次只能进一个人,翻动一块牌子加一把锁,这个就叫互斥锁(Mutex)。7 v# G6 d1 h" {( U

; q) G$ }/ V% i0 y9 |" I        如果卫生间里有多个蹲位,再简单地用一块牌子来标识就不行了,需要做一个电子公告牌,进去一个人电子公告牌就把可用数量减1,出来一个人数量加1,3 J4 l( r) H% a4 W- |0 v3 W
9 b* \; A- q9 x2 F
        数量不为0时,有人来直接进去就行了不用等待,这个叫信号量(Semaphores)。
* n! z! z  a; W- g2 a  b, `/ [
& @! `0 t9 h* e' ^0 O        如果出来的人是随机通知等待的某一个人,这叫notify,如果他是对着所有等待的人喊一嗓子,就是notifyAll。; ?+ m$ Q, j9 m( [+ ^
0 K! _. {' x! z0 |4 Y9 A: D7 ]6 D
        如果使用notify,有些倒霉的家伙可能永远也不会被通知到,这太不人性了,而如果使用nofityAll就意味着所有等待的人需要竞争资源,还是会在倒霉蛋永远轮不到。/ u# R" m% z3 p

1 i9 Y4 [/ a  E; N+ t3 i        解决的办法一是按时间顺序先到先得,顺序进入,火车站的厕所经常会看到这种情况,总是有机会轮到自己,这叫公平锁(FairLock)。
" [7 Q, [% g6 P* k3 Y' F- m- K0 k, q9 f
        还有一种情况,就是大老板也在排队,一般情况下大老板时间宝贵,可以优先考虑让他先上,这叫线程优先级,一共有10个级别。; h1 \, o1 a0 F; o" T3 w

8 N  u- Q: U2 v  z1 |        优先级只能保证级别高的优先被调度到,但不能保证一定会被调度到。
9 g6 s* I. {& X9 a1 m, q, J6 i" o2 d6 c. Y
        两个好基友一起在蹲坑,只有一卷手纸,一个人去取时另一个就不能同时去取,这叫基于共享内存的线程间通信。& H3 }3 A- k2 h

% c7 d0 n- a! |7 s. F        或者:两个人都是烟鬼,但只带了一个打火机,一个人用完之后递给另外一个人.
1 z$ D( `; R6 p& i
6 S  I  L* x5 R+ m5 d8 a        进程和线程的区别:一个办公区有多个卫生间,每个卫生间的资源是独立的,不会相互依赖,相当于是进程。) \+ W: j5 U+ R. @/ t

2 L* c( E# S) S0 P2 y( H        每个卫生间有多个蹲位,每个蹲位相当于是一个线程,蹲位越多并发处理能力越强。但多个同一个卫生间的多个蹲位共用一个洗手台,如果蹲位过多,洗手台的资源会成为瓶颈。: Q; V, g6 s3 l4 q5 t, ?: g) j
; a2 g  `/ Y; Y- ?; s) i
#f192:
) N( [( W4 D; V  f$ b
        一本正经
2 H8 f. Z6 n, a5 L0 o* W* D$ H! M6 d/ k
        
- o3 N! l6 D7 i4 ^4 a* D9 z1 |
       并发是指一次处理多件事。
1 P% R' k/ V/ x% U$ X% X  z        并行是指一次做多件事。
% h. ?$ N, R0 M7 |! P3 `3 f: ^$ Q        二者不同,但是有联系。
$ Y' {, D& M* j; Q        一个关于结构,一个关于执行。
8 v# @* K, Y! z        并发用于制定方案,用来解决可能(但未必)并行的问题。) M7 X3 M0 }# [$ s
8 ]& p1 H0 J- l% l& k/ Z; ^- Q
                 ——— Rob Pike Go语言的创造者之
+ ]0 g! o; b+ Z" ^  s( m" L
       真正的并行需要多个核心。现代的笔记本电脑有4个CPU核心,但是通常不经意间就有超过100个进程同时运行。  f4 b& @$ _: n) \: Z8 m

: T, z8 X  I! v        因此,实际上大多数过程都是并发处理的,而不是并行处理。" z, `# Q1 i6 F

' @6 ]# ^5 {) q0 ]$ W        计算机始终运行着100多个进程,确保每个进程都有机会取得进展,不过CPU本身同时做的事情不能超过四件。8 b9 C7 Q% H3 m) b

: {  O. f1 h9 y  @0 G/ C" i        十年前使用的设备也能并发处理100个进程,不过都在同一个核心里。
$ [$ ?9 l6 o/ u# T: h: @. z3 i9 Y: r# U/ B
上一篇
下一篇

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

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

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

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

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

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

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

本版积分规则

快速回复 返回列表