exec无需替换当前进程,posix_spawn内核实现

时间:2016-12-15 22:50:30

标签: linux linux-kernel posix system-calls

尽管内核将页面(和页面表)标记为写入时的副本,以使def train(self): df = self.get_training_set() df['Intercept'] = 1 # (a) y = df['activity_type'].values # (b) X = [np.concatenate(( np.array([col1]), col2 )) for col1, col2 in df[['Intercept', 'heartrate']].values.T] model = LogisticRegression() model.fit(X,y) # (c) 系统调用有效工作,但页表和相关结构的创建和拆除仍然是一项昂贵的任务。

因此我想知道为什么linux社区从来没有设法将fork实现为真正的内核系统调用,它只是产生一个新进程,而不需要事先调用posix_spawn。 相反,fork只是posix_spawnfork附近的一个糟糕的glibc包装。

对于必须每秒产生数十个新进程的工作负载,性能提升非常明显。启动新流程的延迟也将得到改善。 这是一个明显的设计瓶颈,几十年来似乎被忽略了。

2 个答案:

答案 0 :(得分:2)

这基本上是posix_spawn的用途。它也是一个更灵活的API。真正的错误是Linux exec手册页仍然没有包含交叉引用。

答案 1 :(得分:1)

使用copy-on-write的fork非常昂贵。为了说明这一点,您可能需要阅读implementation of classic vfork semantics in NetBSD。邮件为现实世界的用例,构建软件提供了一些硬编号。 COW用于非常大的程序也是一个容易测量的惩罚。我的一个朋友为他的Java应用程序编写了自己的spawn守护进程,因为8GB + JVM的forking + exec花了太长时间。

现代世界中vfork的主要问题是它可以与多线程交互得很糟糕。即考虑后vfork代码必须引用尚未由动态链接器解析的函数。动态链接器现在必须锁定自己。例如,这可能导致与原始程序的死锁。