今天我的一个朋友告诉我,Go程序可以在多个CPU核上进行自我扩展。听到这个消息后,我感到非常惊讶,因为系统任务调度程序不知道任何有关goroutines的信息,因此无法在多个核上运行它们。
我进行了一些搜索,并发现Go程序可以生成多个OS任务以在不同的核上运行它们(该数量由GOMAXPROCS环境变量控制)。但据我所知,fork进程会导致完全复制进程数据,并且不同的进程运行在不同的地址空间中。
那么,在Go程序中的全局变量怎么办呢?它们在与多个goroutine一起使用时是安全的吗?它们是否会在系统进程之间进行同步?如果确实如此,那么它们是如何实现的呢?我主要关心的是Linux和FreeBSD的实现。
我进行了一些搜索,并发现Go程序可以生成多个OS任务以在不同的核上运行它们(该数量由GOMAXPROCS环境变量控制)。但据我所知,fork进程会导致完全复制进程数据,并且不同的进程运行在不同的地址空间中。
那么,在Go程序中的全局变量怎么办呢?它们在与多个goroutine一起使用时是安全的吗?它们是否会在系统进程之间进行同步?如果确实如此,那么它们是如何实现的呢?我主要关心的是Linux和FreeBSD的实现。
strace
、/proc/<PID>/*
,并在SO中查看更高级的内容以获取更多答案。 - chrk