之所以分析线程模型,主要是想弄明白go的runtime scheduler 优势所在。
go天生支持高并发的原因有两点:
- 占用资源很少的goroutine,更轻量的线程,可以随意创建上百万个;
- 源码包runtime 实现了基于语言层面的运行时goroutine调度(GPM);
进程与线程
在传统的操作系统中,拥有资源和独立调度的基本单位是进程。而在引入线程的操作系统中,线程是独立调度的基本单位, 进程是资源拥有的基本单位。
一个程序至少有一个进程,一个进程至少有一个线程。进程拥有独立的内存单元,旗下多线程共享该进程内存单元。线程的执行依赖于其所属进程。
从逻辑角度看,线程的意义在于,在一个程序中 多个线程可以并发执行不同逻辑单元 工程代码。操作系统并没有把多个线程看作独立的存在。
- 进程(process) 是具有一定独立功能的程序关于某个数据集合上的一次运行活动。它是系统进行资源分配和调度的一个独立单元。
进程有独立的地址空间,进程奔溃不会影响到其他进程。
- 线程
轻量级进程, 是cpu调度和分派的基本单位。它本身不拥有系统资源 但共享所属进程资源,且只有程序运行时必要的程序计数器 寄存器和栈。
一个线程包含以下内容:
一个指向当前被执行指令的指令指针;
一个栈;
一个寄存器值的集合,定义了正在执行线程的数据集合;
一个私有的数据区;