G 代表一个Goroutine;存储了goroutine的执行stack信息、goroutine状态以及goroutine的任务函数等;另外G对象是可以重用的。
M 代表一个操作系统的线程;M代表着真正的执行计算资源。在绑定有效的p后,进入schedule循环;而schedule循环的机制大致是从各种队列、p的本地队列中获取G,切换到G的执行栈上并执行G的函数,调用goexit做清理工作并回到m,如此反复。M并不保留G状态,这是G可以跨M调度的基础。
P 代表一个逻辑CPU处理器(在golang中这个是一个对cpu的抽象),通过runtime.GOMAXPROCS (numLogicalProcessors)可以控制多少P,但是通常P的数量设置是等于CPU核数(GOMAXPROCS)。P的数量决定了系统内最大可并行的G的数量(前提:系统的物理cpu核数>=P的数量);P的最大作用还是其拥有的各种G对象队列、链表、一些cache和状态。
type m struct { g0 *g // goroutine with scheduling stack... curg *g // current running goroutinecaughtsig guintptr // goroutine running during fatal signalp puintptr // attached p for executing go code (nil if not executing go code)nextp puintptr ... }
struct Sched { Lock; // global sched lock .// must be held to edit G or M queuesG ∗gfree; // available g’ s ( status == Gdead)G ∗ghead; // g’ s waiting to run queueG ∗gtail; // tail of g’ s waiting to run queueint32 gwait; // number of g’s waiting to runint32 gcount; // number of g’s that are aliveint32 grunning; // number of g’s running on cpu// or in syscallM ∗mhead; // m’s waiting for workint32 mwait; // number of m’s waiting for workint32 mcount; // number of m’s that have been created… };
题目解析给定 n 个人和 n 种书籍,每个人都有一个包含自己喜好的书籍列表。目标是计算出满足以下条件的分配方案数量:1. 每个人都必须获得他们喜欢的书籍;2. 每本书只能分配给一个人。通过使用深度优先搜索算法,可以系统地探索所有可能的分配组合,确保每个分配方案都符合上述条件。该方法能够有效地处理这类组合优化问题,找到所有可行的解。 ...
[详细]