Yazarken kopyala - Copy-on-write

Yazarken kopyala (İNEK), bazen şöyle anılır örtük paylaşım[1] veya gölgeleme,[2] kullanılan bir kaynak yönetimi tekniğidir bilgisayar Programlama Değiştirilebilir kaynaklar üzerinde "çoğaltma" veya "kopyalama" işlemini verimli bir şekilde uygulamak için.[3] Bir kaynak çoğaltılır ancak değiştirilmezse, yeni bir kaynak oluşturmak gerekli değildir; kaynak kopya ve orijinal arasında paylaşılabilir. Değişiklikler yine de bir kopya oluşturmalıdır, dolayısıyla teknik: kopyalama işlemi ilk yazmaya kadar ertelenir. Kaynakları bu şekilde paylaşarak, değiştirilmemiş kopyaların kaynak tüketimini önemli ölçüde düşürürken, kaynak değiştirme işlemlerine küçük bir ek yük eklemek mümkündür.

Sanal bellek yönetiminde

Yazma üzerine kopyalama, ana kullanım alanını sanal bellek nın-nin işletim sistemi süreçler, uygulamasında çatal sistem çağrısı. Tipik olarak, işlem herhangi bir belleği değiştirmez ve adres alanını tamamen değiştirerek hemen yeni bir işlem yürütür. Bu nedenle, bir çatallanma sırasında sürecin tüm belleğini kopyalamak israf olur ve bunun yerine yazma üzerine kopyalama tekniği kullanılır.

Yazma üzerine kopyalama, aşağıdakiler kullanılarak verimli bir şekilde uygulanabilir: sayfa tablosu belirli sayfalarını işaretleyerek hafıza salt okunur olarak ve sayfaya yapılan referansların sayısının tutulması. Bu sayfalara veri yazıldığında, çekirdek yazma girişimini durdurur ve yazma üzerine kopyalama verileriyle başlatılan yeni bir fiziksel sayfa tahsis eder, ancak yalnızca bir referans varsa ayırma atlanabilir. Çekirdek daha sonra sayfa tablosunu yeni (yazılabilir) sayfayla günceller, referans sayısını azaltır ve yazma işlemini gerçekleştirir. Yeni tahsis, bir işlemin belleğindeki bir değişikliğin diğerinde görünmemesini sağlar.

Yazma üzerine kopyalama tekniği, verimli çalışmayı desteklemek için genişletilebilir. bellek ayırma bir sayfaya sahip olarak fiziksel hafıza sıfırlarla dolu. Bellek tahsis edildiğinde, döndürülen tüm sayfalar sıfırlar sayfasına atıfta bulunur ve tümü yazarken kopyala olarak işaretlenir. Bu şekilde, veriler yazılıncaya kadar işlem için fiziksel bellek tahsis edilmez, bu da işlemlerin sanal adres alanının bitmesi riski altında fiziksel bellekten daha fazla sanal bellek ayırmasına ve belleği seyrek olarak kullanmasına izin verir. Birleşik algoritma benzerdir çağrı isteği.[3]

Yazma üzerine kopyalama sayfaları ayrıca Linux çekirdeği 's çekirdek aynı sayfa birleştirme özelliği.[4]

Bir uygulama için kitaplıkları yüklemek aynı zamanda yazma üzerine kopyalama tekniğinin bir kullanımıdır. Dinamik bağlayıcı, kitaplıkları aşağıdaki gibi özel olarak eşler. Kitaplıklar üzerindeki herhangi bir yazma eylemi, sanal bellek yönetiminde bir COW'u tetikleyecektir.

