想要试着去相互接近,但最后还是无法敞开心扉,结果就是擦肩而过⋯⋯ 收藏本站
登陆 / 注册 搜索

阅读: 11.5K   回复: 3

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

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

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

主题破百
        办公室只有一个卫生间,一次只能容纳一个人方便,这个卫生间就是竞争条件(Race Condition)。
8 ~( a# v1 ~3 I. z" r
+ Y# u# t- Q( z! r8 m8 |        当一个人进去后就在门口牌子上标识为“有人”,这个就相当于是线程的加锁,告诉其它同时间想要上厕所的人,这个资源已被我占位,其他人就需要等待,这叫wait。" A9 a5 e# z4 v& J5 G
' Y# m2 \" e9 V% J/ I6 [1 B
科普贴——什么是并发? Untitled-1.png

; u* U5 J+ ^) m0 z+ R( g( F" f        只有当前面的人出来后,并把牌子置为“无人”时,其它人才有机会使用。当只有一个蹲位时,一次只能进一个人,翻动一块牌子加一把锁,这个就叫互斥锁(Mutex)。
1 _. V0 u& b9 o/ N8 f* V$ {6 D+ d! H! O" ?! c8 r
        如果卫生间里有多个蹲位,再简单地用一块牌子来标识就不行了,需要做一个电子公告牌,进去一个人电子公告牌就把可用数量减1,出来一个人数量加1,+ g2 I8 `2 c" C1 g
" F; X% c9 V2 i* l% L$ w
        数量不为0时,有人来直接进去就行了不用等待,这个叫信号量(Semaphores)。0 C" _$ C  z) [$ l' L# g' Y! i

7 r: b; J8 t" @4 S        如果出来的人是随机通知等待的某一个人,这叫notify,如果他是对着所有等待的人喊一嗓子,就是notifyAll。4 \$ w% @0 O. M) y
, J' f" W/ P  O# L8 J5 U; [0 z( J
        如果使用notify,有些倒霉的家伙可能永远也不会被通知到,这太不人性了,而如果使用nofityAll就意味着所有等待的人需要竞争资源,还是会在倒霉蛋永远轮不到。
/ J8 D' M. ?" P7 x8 r' q* s1 A9 v. W$ p8 h- j  G/ p% Z
        解决的办法一是按时间顺序先到先得,顺序进入,火车站的厕所经常会看到这种情况,总是有机会轮到自己,这叫公平锁(FairLock)。
1 R! l8 J) O6 t; m1 \7 N$ J, C
! e3 x- K: K0 h" o: ]        还有一种情况,就是大老板也在排队,一般情况下大老板时间宝贵,可以优先考虑让他先上,这叫线程优先级,一共有10个级别。6 p9 i( U, S0 A9 ?
) f- n& l" h2 O- |8 z4 P4 \
        优先级只能保证级别高的优先被调度到,但不能保证一定会被调度到。4 P! A3 q3 n: R9 |# @8 s  a
. d/ K6 j+ U- l  p
        两个好基友一起在蹲坑,只有一卷手纸,一个人去取时另一个就不能同时去取,这叫基于共享内存的线程间通信。' c/ E( b% E5 l4 R; W& s0 ?6 K
1 g7 [8 c" ?1 }+ O) r
        或者:两个人都是烟鬼,但只带了一个打火机,一个人用完之后递给另外一个人.
% N- `2 \0 ]3 F; L
8 `0 m& X0 G3 e! N$ z        进程和线程的区别:一个办公区有多个卫生间,每个卫生间的资源是独立的,不会相互依赖,相当于是进程。) n2 B! Y8 e$ o% A1 X& n( k2 v4 v

1 g8 k$ ?) n7 _2 l+ y        每个卫生间有多个蹲位,每个蹲位相当于是一个线程,蹲位越多并发处理能力越强。但多个同一个卫生间的多个蹲位共用一个洗手台,如果蹲位过多,洗手台的资源会成为瓶颈。
" a2 T! j, R  P8 g/ _9 P9 m+ a2 N: Q' X+ ^; F
#f192:

* q9 V" t. A8 z2 ?# F- D  U: T0 {( ?        一本正经
! w) N" _1 n7 a7 s/ T3 j5 E
9 v  i$ K( {. a2 r        2 w# E. D5 M; \4 n6 K6 y* h) a
       并发是指一次处理多件事。  T4 K4 m6 C9 x6 }6 E- [3 J, ]* R
        并行是指一次做多件事。
/ H4 {* f2 ~" U8 r9 q        二者不同,但是有联系。
! F1 E. \4 i0 o) f        一个关于结构,一个关于执行。( Y. d$ A5 x" C" `) g8 r
        并发用于制定方案,用来解决可能(但未必)并行的问题。
# V) W: A+ a( P9 s
0 \! t8 i$ |+ s( f3 J                 ——— Rob Pike Go语言的创造者之

. ]: a1 @" j: u- `8 S. X" c1 L       真正的并行需要多个核心。现代的笔记本电脑有4个CPU核心,但是通常不经意间就有超过100个进程同时运行。3 |* @/ z; R, G+ H; c5 ~) @9 y% R
8 h% w9 s+ A" Q
        因此,实际上大多数过程都是并发处理的,而不是并行处理。4 p: w, c; B$ Y3 ~4 Y! j

* V+ o1 {; |' x! [        计算机始终运行着100多个进程,确保每个进程都有机会取得进展,不过CPU本身同时做的事情不能超过四件。
$ {: [+ F& p/ W6 t
& ?& y! `) O* S# G" q% W4 P3 c        十年前使用的设备也能并发处理100个进程,不过都在同一个核心里。
2 y8 Q  [9 z/ S! x" w- @9 W! L1 a9 T3 W/ ]
上一篇
下一篇


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

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

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

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

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

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

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

本版积分规则

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

GMT+8, 2021-10-26 11:05 , Processed in 0.020917 second(s), 19 queries , Redis On.

© 2015-2021 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表