我们在学校里处理Unix系统上的C代码,我们想分叉进程,将应用程序分成几个进程。寻找概念上的帮助,如何使用叉子的细节。
例如,我理解当您使用一个与父进程相同的内存空间(共享内存除外)创建一个新的子进程时。在这种情况下,什么是“父进程”?在操作系统将应用程序分解成更小的进程之前,有多少代码库被打包到一个给定的进程中?还是我把“过程”想错了?
例如,如果您有一个100,000行程序,其中在第70000行的某个地方有一个fork()调用,那么在应用程序运行时构建的整个程序和内存是否会被复制,即使父程序的数据只有一小部分才能成功呢?这样的大型程序是否被拆分成更小的进程,以减轻fork()调用的重复负载?如果是的话,分裂在哪里?如果没有,您如何才能围绕这一点进行优化?首先,应用程序不应该这么大吗?
一个类似的问题,当创建一个与父进程相同的子进程时,何时可以假定它被终止?使用上面的100,000行程序示例,如果在第100行有一个叉,那么即使不需要分叉子程序也会运行整个程序的其余部分吗?你怎么能避免这种情况?是否有我们班没有钻研的设计因素?我们生活在一个学术代码库中,我们所有的程序都是50行或更少,但我正在努力学习大的概念,以供我的熏陶。
谢谢!
发布于 2014-04-04 05:27:32
您对fork()的理解是完全正确的--它应该做一个调用过程的精确副本,有效地使程序的内存需求加倍。
在实践中(如果使用得当),大多数开销都是在大多数现代操作系统的虚拟内存实现的帮助下优化的:首先,操作系统只考虑复制可写段(文本段--您的代码--在大多数操作段上不被认为是可写的),因此两个进程将共享相同的代码段。对于其余的数据段,操作系统将在写时进行复制,因此只有当子程序第一次尝试写入数据段时,才会复制数据段。
数据段的拷贝将逐页完成,因此,如果父母和孩子的数据散落在页面上的“不太聪明”,您仍然可以强制复制大部分未使用到孩子的内存空间中的父母数据。使用经典的fork()- exec()对,大部分数据将被有效地分离。
https://stackoverflow.com/questions/22853244
复制相似问题