如何在Linux中创建进程?

如何在Linux中创建进程?

我是一名研究生,正在进行涉及 Linux 的实验,为此我需要创建进程。我知道如何通过fork()系统调用创建它们,但我想知道是否有另一种方法来制作它们,而无需克隆调用它的进程?

答案1

创建新进程时,父进程必须负责新进程消耗的任何资源,直到它实际上成为一个独立的进程。处理这个问题可能比处理fork()行为更复杂,但正如@炸鱼薯条德里克在评论中所说,有一个clone()系统调用可以让您对线程/进程创建的细节有更多的控制。

系统fork()调用实际上通过使用写时复制内存管理来尽可能避免复制内存。执行时fork(),新进程及其父进程最初将访问相同的内存(最初实际上仅复制父进程的页表),但该内存被处理器的内存管理单元标记为“写时复制” 。如果子进程立即用于execve()加载新程序,则子进程将获得自己的内存分配作为一部分,execve()并且父进程的写入时复制限制将被删除:优化将按预期进行。

但是,如果父进程或子进程在子进程执行之前修改了任何临时共享的内存页面execve(),则写入时复制位会在写入实际进行之前导致页面错误,内核会制作内存的第二个副本将要修改的页面,然后父进程和子进程都获得该内存页面的自己的、常规的、可写的副本,其中包含预期的内容。因此,如果进程使用fork()without execve(),则实际的复制稍后会​​根据实际写入的页面以每个内存页面的粒度进行。

系统vfork()调用使这种优化变得明确:父进程/线程在vfork()执行时被挂起,直到子进程调用execve()_exit()。在vfork()ed 子进程执行之前execve(),它必须限制自己不执行某些操作。这最大限度地减少了需要任何内存复制的机会。

据我所知,除了fork()vfork()系统clone()调用之外,没有其他方法可以从用户空间内创建新进程。如果您在内核代码中,则可能有不同的选项可用,具体取决于您所在的内核部分。

相关内容