Skip to content

Golang面试题:Channel 特性?

1、介绍一下 Channel

Go语言中,不要通过共享内存来通信,而要通过通信来实现内存共享。Go的 CSP(Communicating Sequential Process)并发模型,中文可以叫做通信顺序进程,是通过 goroutine 和 channel 来实现的。

所以 channel 收发遵循先进先出 FIFO,分为有缓存和无缓存,channel 中大致有 buffer(当缓冲区大小部位0 时, 是个 ring buffer)、sendx 和 recvx 收发的位置(ring buffer 记录实现)、sendq、recvq 当前 channel 因为缓冲区不 足而阻塞的队列、使用双向链表存储、还有一个 mutex 锁控制并发、其他原属等。

2、Go 语言的 Channel 特性?

  1. 给一个 nil channel 发送数据,造成永远阻塞
  2. 从一个 nil channel 接收数据,造成永远阻塞
  3. 给一个已经关闭的 channel 发送数据,引起 panic
  4. 从一个已经关闭的 channel 接收数据,如果缓冲区中为空,则返回一个零值
  5. 无缓冲的 channel 是同步的,而有缓冲的 channel 是非同步的
  6. 关闭一个 nil channel 将会发生 panic

3、并发编程概念是什么?

并行是指两个或者多个事件在同一时刻发生;并发是指两个或多个事件在同一时间间隔发生。

并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。在一台处理器上“同时”处理多个任务,在多台 处理器上同时处理多个任务。如hadoop分布式集群

并发偏重于多个任务交替执行,而多个任务之间有可能还是串行的。而并行是真正意义上的“同时执行”。

并发编程是指在一台处理器上“同时”处理多个任务。并发是在同一实体上的多个事件。多个事件在同一时间间隔发 生。并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。