ea7*_*abe 5

我想到了!全部使用源代码。

我没有意识到有一个Linux系统调用。它称为“克隆”。它比fork更灵活,它允许子进程驻留在其父进程的地址空间中。

这是线程创建过程的简短概述。

newmsrc/runtime/proc.go
// Create a new m. It will start off with a call to fn, or else the scheduler.
// fn needs to be static and not a heap allocated closure.
// May run with m.p==nil, so write barriers are not allowed.
//go:nowritebarrier
func newm(fn func(), _p_ *p) {

    // ... some code skipped ...

    newosproc(mp, unsafe.Pointer(mp.g0.stack.hi))
}
newosprocsrc/runtime/os_linux.go
var (
    // ...

    cloneFlags = _CLONE_VM | /* share memory */
        _CLONE_FS | /* share cwd, etc */
        _CLONE_FILES | /* share fd table */
        _CLONE_SIGHAND | /* share sig handler table */
        _CLONE_THREAD /* revisit - okay for now */
)

// May run with m.p==nil, so write barriers are not allowed.
//go:nowritebarrier
func newosproc(mp *m, stk unsafe.Pointer) {

    // ... some code skipped ...

    ret := clone(cloneFlags, /* ... other flags ... */)

    // ... code skipped
}
clonesrc/runtime/sys_linux_amd64.s

因此,Go程序确实可以在多个OS线程中运行,从而可以跨越多个CPU,但是它们使用一个共享的地址空间。

ew ...我爱围棋。