go语言锁有关的前置知识

锁是编程语言中比较常用到的一种技术;通常在并发的情况下,多核多个线程同时修改相同的资源时,为了保护我们的资源不会出现脏数据,会用锁来解决这个问题。

并发情况下,为什么修改相同的资源,会有问题;我们得先弄清楚数据修改的过程是怎样的。

继续阅读“go语言锁有关的前置知识”

golang协程调度

一、线程模型

  • N:1模型,N个用户空间线程在1个内核空间线程上运行。优势是上下文切换非常快但是无法利用多核系统的优点。
  • 1:1模型,1个内核空间线程运行一个用户空间线程。这种充分利用了多核系统的优势但是上下文切换非常慢,因为每一次调度都会在用户态和内核态之间切换。(POSIX线程模型(pthread),Java)
  • M:N模型, 每个用户线程对应多个内核空间线程,同时也可以一个内核空间线程对应多个用户空间线程。Go打算采用这种模型,使用任意个内核模型管理任意个goroutine。这样结合了以上两种模型的优点,但缺点就是调度的复杂性。
继续阅读“golang协程调度”