寫入時複製(英語:Copy-on-write,簡稱COW)是一種計算機程式設計領域的優化策略。其核心思想是,如果有多個呼叫者(callers)同時請求相同資源(如內存或磁盤上的數據存儲),他們會共同取得相同的指標指向相同的資源,直到某個呼叫者試圖修改資源的內容時,系統才會真正複製一份專用副本(private copy)給該呼叫者,而其他呼叫者所見到的最初的資源仍然保持不變。這過程對其他的呼叫者都是透明的。此作法主要的優點是如果呼叫者沒有修改該資源,就不會有副本(private copy)被建立,因此多個呼叫者只是讀取操作時可以共享同一份資源。

應用

編輯

虛擬內存管理中的寫時複製

編輯

一般把這種被共享訪問的頁面標記為只讀。當一個task試圖向內存中寫入數據時,內存管理單元(MMU)拋出一個異常,內核處理該異常時為該task分配一份物理內存並複製數據到此內存,重新向MMU發出執行該task的寫操作。

數據存儲中的寫時複製

編輯

Linux等的文件管理系統使用了寫時複製策略。

數據庫服務器也一般採用了寫時複製策略,為用戶提供一份snapshot。

軟件應用中的寫時複製

編輯

C++標準程序庫中的std::string類,在C++98/C++03標準中是允許寫時複製策略。但在C++11標準中為了提高並行性取消了這一策略。[1] GCC從版本5開始,std::string不再採用COW策略。

std::string x("Hello");
std::string y = x;  // x 和 y 使用相同的 buffer
y += ", World!";    // y 现在用了不同的 buffer,而 x 用原来的 buffer

PHP中,除了引用類型外,其他類型都是以寫時複製的方式實現的。例如,字符串和數組是通過引用傳遞的。當它們被修改時,如果它們的引用計數不為零,就會複製一份。這使得它們可以像值類型一樣使用,而不會有賦值時複製的性能問題。[2]

參考文獻

編輯
  1. ^ Concurrency Modifications to Basic String. Open Standards. [2015-02-13]. (原始內容存檔於2021-02-24). 
  2. ^ Pauli, Julien; Ferrara, Anthony; Popov, Nikita. Memory management. PHP Internals Book. 2013 [2023-11-17]. (原始內容存檔於2023-11-10) (英語).