Go语言Channel的底层原理详解

1.简介

Go中有一句经典的名言:“不要通过共享内存的方式来通信,而要通过通信的方式来共享内存。”原因是因为:使用共享内存的方式会造成数据竞争,为了防止数据竞争所以需要加锁,共享内存的方式在高并发场景下的锁竞争激烈,开销大。Go语言的高并发特性依赖于goruntine和channel,采用channel进行通信可以控制并发的数量,可以使得生产者和消费者解耦,提高代码可读性

2. channel的底层结构

channel的底层结构是一个hchan的结构体
底层结构
环形缓存:
go语言的channel采用的是环形缓存,环形缓存的内存空间可以复用,减少了GC的压力。channel的环形缓存由hchan的五个字段构成。
环形缓存
qcout是环形缓存中已经保存数据的多少,dataqsize表示的是最多能缓存多少数据,buf是一个指向环形缓存第一个成员的指针,elemsize和elemtype是缓存数据的大小和类型。
两个队列
channel中含有两个队列分别是:接收队列发送队列
发送和接受队列
close状态值
hchan结构体中close的状态值,1表示channel关闭,0表示channel打开
互斥锁:该互斥锁保证同一个时刻只有一个协程可以操作channel

3.channel的基础用法

func main() {
	// channel的创建
	ch := make(chan int, 2) // 创建一个int类型的含有两个缓存的channel
	ch2 := make(chan int)   // 创建一个int类型的不含有缓存的channel

	// 往channel中添加元素
	i := 10
	ch <- i // 将i加入到ch的管道中,由于存在缓存所以不会阻塞
	// channel中输出元素
	x := <-ch
	fmt.Println(x)
	// 没有缓存的channel在往里面添加元素或者接受元素的时候会发生阻塞
	go func() {
		t := <-ch2 // 会发生阻塞,ch2没有缓存
		fmt.Println("阻塞结束,输出", t)
	}()
	ch2 <- 1 //
}

4.Go的发送数据底层原理

(1)直接发送:在发送数据之前,已经有协程在休眠等待,给channel发送数据不需要放在缓存中,把数据拷贝给一个协程,然后唤醒一个协程。

**(2)放入缓存:**没有协程在等待接收,channel是存在缓存的,将数据放在缓存区中,维护索引。

**(3)休眠等待:**没有等待接收的协程,channel没有缓存区,或者缓存区已经被填满了。协程包装成sudog并且加入到发送队列中,休眠等待。

5.Go的接收数据底层原理

(1)有发送等待的协程,并且没有缓存或者缓存空,从发送等待的协程中接收:先将数据拷贝过来,然后唤醒协程。
(2)有等待的发送的协程,从缓存接收:有等待发送的协程,并且有缓存,从缓存取走数据,将休眠协程的数据放到缓存中,并且唤醒休眠协程。

(3)接收缓存:没有协程在等待发送,从缓存中取走一个数据

(4)阻塞接收:没有协程在等待发送,并且缓存区中没有数据或者没有缓存,则直接阻塞。

6.Go中Channel的应用场景

  1. 解耦生产者和消费者,对协程通信进行解耦,生产者只需要往channel里面发送数据,消费者只需要从channel中获取数据。
  2. 控制并发的数量,可以通过channel来控制并发的规模
  3. 可以做任务的定时任务的超时处理,通常和select一起使用。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言底层原理剖析》这本电子书主要深入探讨了Go语言的底层实现原理和机制。在Go语言快速发展的背后,了解其底层原理对于深入理解和优化代码至关重要。 首先,书中介绍了Go语言的内存管理。Go语言通过垃圾回收的方式自动管理内存,通过分代垃圾回收和并发标记等技术来提高垃圾回收的效率,并保证程序的性能。 其次,书中对Go语言的并发模型进行了详细解析。Go语言以轻量级的协程(goroutine)为基础,通过使用通道(channel)进行通信和同步,实现高效的并发编程。这本书从底层原理的角度深入剖析了协程的调度、通道的实现以及锁和同步原语等内容。 此外,书中对Go语言的编译器和运行时进行了解析。Go语言的编译器采用前端和后端分离的设计,通过词法分析、语法分析、类型检查和优化等步骤将Go源代码翻译成机器码。同时,Go语言的运行时系统提供了垃圾回收、调度器、内存管理等一系列功能,保证了程序的正确性和性能。 最后,本书还深入研究了Go语言的网络编程、文件IO、系统调用以及反射等底层机制。这些底层原理的理解,能够帮助开发者更好地理解和利用Go语言的特性,写出高效可靠的代码。 总之,《Go语言底层原理剖析》这本电子书通过深入剖析Go语言底层原理,为读者提供了深入理解Go语言的机会,有助于开发者更好地应用Go语言进行编程,写出高性能、可靠的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值