网站建设技术入股合同,网络公司起名大全免费,免费一键自助建站官网,西安最好的网站建设公司一、线程调度
1、早期单线程操作系统
一切的软件都是跑在操作系统上#xff0c;真正用来干活#xff08;计算#xff09;的是 CPU早期的操作系统每个程序就是一个进程#xff0c;直到一个程序运行完#xff0c;才能进行下一个进程#xff0c;就是“单进程时代”一切的程…一、线程调度
1、早期单线程操作系统
一切的软件都是跑在操作系统上真正用来干活计算的是 CPU早期的操作系统每个程序就是一个进程直到一个程序运行完才能进行下一个进程就是“单进程时代”一切的程序只能串行发生 2、多进程/线程时代
在多进程/多线程的操作系统中就能解决了阻塞的问题因为一个进程阻塞 cpu 可以立刻切换到其他进程中去执行而且调度 cpu 的算法可以保证在运行的进程都可以被分配到 cpu 的运行时间片这样从宏观来看似乎多个进程是在同时被运行但新的问题就又出现了进行拥有太多的资源进程的创建、切换、销毁、都会占用很长的时间CPU 虽然利用起来了但如果进程过多CPU 有很大的一部分都被用来进行进程调度了大量的进程/线程都出现了新的问题 高内存占用调度的高消耗 CPU进程虚拟内存会占用 4GB[32位操作系统]而线程也要大约 4MB 3、Go 协程 goroutine
Go 中协程被称为 goroutine它非常轻量一个 goroutine 只占几 KB并且这几 KB 就足够 goroutine 运行完这就能在有限的内存空间内支持大量 goroutine支持了更多的并发虽然一个 goroutine 的栈只占几 KB但实际是可伸缩的如果需要更多内容runtime 会自动为 goroutine 分配Goroutine 特点 占用内存更小几 KB调度更灵活runtime 调度
4、协程域线程区别
协程跟线程是有区别的线程由 CPU 调度是抢占式的协程由用户调度是协作式的一个协程让出 cpu 后才执行下一个协程 二、调度器 GMP 模型
Ggoroutine协程Mthread内核线程不是用户态线程Pprocesser调度器
1、GM 模型
G协程通常在代码里用 go 关键字执行一个方法那么就等于起了一个 GM内核线程操作系统内核其实看不见 G 和 P只知道自己在执行一个线程G 和 P 都是在用户层上的实现并发量小的时候还好当并发量大了这把大锁就成了性能瓶颈 GMP 由来 基于没有什么是加一个中间层不能解决的思路golang在原有的GM的基础上加入了一个调度器P可以简单理解为是在G和M中间加了个中间层于是就有了现在的GMP模型里的P
2、GMP模型 三、GMP流程分析
我们通过go func()来创建一个goroutine
1、P本地队列获取G
M想要运行G就要先获取P然后从P的本地队列获取G 2、本地队列中G移动到全局队列 新建G时新G会优先加入到P的本地队列如果本地队列满了则会把本地队列中一半的G移动到全局队列 3、从其他P本地队列的G放到自己P队列 如果全局队列为空时M会从其他P的本地队列偷stealing一半G放到自己P的本地队列 4、M从P获取下一个G不断重复
M运行GG执行之后M会从P获取下一个G不断重复下去