zoukankan      html  css  js  c++  java
  • golang 并发问题


    如何使用channel实现定时器?
    使用channel的阻塞,里面放一个sleep就可以了

    Go语言——goroutine并发模型:

    视频地址:
    https://www.bilibili.com/video/BV1ji4y1M7a8?p=10

    相关文章:
    https://studygolang.com/articles/9610
    https://www.jianshu.com/p/f9024e250ac6

    操作系统对物理级别的调度效率很低下,所以go要自己写一个调度器,目的是让go的并发效率更高.

    go的用的是多对多的调度模型.多个用户线程(就是go里的协程),多个逻辑协程同时挂载到多个物理线程上面.
    M:N M表示的是协程数(逻辑态的),N表示的是线程数(物理态的)

    Go的调度器使用了三种结构:M,P,G
    M代表内核线程
    P代表操作系统的处理器,比如说是四核双线程,8个逻辑处理器,每个处理器代表一个上下文(即这里的P).这个处理器的下面挂的所有的协程可以共享它的cpu和内存.
    G代表协程.


    一个物理态的线程(M)跑在一个cpu内核(P)的上面(cpu即称为上下文)
    一个M下面最多可以挂256个协程(G)(1.10版本的编译器)


    c和java是千级的物理态的线行并发,可以调用1024个进程(M)
    go号称有百万级并发,所以可以调用一百万个协程(G) ,10的6次方
    G0如果叫了GC垃圾回收,垃圾要保证同步的,不能并发的,操作系统就会把G0的这条进线M给锁起来了,这个M就会带着这个G0,去垃圾回收了,它下面的p就会带着它下面的局部队列里所有的协程(G)挂到别的空闲的进程(M)上去执行,如果G0的垃圾回收完后,操作系统就会给这个G0找一个别的P下的队上去,如果全满了,就挂到全局的队列上.如果某个p下的局部队列执行完了,就会去全局队列里取协程G回来执行.所有的p再执行时,也会定时去检查全局队列上有没有协程(G),有的话就拿回来挂到自己的队列上执行

  • 相关阅读:
    C#练习代码
    docker部署gitlab
    vim 缩进设置
    css 初步学习笔记
    tomcat
    201871010107公海瑜《面向对象程序设计(java)》第一周学习总结 公海瑜
    发现JavaScript真强大
    今天看了一點ant的內容,受益匪浅
    一道趣味問題
    一個挺適合初學者的Ant教程
  • 原文地址:https://www.cnblogs.com/haima/p/13851513.html
Copyright © 2011-2022 走看看