有用的Copy-On-write,写时复制
寫時復制和寫時拷貝是一個意思
寫時復制是一種策略,并不是Linux獨有的,如果你正在設計某個系統架構,也可以參考這種思想。
寫時復制的英文解釋如下
Copy-on-write (sometimes referred to as "COW") is an optimization strategy used in computer programming.?
寫時復制是計算機的一種優化策略,也可以說是優化機制,是計算機的優化策略并沒有錯,但是這種策略是人想出來的。
The fundamental idea is that if multiple callers ask for resources which are initially indistinguishable, you can give them pointers to the same resource.?
它的基本思想是,如果有多個調用「callers」,「也可以說是多個進程,多個線程,Linux里面只關心任務就好了」請求同一個難以區分的資源,你可以讓他們指向同一個資源指針。
This function can be maintained until a caller tries to modify its "copy" of the resource, at which point a true private copy is created to prevent the changes becoming visible to everyone else.All of this happens transparently to the callers.?
直到有其中一個調用者,試圖更改這個兩個進程都指向的資源,系統才會分配一個真正的資源「可以認為是物理地址」給這個調用者。這個過程對所有人可見。
The primary advantage is that if a caller never makes any modifications, no private copy need ever be created.
如果調用方,也就是擁有相同資源指針的兩個進程,都不對資源進行修改,那么就不需要生產一個副本資源。
寫時復制的縮寫是「COW,奶牛」,但是實際上它跟奶牛沒有任何關系。
舉個例子說明
假設你是一個酒店老板,馬云和任正非在你們酒店訂了2020年11月20號的房間,你當時看到酒店還沒有住滿,所以就給他們下發了一個訂購成功的返回值。
如果是程序,在內存充分的情況下,創建進程也就成功了。
然后,你其實不需要馬上給馬云和任正非安排具體的房間,因為他們倆都還沒有到酒店開房。
假設晚上他們過來開房了,你就需要給他們開辟這個房間「也可以認為是資源」,給他們晚上做他們想做的事情。
如果他們一直都不來,那你就不用給他們開房,也就不實際占用你的房間。
fork()函數和寫時復制
fork()函數是一個神奇的函數,調用一次,會返回兩次,在這個過程中子進程和父進程是共享一個內存空間的。
#include?<unistd.h> #include?<stdio.h>int?main() {int?pid?=?fork();if(pid?==?-1){return?(-1);}if(pid?>?0){printf("Hi,Father?Pid:%d\n",getpid());return?(0);}?else?{printf("Hi,Child?Pid:%d\n",getpid());return?(0);} }-- 程序輸出:
-- 然后我加入一個資源
-- 程序輸出:
我們可以看到,父進程中我們對資源 c 進行了修改,并打印了資源的地址和值,然后我們在子進程中也打印資源的值。
可以看到,父進程先執行修改?c 的值,并打印 c 的值 是 v
子進程運行,打印 c?的值,c 的值是 原理的初始化值 a 。
也就是說這個過程發生了寫時復制,在父進程種給 c?分配了物理內存區別于子進程。
創建進程沒有發生寫時拷貝的情況
沒有發生寫時復制的情況
發生了寫時復制的情況
推薦閱讀:
? ??專輯|Linux文章匯總
? ??專輯|程序人生
? ??專輯|C語言
嵌入式Linux
微信掃描二維碼,關注我的公眾號?
總結
以上是生活随笔為你收集整理的有用的Copy-On-write,写时复制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP读取PDF内容方法
- 下一篇: C语言发展简史