加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

POSIX C中fork()的重量更轻?

发布时间:2020-12-16 03:41:08 所属栏目:百科 来源:网络整理
导读:在我一直在阅读的手册页中,似乎popen,system等倾向于调用fork().反过来,fork()复制进程的整个内存状态.这看起来非常重,特别是在很多情况下,来自fork()的调用的子节点几乎没有为父节点分配任何内存. 所以,我的问题是,我可以获得fork()之类的行为,而不会复制父
在我一直在阅读的手册页中,似乎popen,system等倾向于调用fork().反过来,fork()复制进程的整个内存状态.这看起来非常重,特别是在很多情况下,来自fork()的调用的子节点几乎没有为父节点分配任何内存.

所以,我的问题是,我可以获得fork()之类的行为,而不会复制父进程的整个内存状态吗?或者有什么我缺少的东西,这样fork()没有它看起来那么重(比如,可能调用往往会被优化以避免不必要的内存重复)?

解决方法

从用户空间应用的角度来看,fork(2)是所有 syscalls的原始操作(但是一些C库使用 clone(2)).它主要是从一个机器指令SYSCALL或SYSENTER切换到用户模式到内核模式,然后(最新版本)Linux内核正在进行相当重要的处理.

它实际上非常有效(例如,小于一毫秒,有时甚至不到十分之一),因为内核广泛使用惰性copy-on-write技术在父和子之间共享页面.子进程.实际复制将在page faults稍后覆盖共享页面时发生.

而forking有一个巨大的优势,因为其他一些程序的开始被委托给execve(2):它在概念上很简单:父和子之间的唯一区别.子进程是fork的结果

BTW对POSIX系统如Linux,fork(2)或合适的clone(2)等效是创建进程的唯一方法(有一些奇怪的异常你应该忽略:内核正在制作一些像/ sbin / init等进程… ),自vfork(2)以来已过时.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读