返回介绍

上卷 程序设计

中卷 标准库

下卷 运行时

源码剖析

附录

4.4.1 M

发布于 2024-10-12 19:16:05 字数 2386 浏览 0 评论 0 收藏 0

优先从闲置列表里获取(mget)M,如果失败则考虑新建(newm)。

新建包括:创建 M 对象(allocm),创建系统线程(newosproc)。

每个 M 都有个 M.g0,专门用于执行系统(runtime)命令。和用户栈(G.stack)分离,实现多路复用。

线程启动函数(mstart)最终进入调度循环(schedule)。

仅在出错时终止线程,否则 M 进入(stopm)闲置列表里休眠,等待唤醒(notewakeup)。

工作流程

                           +------+      +--------+-------------------------+
                     +---> | newm | ---> | allocm | new(m), mcommoninit, g0 |
                     |     +------+      +--------+-------------------------+     +--------+--------------+
                     |                   | newm1  | newosproc            ---|---> | mstart | mstart1 (fn) |
                     |                   +--------+-------------------------+     +--------+--------------+
                     |                                                                          |
                     |                                                                          |
  +-------+      +--------+                                                                     |
  | wakep | ---> | startm |                                                                     |
  +-------+      +--------+                                                                     |
                     |                                                                          |
                     |                                                                          |
                     |     +------------+                                                       |
                     +---> | mget       |                                                       |
                           +------------+                                +----------+           |
                           | notewakeup | --------------------//-------> | schedule | <---------+ 
                           +------------+                         ^      +----------+
                                                                  |            |
                                                                  |            |
                                                             +---------+       |
                                                             | gcstopm | <-----+
                                                             +---------+

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文