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()系统调用将当前进程映像覆盖为新进程映像,但根据您的回答,它会删除旧进程映像并分配新进程映像。能不能请你再告诉我一次?