刁蛮少女贵千金,比武招亲动芳心。盼能与君长相依,结伴江湖侠侣行。 收藏本站
登陆 / 注册 搜索

阅读: 10.9K   回复: 3

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

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

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

主题破百
        办公室只有一个卫生间,一次只能容纳一个人方便,这个卫生间就是竞争条件(Race Condition)。
; R& l; Z+ d) ^" n' g& y# G4 W+ v2 K: I) y0 F: l5 J" c
        当一个人进去后就在门口牌子上标识为“有人”,这个就相当于是线程的加锁,告诉其它同时间想要上厕所的人,这个资源已被我占位,其他人就需要等待,这叫wait。& Z, E3 p2 K( j

1 q; p) v! ]$ P7 i( q
科普贴——什么是并发? Untitled-1.png
. z' ^) C2 D2 B; y1 R, v
        只有当前面的人出来后,并把牌子置为“无人”时,其它人才有机会使用。当只有一个蹲位时,一次只能进一个人,翻动一块牌子加一把锁,这个就叫互斥锁(Mutex)。
& G# q& I. y& E1 L2 P* F4 m! M9 u' \4 C4 i
        如果卫生间里有多个蹲位,再简单地用一块牌子来标识就不行了,需要做一个电子公告牌,进去一个人电子公告牌就把可用数量减1,出来一个人数量加1,
6 n6 I" }; W8 p0 {7 r4 n
  y$ G" H; ]7 L0 Q- l: r- B$ G' R8 y$ r0 v        数量不为0时,有人来直接进去就行了不用等待,这个叫信号量(Semaphores)。
1 E# M+ \& |# t5 G( T+ J; U: O0 q: ?/ l0 B, N0 E
        如果出来的人是随机通知等待的某一个人,这叫notify,如果他是对着所有等待的人喊一嗓子,就是notifyAll。
7 o. G- h0 {( p, j7 P9 r
$ l' h' P  h! W9 A# [+ E4 `        如果使用notify,有些倒霉的家伙可能永远也不会被通知到,这太不人性了,而如果使用nofityAll就意味着所有等待的人需要竞争资源,还是会在倒霉蛋永远轮不到。
1 \; x6 R* z: C/ B; V8 G0 @& {0 A5 i+ J7 B; U% }. f( N( }
        解决的办法一是按时间顺序先到先得,顺序进入,火车站的厕所经常会看到这种情况,总是有机会轮到自己,这叫公平锁(FairLock)。9 {( ?2 [6 }6 D0 G9 {
, X0 D9 v  _! x, L. t4 Y$ N, e
        还有一种情况,就是大老板也在排队,一般情况下大老板时间宝贵,可以优先考虑让他先上,这叫线程优先级,一共有10个级别。8 `( c2 X# K% W& c" ?
3 X1 ~6 U. a% T2 z3 t/ `
        优先级只能保证级别高的优先被调度到,但不能保证一定会被调度到。/ I& R' f2 V( |3 g

# z# K/ k" P$ |& M, L; ^        两个好基友一起在蹲坑,只有一卷手纸,一个人去取时另一个就不能同时去取,这叫基于共享内存的线程间通信。
5 }' M2 {1 @" r: v" ]8 m: T- [# t) k# x
9 D+ @) L+ z: j9 u# w5 k* U6 R' r        或者:两个人都是烟鬼,但只带了一个打火机,一个人用完之后递给另外一个人.
3 u: Q# `+ i7 C4 g8 j1 E* ]
2 j( ~8 P: x# L! m2 o        进程和线程的区别:一个办公区有多个卫生间,每个卫生间的资源是独立的,不会相互依赖,相当于是进程。
" U4 H4 E. n# `4 _' X7 D( w5 ]' W# T
        每个卫生间有多个蹲位,每个蹲位相当于是一个线程,蹲位越多并发处理能力越强。但多个同一个卫生间的多个蹲位共用一个洗手台,如果蹲位过多,洗手台的资源会成为瓶颈。
  P( g+ v" O" A9 ?, u, |
( u# c2 S, M2 o
#f192:
9 }" l. C& J" t7 G) A  R
        一本正经
" m! E! V+ @3 u1 H: {3 `. d' i# W; O# g4 L4 J
        9 N8 W% a  w' s0 i. E
       并发是指一次处理多件事。
- q- Y! g' b6 p4 p" b- ~) _- s2 k        并行是指一次做多件事。
; U$ A  F' F( s, u        二者不同,但是有联系。# \/ `! D/ \4 B; C
        一个关于结构,一个关于执行。, x( {& T9 }" B, |
        并发用于制定方案,用来解决可能(但未必)并行的问题。/ L' [6 |# i( g3 ^# V% h% M4 G
2 Z# [: N4 Y8 ^5 g6 |
                 ——— Rob Pike Go语言的创造者之

. u; {  ^7 J9 y/ R4 n7 |- u: }  ?       真正的并行需要多个核心。现代的笔记本电脑有4个CPU核心,但是通常不经意间就有超过100个进程同时运行。
, P9 V4 Q* d. I- L3 w
9 C' W, t! x& C' Q0 a        因此,实际上大多数过程都是并发处理的,而不是并行处理。
# o- {( D8 x7 I! [+ l' X0 ?
$ Y4 U- _+ z% n) f0 H8 Z; u        计算机始终运行着100多个进程,确保每个进程都有机会取得进展,不过CPU本身同时做的事情不能超过四件。( i$ W) B2 O0 t# z- O( `# U
2 ]  X" j6 l6 \9 i* I" I7 r
        十年前使用的设备也能并发处理100个进程,不过都在同一个核心里。9 w1 A4 g2 Z3 k+ @) y& `

9 u+ |6 T, n; G" K2 V& ]
上一篇
下一篇


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

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

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

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

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

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

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

本版积分规则

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

GMT+8, 2021-7-25 02:08 , Processed in 0.022323 second(s), 21 queries , Redis On.

© 2015-2021 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表