
获得徽章 0
- ### 1. Goroutine
- **定义**:Goroutine 是 Go 中轻量级的线程,可以并发地运行函数。每个 Goroutine 的栈大小初始为 2 KB,可以根据需要动态扩展。
- **创建**:通过 `go` 关键字启动 Goroutine,Go 会自动管理它们的生命周期。
### 2. 调度器(Scheduler)
- **角色**:调度器负责在可用的操作系统线程上调度和执行 Goroutine。
- **M:N 模型**:GMP 使用 M:N 模型,将 M 个 Goroutine 映射到 N 个操作系统线程。这意味着多个 Goroutine 可以在单个线程上运行,调度器决定了哪一个 Goroutine 在何时执行。
### 3. 内存管理(M)
- **P(Processor)**:Go 的调度器维护了 P(处理器)概念,每个 P 都代表一个逻辑处理单元。每个 P 维护一个运行队列,存储就绪的 Goroutine。
- **M(Machine)**:M 代表操作系统线程。M 在 P 上运行 Goroutine,Goroutine 在 P 的运行队列中被调度。
### 工作流程
1. **创建 Goroutine**:当创建新的 Goroutine 时,Go 调度器会将其加入当前 P 的运行队列。
2. **调度**:调度器从运行队列中取出 Goroutine,将其分配给空闲的 M 来执行。
3. **Goroutine 切换**:当 Goroutine 阻塞(如等待 I/O 或锁)时,调度器会将其移出 M,并从其他 P 的运行队列中调度其他 Goroutine 进行执行。
### 特性
- **协作式调度**:Goroutine 切换通常是轻量级的,调度器在 Goroutine 阻塞或主动让出控制时进行切换。
- **工作窃取**:调度器实现了工作窃取算法,能够平衡各 P 的负载,确保所有 Goroutine 都能得到执行机会。
### 优势
- **高并发**:通过轻量级的 Goroutine 和高效的调度,Go 能够处理成千上万的并发任务。
- **简单易用**:开发者只需使用 `go` 关键字即可轻松创建 Goroutine,复杂的线程管理和调度由 Go 语言本身负责。展开评论1