Home avatar

主题的晦涩 人生的短暂

深入剖析 Go 语言运行时:IO 轮询器

netpoller 概述

考虑一个基于 goroutine-per-connection 模型的 TCP echo server:

import (
    "fmt"
    "io"
    "log"
    "net"
)

func worker(conn net.Conn) {
    defer conn.Close()
    b := make([]byte, 512)
    for {
        size, err := conn.Read(b)
        if err == io.EOF {
            break
        }
        if err != nil {
            log.Fatal(err)
        }
        size, err = conn.Write(b[0:size])
        if err != nil {
            log.Fatal(err)
        }
    }
}

func main() {
    listner, err := net.Listen("tcp", "127.0.0.1:8080")
    if err != nil {
        log.Fatal(err)
    }
    for {
        conn, err := listner.Accept()
        if err != nil {
            log.Fatal(err)
        }
        go worker(conn)
    }
}

从用户侧看,系统该调用阻塞 goroutine,Go scheduler 调度其他 goroutine。问题在于,goroutine 复用在线程上,如果 IO 系统调用(如read(2)/write(2))阻塞,直接阻塞 goroutine 所在线程,Go scheduler 将没有机会调度 goroutine!

【译】内存屏障:软件黑客的硬件视角

译者序

Memory Barriers: a Hardware View for Software Hackers 是并发编程专家 Paul E. McKenney 的经典论文,该论文同时收录在他的著作 Is Parallel Programming Hard, And, If So, What Can You Do About It? 附录 C Why Memory Barriers? 中。

本文全文翻译该论文。



为什么中了邪的 CPU 设计者要让可怜的一无所知的软件设计者受内存屏障(memory barrier)的伤害?

【译】Go 语言内存模型:2022-06-06 版

译者序

原文 The Go Memory Model 描述 Go 语言内存模型,这里的内存模型实际上是“内存一致性模型”(memory consistency model)。笔者修改了格式错误并翻译全文。

The Go Memory Model 在内存一致性模型层面,描述 Go 语言实现(Go implementation)提供的一致性保证,并进一步指出该保证对 Go 语言实现的限制;在工程实践层面,描述使用同步原语确保 goroutine 间可见性的方法,并进一步指出常见的错误同步手法。

【译】一种面向多核架构的无锁、缓存高效的共享环形缓冲区

译者序

论文 A Lock-Free, Cache-Efficient Shared Ring Buffer for Multi-Core Architectures 介绍了一种专为多核架构设计、用于单生产者/单消费者模型的环形缓冲区,称为 MCRingBuffer。论文性能测试表明,其吞吐量数倍于 Lamport 提出的 BasicRingBuffer

MCRingBuffer 将环形缓存区划分为多个块,块划分为多个槽。

0%