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