全部学科
Python全栈
python
NodeJS全栈
nodejs
📝 1 篇文章 20 道配套习题

GO运行时专题

专题说明

本专题深入讲解Go运行时的核心机制,帮助进阶开发者理解GMP调度模型、内存管理、垃圾回收、网络轮询器等底层原理,掌握Go高性能编程的关键知识。

学习目标

  1. 理解GMP调度模型的工作原理与调度策略
  2. 掌握内存管理三层结构(mcache/mcentral/mheap)
  3. 理解三色并发标记清除垃圾回收算法
  4. 掌握网络轮询器(Net Poller)的高效I/O机制
  5. 理解系统调用处理与M状态转换
  6. 掌握接口内部实现结构(iface/eface/itab)

学习内容

  • GMP调度模型:G/M/P关系、调度策略、抢占机制
  • 内存管理:mcache本地缓存、mcentral中央缓存、mheap全局堆
  • 垃圾回收:三色标记、并发标记清除、写屏障、GC触发条件
  • 网络轮询器:epoll/kqueue/IOCP、非阻塞I/O、G挂起与唤醒
  • 系统调用:M状态转换、P handoff机制、sysmon监控
  • 接口实现:eface空接口、iface非空接口、itab结构

学习建议

  1. 运行时是Go的核心,建议结合源码深入理解
  2. 重点理解GMP模型,这是理解Go并发的基础
  3. 了解内存管理层次,有助于优化内存使用
  4. 理解Net Poller原理,掌握高效网络编程
  5. 学习接口内部实现,理解Go类型系统的设计

📝 配套习题(20 题)

💡 参考答案在文末
判断题
1

一个包含nil指针的接口变量不等于nil,因为接口内部包含类型信息,只有类型和数据都为nil时接口才为nil。

A

B

2

一个M必须绑定一个P才能执行G,但一个P可以绑定不同的M(例如原M进入系统调用时)。

A

B

3

span是Go内存管理的基本单元,一个span包含多个相同大小的内存对象,大小由size class决定。

A

B

4

Go的文件I/O(如os.File.Read)使用阻塞系统调用,而网络I/O使用Net Poller实现非阻塞,这是因为文件I/O通常能快速返回数据,而网络I/O可能需要长时间等待。

A

B

单选题
5

Goroutine执行网络I/O操作等待数据时,会进入什么状态?

A

Running(运行中)

B

Waiting(等待中)

C

Dead(已终止)

D

Runnable(可运行)

6

Go运行时的网络轮询器(Net Poller)使用什么技术实现高效的网络I/O?

A

多线程阻塞I/O

B

事件驱动非阻塞I/O(epoll/kqueue/IOCP)

C

协程模型

D

单线程轮询

7

Go运行时内存分配器采用什么层次结构管理内存?

A

单层堆结构

B

mcache → mcentral → mheap三层结构

C

仅使用系统malloc

D

栈和堆分离结构

8

Go的mcache为什么能实现无锁分配?

A

使用全局锁保护

B

每个P独享一个mcache,无需竞争

C

不支持并发分配

D

使用CAS原子操作

9

Go调度器的GMP模型中,P代表什么?

A

Processor(处理器/调度资源)

B

Process(进程)

C

Parallel(并行)

D

Pool(池)

10

Go类型断言v.(T)的内部实现主要检查什么?

A

类型名称是否相同

B

类型hash值是否匹配

C

方法列表是否相同

D

内存大小是否相同

11

当Goroutine执行网络I/O操作(如conn.Read)且数据未就绪时,会发生什么?

A

阻塞OS线程,等待数据

B

Goroutine挂起,OS线程继续执行其他Goroutine

C

返回错误,立即失败

D

创建新OS线程继续等待

12

Go垃圾回收使用什么类型的GC算法?

A

分代GC(Generational GC)

B

引用计数GC

C

并发标记清除GC(Concurrent Mark-Sweep)

D

复制GC

多选题
13

Go内存分配器使用大小类别(size class)来管理内存,以下哪些说法正确?

A

有67种预定义的大小类别

B

最小分配单元是8字节

C

每种大小类别对应一个span

D

对象大小超过32KB直接从mheap分配

14

Go运行时对系统调用的处理策略包括哪些?

A

网络I/O使用Net Poller(非阻塞)

B

文件I/O使用阻塞系统调用

C

系统调用进入时M线程进入Syscall状态

D

长时间系统调用可能导致M线程被抢占

15

Go类型系统具有以下哪些特性?

A

静态类型(编译时检查)

B

结构化类型系统(鸭子类型)

C

接口隐式实现

D

类型安全(无隐式转换)

16

关于P的本地运行队列,以下哪些说法正确?

A

每个P有一个本地G队列,容量256

B

本地队列无锁访问,效率高

C

本地队列空时会从全局队列偷取G

D

本地队列满时G会进入全局队列

填空题
17

Go系统调用处理:M进入 ____________ 状态; ____________ 可能被 ____________ 接管; sysmon 监控 长时间系统调用 ; 文件I/O 使用 阻塞 系统调用; 网络I/O 使用 Net Poller 。

18

Go内存分配三层: ____________ ____________ 每P独享 ____________ ; mcentral 中央缓存 按 大小类别 组织; mheap 全局堆 从 OS 申请大块 内存 。

19

Go Net Poller底层:Linux使用 ____________ ;macOS使用 ____________ ;Windows使用 ____________ 。Goroutine网络I/O时 挂起 而非 阻塞M线程 ; Poller 监控 fd就绪 并 唤醒Goroutine 。

20

Go接口内部: ____________ 包含 ________________________ ; iface 包含 itab 和 data ; itab 包含 接口类型 、 实体类型 和 方法表 。

参考答案
1.正确 2.正确 3.正确 4.正确 5.B 6.B 7.B 8.B 9.A 10.B 11.B 12.C 13.A;B;C;D 14.A;B;C;D 15.A;B;C;D 16.A;B;C;D 17.Syscall;P;其他M 18.mcache;本地缓存;无锁 19.epoll;kqueue;IOCP 20.interface{};_type;data
想在手机上练习这套专题?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一个专题 GO流程控制专题
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码