美文网首页
golang csp 模型

golang csp 模型

作者: perryn | 来源:发表于2018-03-01 16:31 被阅读187次

Golang Scheduler

调度器由三方面实体构成:

  1. M:物理线程,类似于 POSIX 的标准线程;
  2. G:goroutine,它拥有自己的栈、指令指针和维护其他调度相关的信息;
  3. P:代表调度上下文,可将其视为一个局部调度器,使Golang代码跑在一个线程上

三者对应关系:

go-scheduler-in-motion

上图有2个 物理线程 M,每一个 M 都拥有一个上下文(P),每一个也都有一个正在运行的goroutine(G)。

P 的数量可由 runtime.GOMAXPROCS() 进行设置,它代表了真正的并发能力,即可有多少个 goroutine 同时运行。

调度器为什么要维护多个上下文P 呢?因为当一个物理线程 M 被阻塞时,P 可以转而投奔另一个OS线程 M(即 P 带着 G 连茎拔起,去另一个 M 节点下运行)。这是 Golang调度器厉害的地方,也是高并发能力的保障。

package main

import (
    "fmt"
)

/*
 CSP 描述这样一种并发模型:多个Process 使用一个 Channel 进行通信,  这个 Channel 连结的 Process 通常是匿名的,消息传递通常是同步的

*/
/*
 无缓冲的chan,在一个goroutine读写会导致死锁
*/
func unbuffer_chan() {
    ch := make(chan int)
    ch <- 100
    fmt.Printf("recieve data :%d\n", <-ch)
}

/*
有缓冲的chan,在一个goroutine中读写不会导致死锁
*/
func buffer_chan() {
    ch := make(chan int, 1)
    ch <- 100
    fmt.Println(<-ch)
}

/*
main 就是一个goroutine
*/
func main() {
    buffer_chan()
}

相关文章

  • golang

    golang携程调度,runtime包 golang内存模型 csp原理 context的原理 slice底层结构...

  • golang csp 模型

    Golang Scheduler 调度器由三方面实体构成: M:物理线程,类似于 POSIX 的标准线程; G:g...

  • Golang CSP并发模型

    go语言的并发机制以及它所使用的CSP并发模型 CSP并发模型CSP模型是上个世纪七十年代提出的,用于描述两个独立...

  • Golang CSP并发模型

    今天介绍一下 go语言的并发机制以及它所使用的CSP并发模型 CSP并发模型 CSP模型是上个世纪七十年代提出的,...

  • 2018-05-03

    待看知识点:1.pig2.golang携程调度3.golang内存模型4.csp解释5.context的原理6.s...

  • Golang CSP模型基础库

    Go语言的哲学思想之一为:Do not communicate by sharing memory; instea...

  • golang知识树

    1.golang的gmpgmpgoroutine、machine、processor2.golang的CSP理论如...

  • Go基础——channel

    CSP 要想理解 channel 要先知道 CSP 模型。CSP 是 Communicating Sequenti...

  • Go 并发实战--管道浅析

    在讲 channel 之前,有必要先提一下 CSP 模型,传统的并发模型主要分为 Actor模型和CSP模型,CS...

  • go并发的那些事

    思考:go为什么那么擅长并发? 答:从设计理解上来讲我觉着golang的CSP并发模型与GMP调度器是基石。你看虽...

网友评论

      本文标题:golang csp 模型

      本文链接:https://www.haomeiwen.com/subject/wbtnxftx.html