1. 协程与线程
Q: 协程、进程、线程的区别?
进程(Process)
- 每个进程有独立的内存空间,属于"重量级"
- 上下文切换(栈、寄存器、虚拟内存、文件句柄等)开销较大
- 相对稳定、安全
线程(Thread)
- 线程是进程中的一个执行单元,线程间主要通过共享内存通信
- 上下文切换快、资源占用相对较小
- 但相比进程稳定性差,更容易出现数据丢失等问题
协程(Coroutine)
- 协程是用户态的轻量级线程,拥有自己的寄存器上下文和栈
- 协程调度切换时,将寄存器上下文和栈保存到别处,切回来时再恢复之前保存的上下文和栈
- 直接操作栈,几乎没有内核切换开销,可以无锁访问全局变量,上下文切换非常快
Q: 协程和线程的详细对比?
| 对比项 | 线程 | Goroutine |
|---|---|---|
| 创建开销 | MB 级栈 | 初始 2KB,动态增长 |
| 切换开销 | 内核态切换,微秒级 | 用户态切换,纳秒级 |
| 数量 | 千级别 | 百万级别 |
| 调度 | OS 调度 | Go Runtime 调度 |
Q: Go语言的优点?
- 并发优化:Golang 针对并发进行了优化,支持协程,并且实现了高效的GMP调度模型
- 高效GC:有高效的垃圾回收机制,支持并行垃圾回收,垃圾回收效率比 Java 或 Python 更高