我听说Unix fork
会复制当前进程。这是否意味着完全相同的程序和状态将在新的子进程中生成?我不明白为什么它以这种方式工作。因为它看起来效率低下。
答案 0 :(得分:3)
它确实有用 - 有点像。它主要使用“写入时复制”来实现,这意味着大多数内存页面在两个进程之间共享,直到子进程尝试写入页面,此时它才真正被复制。因此,如果一个子进行分叉,然后立即加载并执行一个新的二进制映像,那么您所担心的低效率永远不会发生:来自父级的内存页面的副本永远不会真正创建。
还有其他方法可以制作子流程吗?当然,其他操作系统以不同的方式做事。 UNIX方法实际上是一种非常有效的方法,子进程可以从其父进程继承打开的文件描述符,环境变量和其他系统信息:它实际上导致 less 工作,而不是更!
答案 1 :(得分:2)
fork
在现代操作系统上非常有效。它仅通过Copy on Write技术或类似技术复制所需的页面。
不同的操作系统有不同的方法来产生其他进程。 Linux有一个clone
系统调用(并且fork
基于此),它允许对新进程从其父进程继承的内容进行大量控制。
为什么以这种方式运作,我不知道。它高效,广泛且易于使用和理解(一旦您阅读了手册页并查看了示例)。
答案 2 :(得分:1)
当调用fork()时想到克隆(你有一个图像但等待它们是相同的 - 这是第一个,它是第二个/克隆一个?),在主要的下面会出现一个子线程线程(父/子)。分叉是系统调用,但开销是最小的,除非你跟进调用exec。因此,分叉/执行会使你在unix中花费很多。
fork:子进程采用父进程的属性 - 因此在同一个内存空间中有两个独立的可运行代码段(一个是父级,一个是子级)。要通过调用'exec'来分隔两个后续,现在子代码部分变成一个独立的可运行进程,并且父进程具有父id。如果你只使用fork()那么你必须管理谁是父,谁是孩子的单独代码部分。
exec调用是内核开销的成本,而不是fork。
答案 3 :(得分:1)
这是否意味着在新的子进程中会产生完全相同的程序和状态?
状态不完全相同。有一个小的区别:fork返回值将根据进程是父进程还是子进程而有所不同。当然,pids也会有所不同。
此外,不需要使用fork来启动新进程。当fork证明难以实现时,posix_spawn已被标准化为替代。
http://pubs.opengroup.org/onlinepubs/009695399/functions/posix_spawn.html
答案 4 :(得分:0)
哦,如果你能解释如何在unix中创建init进程或swapper'init',那么你就会理解unix进程创建的概念:fork / exec。美好的事情!