进程共享(读时共享写时复制)
父子進程之間在剛fork后。父子相同處: 全局變量、.data、.bbs、.text、棧、堆、環境變量、用戶ID、宿主目錄(進程用戶家目錄)、進程工作目錄、信號處理方式等等,即0~3G的用戶空間是完全一樣的。父子不同處: 1.進程ID?? 2.fork返回值?? 3.父進程ID??? 4.進程運行時間??? 5.鬧鐘(定時器)?? 6.未決信號集
似乎,子進程復制了父進程0-3G用戶空間內容,以及父進程的PCB(內核模塊在物理內存只有一份),但pid等不同。真的每fork一個子進程都要將父進程的0-3G地址空間完全拷貝一份,然后在映射至物理內存嗎?當然不是,父子進程間遵循讀時共享寫時復制的原則。這樣設計,無論子進程執行父進程的邏輯還是執行自己的邏輯都能節省內存開銷。
讀時共享寫時復制這一機制是由MMU來實現的。
注意:只有進程空間的各段的內容要發生變化時(子進程或父進程進行寫操作時,都會引起復制),才會將父進程的內容復制一份給子進程。在fork之后兩個進程用的是相同的物理空間(內存區),子進程的代碼段、數據段、堆棧都是指向父進程的物理空間,也就是說,兩者的虛擬空間不同,但其對應的物理空間是同一個。即父子進程在邏輯上仍然是嚴格相互獨立的兩個進程,各自維護各自的參數,只是在物理上實現了讀時共享,寫時復制。?
父子進程一直共享:1. 文件描述符(打開文件的結構體)?,注意不是共享文件描述符本身這個整形數,而是共享同一個文件對應的FILE *結構體指針,其實一個文件打開后只能有一個FILE結構體,因此對于多有的進程都是共享這一個結構體,不僅僅只是父子進程。 2. mmap建立的映射區 (進程間通信詳解)。
特別的,fork之后父進程先執行還是子進程先執行不確定。取決于內核所使用的調度算法。
總結
以上是生活随笔為你收集整理的进程共享(读时共享写时复制)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都欢乐谷地铁站哪个口出
- 下一篇: 我最近要和朋友SOLO,英雄联盟,他用亚