最近困扰我的是小小的分别,总会带来一丝寂寞。短暂的相遇和分别那一分一秒的时间都让我想要无比珍惜。 收藏本站
登陆 / 注册 搜索

阅读: 9.2K   回复: 3

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

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

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

主题破百
        办公室只有一个卫生间,一次只能容纳一个人方便,这个卫生间就是竞争条件(Race Condition)。% }7 ~, |: C4 n, ^* Q# K2 I
! A4 S/ W1 U" y% o$ S$ L* P7 G
        当一个人进去后就在门口牌子上标识为“有人”,这个就相当于是线程的加锁,告诉其它同时间想要上厕所的人,这个资源已被我占位,其他人就需要等待,这叫wait。
/ u6 \$ o! [# b  W' S0 f+ s
* j* ?, ^6 U$ s" ^3 V, ^
科普贴——什么是并发? Untitled-1.png
3 Y9 g) v6 s+ S' N- G3 g
        只有当前面的人出来后,并把牌子置为“无人”时,其它人才有机会使用。当只有一个蹲位时,一次只能进一个人,翻动一块牌子加一把锁,这个就叫互斥锁(Mutex)。
2 i5 h% O2 B7 F; [7 Q- S& L& c) {% d+ D# `
        如果卫生间里有多个蹲位,再简单地用一块牌子来标识就不行了,需要做一个电子公告牌,进去一个人电子公告牌就把可用数量减1,出来一个人数量加1,2 X; U2 E! u: Z& o$ a- ^0 w# v
9 z# x0 o* G/ {7 o/ Y
        数量不为0时,有人来直接进去就行了不用等待,这个叫信号量(Semaphores)。. R! J8 [) V; \' C' G7 i6 ~3 q
4 ^! K$ K3 Y  ~% c1 v) \
        如果出来的人是随机通知等待的某一个人,这叫notify,如果他是对着所有等待的人喊一嗓子,就是notifyAll。3 l: m. _+ q  @7 D! k! R1 O
( ?/ Q6 q/ R6 o- X0 x
        如果使用notify,有些倒霉的家伙可能永远也不会被通知到,这太不人性了,而如果使用nofityAll就意味着所有等待的人需要竞争资源,还是会在倒霉蛋永远轮不到。5 S' A; v& l( w

+ _0 q" U2 f4 R' c6 w        解决的办法一是按时间顺序先到先得,顺序进入,火车站的厕所经常会看到这种情况,总是有机会轮到自己,这叫公平锁(FairLock)。
5 E6 ~4 T) h  U4 k5 c5 y  P- {$ Q. p9 R  J
        还有一种情况,就是大老板也在排队,一般情况下大老板时间宝贵,可以优先考虑让他先上,这叫线程优先级,一共有10个级别。# W+ N  C9 |  H
2 P1 t2 c9 O9 M# ?
        优先级只能保证级别高的优先被调度到,但不能保证一定会被调度到。
: g0 m1 R2 Z7 w- W1 {7 d0 X
$ ^9 y! V; k* N) b        两个好基友一起在蹲坑,只有一卷手纸,一个人去取时另一个就不能同时去取,这叫基于共享内存的线程间通信。
7 q: j- V5 P$ j" u4 H2 p
1 T0 H8 z& d9 ^0 L% w* g! H        或者:两个人都是烟鬼,但只带了一个打火机,一个人用完之后递给另外一个人.- I. P( s6 b( v! t4 Y7 ]

: c; n' _+ \) G- t2 o; K        进程和线程的区别:一个办公区有多个卫生间,每个卫生间的资源是独立的,不会相互依赖,相当于是进程。
: d' _9 H" D9 B3 W: Z- y6 V$ u! n/ @/ |/ O* [4 _9 q5 K# y: Q- D# t! d# W
        每个卫生间有多个蹲位,每个蹲位相当于是一个线程,蹲位越多并发处理能力越强。但多个同一个卫生间的多个蹲位共用一个洗手台,如果蹲位过多,洗手台的资源会成为瓶颈。# j6 F8 P* F& L8 X% _. A

7 e! _8 N% E  f' r" @
#f192:

! ~8 s. q7 O5 V$ I) ?        一本正经! p) v6 p/ P% @* l5 u/ `

% a  N* Z/ H; v. V: ~% o        2 k5 P3 w, x! l, M& z
       并发是指一次处理多件事。
# N% U! F3 E- Y. ]        并行是指一次做多件事。& v" T4 n8 a9 h
        二者不同,但是有联系。
2 F8 C  Y+ q3 u; j' c3 z        一个关于结构,一个关于执行。( |5 r5 ~& L0 t
        并发用于制定方案,用来解决可能(但未必)并行的问题。
- g! C/ R0 d$ @2 e; U2 n% @/ s
6 W5 c  }* \6 s+ i                 ——— Rob Pike Go语言的创造者之

; l+ f0 C2 D0 @& Y       真正的并行需要多个核心。现代的笔记本电脑有4个CPU核心,但是通常不经意间就有超过100个进程同时运行。5 H7 w3 M% ^5 b8 w

+ f8 j( }% k8 i        因此,实际上大多数过程都是并发处理的,而不是并行处理。
% h' @* F3 a# ~8 d) n
- o8 B( q5 }& `0 I% ^        计算机始终运行着100多个进程,确保每个进程都有机会取得进展,不过CPU本身同时做的事情不能超过四件。3 X% G! w3 n8 M$ N% k! C
4 }0 [, F$ ~# ^! m( \% z: c; b) {
        十年前使用的设备也能并发处理100个进程,不过都在同一个核心里。% [0 R% m$ ^  A) O# A" ]5 H* D2 w
$ q& w9 C7 D9 w% \: B


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

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

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

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

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

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

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

本版积分规则

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

GMT+8, 2020-10-31 18:56 , Processed in 0.041079 second(s), 21 queries , Redis On.

© 2015-2020 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表