尽管内核将页面(和页面表)标记为写入时的副本,以使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_spawn
和fork
附近的一个糟糕的glibc包装。
对于必须每秒产生数十个新进程的工作负载,性能提升非常明显。启动新流程的延迟也将得到改善。 这是一个明显的设计瓶颈,几十年来似乎被忽略了。
答案 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代码必须引用尚未由动态链接器解析的函数。动态链接器现在必须锁定自己。例如,这可能导致与原始程序的死锁。