Operating system 工作:理解问题:
我对Operating system 工作:理解问题:,operating-system,system-calls,Operating System,System Calls,我对vWork()的功能感到困惑。我了解到在vWork()的情况下,父进程和子进程用于在它们之间共享页面。它不支持任何写时拷贝功能。这意味着,如果在其时间片子进程期间进行了一些更改,那么当父进程返回时,所有这些更改都将对其可见。还提到,vfork()syscall仅在子进程在创建后执行exec系统调用时才有用 假设子进程使用ls执行exec系统调用。现在,根据exec调用,ls程序将加载到子进程的地址空间。现在,当父进程的时间片将启动时,它可能会在其PC上执行不同的指令,这可能会导致此进程的行为
vWork()
的功能感到困惑。我了解到在vWork()
的情况下,父进程和子进程用于在它们之间共享页面。它不支持任何写时拷贝功能。这意味着,如果在其时间片子进程期间进行了一些更改,那么当父进程返回时,所有这些更改都将对其可见。还提到,vfork()
syscall仅在子进程在创建后执行exec
系统调用时才有用
假设子进程使用ls
执行exec
系统调用。现在,根据exec
调用,ls
程序将加载到子进程的地址空间。现在,当父进程的时间片将启动时,它可能会在其PC上执行不同的指令,这可能会导致此进程的行为不同
有人能告诉我这个场景吗,vfork()
调用在这种情况下有什么帮助?vfork()的要点不是为一个孩子分配一个新的地址空间,而这个孩子马上又会把它扔掉。因此,vWork()
省略了为子级创建新地址空间(页表和分配)的fork()
部分,而是设置了一个标志execve()
解释为,在用新的可执行文件及其请求的初始堆(BSS)填充进程之前,它应该为进程分配一个新的页表和堆栈。vWork()的要点不是为一个子进程分配一个新的地址空间,该子进程将立即再次丢弃它。因此,vWork()
省略了为子级创建新地址空间(页表和分配)的fork()
部分,而是设置了一个标志execve()
解释为,在用新的可执行文件及其请求的初始堆(BSS)填充进程之前,它应该为进程分配新的页表和堆栈。execve()
释放当前进程的内存映射并分配新的内存映射。退出进程也会释放该进程的内存映射
传统上,vWork()
会暂停父进程,直到子进程停止使用父进程的内存映射。唯一安全的方法是通过execve()
或\u exit()
让我们假设,子进程使用
ls。现在,根据exec调用,ls程序将加载到
到子进程的地址空间
实际上,ls
将被加载到一个新的地址空间中,父进程的地址空间在子进程上被释放。execve()
释放当前进程的内存映射并分配新的内存映射。退出进程也会释放该进程的内存映射
传统上,vWork()
会暂停父进程,直到子进程停止使用父进程的内存映射。唯一安全的方法是通过execve()
或\u exit()
让我们假设,子进程使用
ls。现在,根据exec调用,ls程序将加载到
到子进程的地址空间
实际上,
ls
将被加载到一个新的地址空间中,父级的地址空间在子级上被释放。不完全;请注意,这些问题的答案都在较高的层次上,而这个问题需要较低层次的视图。@学习者:我在你的问题中将时间戳替换为时间片-希望这就是你的意思。如果没有,请随时重新编辑;请注意,这些问题的答案都在较高的层次上,而这个问题需要较低层次的视图。@学习者:我在你的问题中将时间戳替换为时间片-希望这就是你的意思。如果没有,请随时重新编辑。感谢您的回复,因此这意味着在vWork()的情况下,“execve”系统调用的行为会有所不同。通常,它会覆盖调用进程的二进制映像,但对于vWork(),它会创建新的地址空间来执行其作业。如果我错了,请纠正我。@Learner:那有点错execve
总是创建一个新的页表、堆栈等。旧的页表、堆栈通常会同时被销毁,但如果它们与另一个进程(父进程)共享,则共享引用将减少。感谢您的回复,这意味着在vWork()的情况下,“execve”系统调用的行为会有所不同。通常,它会覆盖调用进程的二进制映像,但对于vWork(),它会创建新的地址空间来执行其作业。如果我错了,请纠正我。@Learner:那有点错execve
总是创建一个新的页表、堆栈等。旧的页表、堆栈通常会同时被销毁,但如果它们与另一个进程(父进程)共享,它们只会减少该共享引用。感谢您回复我的查询。你的回答让我现在更好地理解了“geekosaur”的回答。但我仍然想问更多关于Exeve系统调用的问题。我读到execve()系统调用将当前进程映像覆盖为新进程映像,但根据您的回答,它会删除旧进程映像并分配新进程映像。你能再给我一次更新吗?谢谢你回复我的问题。你的回答让我现在更好地理解了“geekosaur”的回答。但我仍然想问更多关于Exeve系统调用的问题。我读到execve()系统调用将当前进程映像覆盖为新进程映像,但根据您的回答,它会删除旧进程映像并分配新进程映像。能不能请你再告诉我一次?