并发中的一些概念的介绍
临界区
程序需要独占访问共享资源的部分
死锁
死锁程序是所有并发进程彼此等待的程序。如下例子,启动的两个协程互相等待对方的锁释放。实际上出现死锁有几个必要的条件。
- 相互排斥:并发进程同时拥有资源的独占权。
- 等待条件:并发进程必须同时拥有一个资源,并等待额外的资源。
- 没有抢占:并发进程拥有的资源只能被该进程释放。
- 循环等待:一个并发进程(P1)必须等待一些列其他并发进程(P2),同时P2进程也在等待P1进程。
上述四个条件,只要有一个不满足,就不能造成死锁。
type value struct {
mu sync.Mutex
data int
}
var wg sync.WaitGroup
printSum := func(v1, v2 *value) {
defer wg.Done()
v1.mu.Lock()
defer v1.mu.Unlock()
time.Sleep(2 * time.Second)
v2.mu.Lock()
defer v2.mu.Unlock()
fmt.Printf("sum=%v\n", v1.data+v2.data)
}
var a, b value
wg.Add(2)
go printSum(&a, &b)
go printSum(&b, &a)
wg.Wait()
活锁
活锁是正在主动执行并发操作的程序,但是这些操作无法向前推进程序的状态。(简单的例子,海贼王中,艾斯遇到蜥蜴挡路,谁也不让谁)。
饥饿
饥饿是在任何情况下,并发进程都无法获得执行工作所需的所有资源。
并发与并行的区别
一:
- 并发是指一个处理器同时处理多个任务。
- 并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。
- 并发是逻辑上的同时发生(simultaneous)。
二:
- 并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。
- 并行是物理上的同时发生,从微观还是从宏观来看,二者都是一起执行的。
搜集到的更详细的资料
-
当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状态.这种方式我们称之为并发(Concurrent)。
-
当系统有一个以上CPU时,则线程的操作有可能非并发.当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。
CSP概念介绍
CSP全称:Communication Sequential Processes, 通信顺序进程,),既是个技术名词,也是介绍这种技术的论文的名字。在1978年, Charles Antony Richard Hoare 在Association for Computing Machinery(一般被称作ACM)中发表的论文。