GMP并发模型
进程与线程与协程
多个线程属于同一个进程并共享内存空间,线程之间的通讯基于共享的内存进行。
Go语言的调度器使用与CPU数量相等的线程来调度多个Goroutine。
”为什么用Go语言?“
进程、线程存在问题:
- CPU高消耗
- 切换线程上下文需要申请、销毁资源消耗时间高
- 内存高占用
- 线程占用1M以上的内存空间
协程(Goroutine)的优点:
- 占用的内存更小(几kb)
- 初始为2kb,如果栈空间不足则自动扩容
- 调度更灵活(runtime调度)
- Go自己实现的调度器,创建和销毁的消耗非常小,是用户级。
- 抢占式调度(10ms)
- 编译器插入抢占指令,函数调用时检查当前Goroutine是否发起抢占请求