GMP原理和调度
- 1.Golang"调度器"的由来
- 1.1单进程时代不需要调度器
- 1.2多进程/线程时代有了调度器需求
- 1.3协程来提高cpu利用率
1.Golang"调度器"的由来
1.1单进程时代不需要调度器
- 早期的操作系统每个程序就是一个进程,直到一个程序运行完毕,才能进行下一个进程,就是"单进程时代",一切的程序只能串行发生
- 早期的单进程操作系统,面临2个问题
- 单一的执行流程,计算机只能一个任务一个任务处理
- 进程阻塞所带来的cpu时间浪费
1.2多进程/线程时代有了调度器需求
- 在多线程/进程的操作系统中,就解决了阻塞的问题,因为一个进程阻塞cpu可以立刻切换其他进程中去执行,而且调度cpu的算法可以保证在运行的进程都可以被分配到cpu的运行时间片
- 进程拥有太多的资源,进程的创建、切换、销毁,都会占用很长的时间。
1.3协程来提高cpu利用率
-
多进程、多线程已经提高了系统的并发能力,但是在当今互联网高并发场景下,为每个任务都创建一个线程是不现实的,因为会消耗大量的内存(进程虚拟内存会占用4GB[32位操作系统],而线程也要大约4MB)
-
大量的进程/线程出现了新的问题
- 高内存占用
- 调度的高消耗CPU
-
一个“用户态线程”必须要绑定一个“内核态线程”,但是CPU并不知道有“用户态线程”的存在,它只知道它运行的是一个“内核态线程”(Linux的PCB进程控制模块)