Lau*_*ein 8 ruby multithreading fork
我在一台带有两个处理器的机器上运行一个程序,当我做一个fork时,孩子被创建为本机线程,或者它就像一个绿色线程/协同程序.孩子与父母同时运行还是只是平行?
一般叉()的工作是生成一个新的,独立的过程中,复制页表,并标注由调用fork()的为写入时复制在这一过程中进程所拥有的所有页面.然后,fork()在两个进程中返回(返回值让相应的进程知道它是哪一个).
在具有多个处理器(或处理器核心)的系统上,您通常可以(假设您确实拥有支持SMP的系统,cpu亲和力不会阻止它)期望这两个进程使用两个处理器,但您并不严格保证.
线程在某些系统(例如Linux)上以相同的方式生成,除了第一个进程拥有的页面没有标记为copy-on-write,而是之后由两个进程拥有(它们使用相同的页表) .在其他系统上,线程可以以不同的方式实现,例如在用户区域中,在这种情况下,您将不会受益于具有线程的多个cpu.
作为边注,使用fork()和运行2个处理代替线程的缺点是工艺不共享一个公共地址空间,这意味着必须TLB上下文切换上被刷新.
这取决于操作系统、编程语言、编译器和运行时库,所以我只能给你一个例子:如果你在Windows下使用_beginthread(无论你直接使用MinGW还是MSCRT),你都会使用你的两个处理器。进一步解释“并发”与“并行”的语义:它们是非排他性的。