知识卡片
Channel三部分
内容
channel 底层包含环形缓冲区、发送等待队列和接收等待队列。无缓冲通道强调同步交接,有缓冲通道允许有限排队;容量就是背压协议的一部分。
参考来源
- 位置:《Go语言底层原理剖析》第16章《通道与协程间通信》16.4.1节《通道结构与环形队列》
- 结论依据:原文明确"通道在运行时是一个特殊的hchan结构体:hchan结构体存储了数据列表、等待读取的协程列表、等待发送的协程列表等",并说明"对于有缓存的通道,存储在buf中的数据虽然是线性的数组,但是用数组和序号recvx、recvq模拟了一个环形队列",因此可以推出"channel 底层由环形缓冲区、发送等待队列、接收等待队列三部分构成"的结论。
- 原始内容:通道在运行时是一个特殊的hchan结构体:hchan结构体存储了数据列表、等待读取的协程列表、等待发送的协程列表等……对于有缓存的通道,存储在buf中的数据虽然是线性的数组,但是用数组和序号recvx、recvq模拟了一个环形队列,recvx可以找到从buf哪个位置获取通道中的元素,而sendx能够找到写入时放入buf的位置。