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