我在一台带有两个处理器的机器上运行一个程序,当我做一个fork时,将子项创建为本机线程,或者它就像一个绿色线程/协同程序.孩子与父母同时运行还是只是平行?
解决方法
fork()的工作原理通常是生成一个新的独立进程,复制页表,并在该进程中将调用fork()的进程所拥有的所有页面标记为copy-on-write.然后,fork()在两个进程中返回(返回值让相应的进程知道它是哪一个).
在具有多个处理器(或处理器核心)的系统上,您通常可以(假设您确实拥有支持SMP的系统,cpu亲和力并不会阻止它)期望这两个进程使用两个处理器,但您并不严格保证.
线程在某些系统(例如Linux)上以相同的方式生成,除了第一个进程拥有的页面没有标记为copy-on-write,而是之后由两个进程拥有(它们使用相同的页表) .在其他系统上,线程可以以不同方式实现,例如,在用户土地上,在这种情况下,你不会受益于带有线程的多个cpu.
作为旁注,使用fork()和运行2个进程而不是线程的缺点是进程不共享公共地址空间,这意味着必须在上下文切换上刷新TLB.