我有一个巨大的应用程序,需要在某个时刻自行分叉。该应用程序是多线程的,有大约200MB的分配内存。我现在要做的事情是确保进程分配的数据不会被重复,以便在此线程内启动一个新的线程和分支。从我读过的内容来看,只有调用fork
的线程才会被复制,但分配的内存会发生什么情况?那还会在那里吗?这样做的目的是用其他启动参数重新启动应用程序,当它分叉时,它将用我的新参数调用main
,从而有希望获得同一程序的新进程。现在,在你问:我不能保证该进程的二进制文件与我开始进程时的位置保持一致,否则我只能在/proc/self/exe
中使用fork
和exec
什么。分叉时分配给其他线程的内存会发生什么
0
A
回答
0
线程是执行单元内的一大进程资源。一个进程是您可以从进程中的任何线程访问的全部内容:所有线程,所有文件描述符以及所有其他资源。所以内存绝对不是绑定到一个线程,并从一个线程分叉没有有用的影响。 由于分叉点正在创建一个新进程,因此仍然需要复制一切。
也就是说,Linux有一些技巧可以让它更快。复制2千兆字节的内存既不快也不高效。因此,当你分叉时,Linux实际上给予新进程相同的内存(起初),但它使用虚拟内存系统将其标记为写时复制:一旦一个进程需要写入该内存,内核拦截它并分配不同的内存,以便其他进程不受影响。
相关问题
- 1. 线程分配内存,主进程死亡,会发生什么?
- 2. 分叉后运行线程会发生什么?
- 3. 先前分配对象的内存会发生什么?
- 4. 在函数中分配的内存会发生什么?
- 5. 如果kmem_cache没有可用内存分配会发生什么?
- 6. 取消时线程的内存会发生什么变化?
- 7. 分叉过程的stdout和stdin会发生什么?
- 8. ,当您分配多个虚拟内核时会发生什么?
- 9. 当运行时JVM内存不足以分配时会发生什么?
- 10. 当主线程调用sys.exit()时,其他线程会发生什么?
- 11. 当一个线程被阻塞时,其他线程会发生什么?
- 12. 删除时双向链表中动态分配的内存会发生什么?
- 13. 锁定传递给其他线程的对象会发生什么?
- 14. 我在Ruby中分配给$ stdout的对象会发生什么?
- 15. 为什么BitmapData.copyPixels会分配内存?
- 16. 在C#中重新分配数组时,内存会发生什么变化?
- 17. 将内存分配函数用作条件语句时会发生什么
- 18. 内存分配与线程
- 19. 如果您将值分配给$ _REQUEST,会发生什么情况?
- 20. 生成器函数分配时会发生什么?
- 21. 将会话变量分配给视图状态时会发生什么?
- 22. 如果您未将其分配给变量,会发生什么情况?
- 23. 进程启动时分页(虚拟内存)系统中会发生什么?
- 24. 当包含lambda的类型被分配时会发生什么?
- 25. 如果构造函数抛出`new`分配的内存会发生什么?
- 26. 内存分配使用新的非类指针会发生什么
- 27. 为什么程序分配的内存不会减少?
- 28. 当进程访问刚分配给brk/sbrk的地址时,内核会发生什么?
- 29. 将零分配给指针会销毁分配的内存吗?
- 30. 以调试模式启动CQ。分叉会发生什么
相关:http://stackoverflow.com/questions/27161412/how-does-copy-on-write-work-in-fork – zneak