açık(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3mmap(BOŞ, 3906144, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0)mmap(0x7f8a3ced4000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b0000)

Yazılımda

COW ayrıca kütüphane, uygulama ve sistemi kodu.

İçinde çok iş parçacıklı sistemleri, COW geleneksel kullanım olmadan uygulanabilir kilitleme ve bunun yerine kullan karşılaştır ve değiştir dahili referans sayacını artırmak veya azaltmak için. Orijinal kaynak hiçbir zaman değiştirilmeyeceğinden, birden çok iş parçacığı tarafından (referans sayısı artırıldıktan sonra) güvenli bir şekilde kopyalanabilir, örneğin muteksler. Referans sayacı 0'a dönerse, o zaman sadece 1 iş parçacığı bir referansı tutuyordu, böylece kaynak, yine performans-pahalı kilitleme mekanizmaları kullanılmadan bellekten güvenli bir şekilde ayrılabilir. Kaynağı kopyalamak zorunda olmamanın yararı (ve geleneksel derin kopyalamaya göre ortaya çıkan performans kazancı) bu nedenle hem tek hem de çok iş parçacıklı sistemlerde geçerli olacaktır.

Örnekler

dizi tarafından sağlanan sınıf C ++ standart kitaplık ilk C ++ 98 standardında yazma üzerine kopyalama uygulamalarına izin vermek için özel olarak tasarlanmıştır,[5] ancak daha yeni C ++ 11 standardında değil:[6]

std::dizi x("Merhaba");std::dizi y = x;  // x ve y aynı tamponu kullanıry += ", Dünya!";    // artık y farklı bir arabellek kullanıyor                    // x hala aynı eski arabelleği kullanıyor

İçinde PHP programlama dili, referanslar hariç tüm türler yazma üzerine kopyalama olarak uygulanır. Örneğin, dizeler ve diziler başvuruya göre iletilir, ancak değiştirildiklerinde sıfır olmayan başvuru sayılarına sahiplerse çoğaltılırlar. Bu, atamada kopyalama veya onları değiştirilemez kılma performans sorunları olmadan değer türleri olarak hareket etmelerine olanak tanır.[7]

İçinde Qt çerçevesinde, birçok tür yazma üzerine kopyalamadır (Qt'nin terimleriyle "örtük olarak paylaşılır"). Qt atomik kullanır karşılaştır ve değiştir dahili referans sayacını artırma veya azaltma işlemleri. Kopyalar ucuz olduğundan, Qt türleri genellikle birden çok iş parçacığı tarafından, aşağıdaki gibi kilitleme mekanizmalarına ihtiyaç duymadan güvenle kullanılabilir. muteksler. COW'nin faydaları bu nedenle hem tek hem de çok iş parçacıklı sistemlerde geçerlidir.[8]

Bilgisayar deposunda

COW aynı zamanda temelde yatan mekanizma olarak da kullanılabilir. anlık görüntüler tarafından sağlananlar gibi mantıksal hacim yönetimi gibi dosya sistemleri Btrfs ve ZFS,[9] ve gibi veritabanı sunucuları Microsoft SQL Sunucusu. Tipik olarak anlık görüntüler yalnızca değiştirilmiş verileri depolar ve ana dizinin yakınında saklanır, bu nedenle bunlar yalnızca zayıf bir Artımlı yedekleme ve yerine geçemez tam yedekleme.[10] Bazı sistemler ayrıca bir COW tekniği kullanır. bulanık yedeklemeler, aksi takdirde yedeklenen dosyalar kümesindeki herhangi bir dosya bu yedekleme sırasında değiştiğinde ortaya çıkar.

Anlık görüntüleri uygularken iki teknik vardır:

  1. Yazarken yeniden yönlendir veya SATIR: orijinal depolama alanı hiçbir zaman değiştirilmez. Bir yazma isteği yapıldığında, orijinal verilerden uzağa yeni bir depolama alanına yönlendirilir.
  2. Yazma üzerine kopyalama veya COW: bir yazma isteği yapıldığında, veriler yeni bir depolama alanına kopyalanır ve ardından orijinal veriler değiştirilir.

İsimlerine rağmen, yazma üzerine kopyalama genellikle ilk tekniği ifade eder. COW, ROW'un biriyle karşılaştırıldığında iki veri yazma işlemi yapar; verimli bir şekilde uygulanması zordur ve bu nedenle nadiren kullanılır.

Yazma üzerine kopyalama tekniği, gerekli olan medyada bir okuma-yazma deposu taklit etmek için kullanılabilir. aşınma tesviye veya fiziksel olarak bir kez yaz çok oku.

qcow2 (QEMU yazılırken kopyala) disk görüntüsü formatı, disk görüntüsü boyutunu azaltmak için yazma üzerine kopyalama tekniğini kullanır.

Biraz Canlı CD'ler (ve Canlı USB'ler ) CD'de (veya USB flash sürücüde) herhangi bir değişiklik yapmadan herhangi bir dizine dosya ekleyebildiği ve silebildiği izlenimini vermek için yazma üzerine kopyalama tekniklerini kullanın.

Yüksek güvenilirlikli yazılımda

Phantom OS COW'yi yalnızca bir veritabanı veya dosya sistemi değil, tüm düzeylerde kullanır. Herhangi bir zamanda, bu sistemi çalıştıran bir bilgisayar arızalanabilir ve ardından, yeniden başladığında yazılım ve işletim sistemi çalışmaya devam edebilir. Yalnızca küçük miktarlarda iş kaybedilebilir.

Temel yaklaşım, tüm program verilerinin sanal bellekte tutulmasıdır. Bazı programlarda, tüm yazılım verilerinin bir özeti sanal belleğe yazılır ve her bir değerin geçerli değerini ve konumunu izleyen bir günlük oluşturur.

Bilgisayar arızalandığında, günlüğün yeni bir kopyası ve diğer veriler diskte güvende kalır. İşlem devam ettiğinde, işletim sistemi yazılımı, tüm programların ve verilerin tutarlı kopyalarını geri yüklemek için günlüğü okur.

Bu yaklaşım, uygulama yazılımları da dahil olmak üzere tüm yazılımların tüm düzeylerinde yazma üzerine kopyalama kullanır. Bu, uygulama programlama dili içinde destek gerektirir. Uygulamada, Phantom OS yalnızca Java bayt kodları oluşturan dillere izin verir.

Ayrıca bakınız

Referanslar

  1. ^ "Örtülü Paylaşım". Qt Projesi. Alındı 4 Ağustos 2016.
  2. ^ Rodeh, Ohad (1 Şubat 2008). "B-Ağaçlar, Gölgeleme ve Klonlar" (PDF). Depolamada ACM İşlemleri. 3 (4): 1. CiteSeerX  10.1.1.161.6863. doi:10.1145/1326542.1326544. S2CID  207166167. Alındı 4 Ağustos 2016.
  3. ^ a b Bovet, Daniel Pierre; Cesati, Marco (2002-01-01). Linux Kernel'i Anlamak. O'Reilly Media. s. 295. ISBN  9780596002138.
  4. ^ Abbas, Ali. "Kernel Samepage Birleştirme Süreci". alouche.net. Arşivlenen orijinal 8 Ağustos 2016. Alındı 4 Ağustos 2016.
  5. ^ Meyers, Scott (2012), Etkili STL, Addison-Wesley, s. 64–65, ISBN  9780132979184
  6. ^ "Temel Dizede Eş Zamanlı Değişiklikler". Açık Standartlar. Alındı 13 Şubat 2015.
  7. ^ Pauli, Julien; Ferrara, Anthony; Popov Nikita (2013). "Hafıza yönetimi". www.phpinternalsbook.com. PHP Internals Kitabı. Alındı 4 Ağustos 2016.
  8. ^ "Konular ve Örtük Olarak Paylaşılan Sınıflar". Qt Projesi. Alındı 4 Ağustos 2016.
  9. ^ Kasampalis, Sakis (2010). "Yazma Tabanlı Dosya Sistemleri Performans Analizi ve Uygulaması Üzerine Kopyalama" (PDF). s. 19. Alındı 11 Ocak 2013.
  10. ^ Chien, Tim. "Anlık Görüntüler Yedek DEĞİLDİR". www.oracle.com. Oracle. Alındı 4 Ağustos 2016.