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 ...我爱围棋。