下列哪个网站不属于sns(社交网络),u盘启动盘制作工具,周易网站建设,网站服务器干啥为什么需要协程#xff1f; 协程用来更加精细地利用线程#xff0c;支撑超高的并发的。协程#xff0c;从 runtime 的角度看#xff0c;协程就是一个被调度的 g 结构体。
G 就是协程#xff0c;M 是线程#xff0c;P 是为了优化多线程并发时#xff0c;会抢夺协程队列的… 为什么需要协程 协程用来更加精细地利用线程支撑超高的并发的。协程从 runtime 的角度看协程就是一个被调度的 g 结构体。
G 就是协程M 是线程P 是为了优化多线程并发时会抢夺协程队列的全局锁问题很多资料称为 ”处理器“它是介于 M 与 G 中介的。
会有多个 M 去全局队列获取 G 来执行这个全局是个大锁锁冲突比较严重。
P 作用登场
M 与 G 之间的中介处理器P 持有一些 G使得每次获取 G 的时候不用每次去全局队列获取减少了并发冲突
如果本地 P 队列 和 全局队列也没有 G这时候会有一个窃取可能他会去其他线程持有的G拿来执行。
新建的协程优先将新的协程放入 P 的 runnext插队若 P 本地队列满了放入全局队列。 基于系统调用和主动挂起协程可能无法调度以下解决方案 基于协作的抢占式调度业务主动调用 morestack() 前面执行G的线程是个大任务可能需要执行很久导致其他协程饥饿。 基于信号的抢占式调度强制线程调用 doSigPreempt() 假如一个函数执行某业务很长永远不会调用 runtime.morestack() 怎么办
解决方案基于信号的抢占式调度。就是操作系统中有很多基于信号的底层通信方式如SIGPIPE/SIGURG/SIGHUP 等线程可以注册对应的信号的处理函数可以实现马上跳转某些个方法执行其他业务了。
注册的信号处理函数doSigPreempt,当垃圾回收器向循环线程发起 “抢占信号” 之后陷入在执行业务方法的线程会立即跳到信号抢占方法(doSigPreempt())做重新调度循环。
如果业务方法不调用 runtime.morestack()可利用垃圾回收器的线程发送 SIGURG 信号让这个业务方法强制跳到 信号处理函数 (doSigPreempt() )重新回到 调度循环Schedule这样比较大的协程放在队列里面优先调度饥饿的协程了。