Dosyaları Birleştirme

Bir dosya diske yazıldığında, bazen dosya bitişik kümelerde yazılamaz. Bitişik olmayan kümeler, bir dosyayı okuma ve yazma işlemini yavaşlatır. Sabit disk sürücüsünün okuma/yazma kafasını taşımak için geçen süre nedeniyle, diskte bitişik olmayan kümeler ne kadar ayrı olursa sorun o kadar kötü olur. Bitişik olmayan kümelere sahip bir dosya parçalanmış. Dosyaları hızlı erişim için optimize etmek amacıyla birim birleştirilebilir.

Birleştirme, dosyaları birleştirmek için diskte dosyaların bazı bölümlerini taşıma işlemidir; diğer bir ifadeyle, dosyaları bitişik hale getirmek için disk üzerindeki dosya kümelerini taşıma işlemidir. Daha fazla bilgi için aşağıdaki bölümlere bakın:

Dosyayı birleştirme

Basit bir tek görevli işletim sisteminde tek görev birleştirme yazılımıdır ve diskten okunacak veya diske yazılması gereken başka işlem yoktur. Ancak, çok görevli bir işletim sisteminde, bazı işlemler bir sabit disk sürücüsünden okuma ve yazma işlemi yaparken, başka bir işlem bu sabit disk sürücüsünü birleştirir. İşin püf noktası, yazma sürecini çok uzun süre durdurmadan birleştirilen bir dosyaya yazma işlemlerinden kaçınmaktır. Bu sorunu çözmek önemsiz değildir, ancak mümkündür.

Dosya sistemi disk yapısı hakkında ayrıntılı bilgi gerektirmeden birleştirmeye izin vermek için üç denetim kodu kümesi sağlanır. Denetim kodları aşağıdaki işlevleri sağlar:

  • Uygulamaların boş kümeleri bulmasını sağlama
  • Dosya kümelerinin disk konumunu belirleme
  • Disk üzerindeki kümeleri taşıma

Denetim kodları, taşımalar sırasında diğer işlemlerin dosyalardan okumasını ve dosyalara yazmasını engelleme ve izin verme sorununu da şeffaf bir şekilde işler.

Bu işlemler, diğer işlemlerin çalışmasını engellemeden gerçekleştirilebilir. Ancak disk sürücüsü birleştirilirken diğer işlemlerin yanıt süreleri daha yavaştır.

Bir dosyayı birleştirmek için:

  1. Birimde dosyanın tamamını kabul edecek kadar büyük bir yer bulmak için FSCTL_GET_VOLUME_BITMAP denetim kodunu kullanın.

Not

Gerekirse, yeterince büyük bir yer oluşturmak için diğer dosyaları taşıyın. İdeal olarak, dosyanın ilk uzantısından sonra, sonraki uzantıları ilk uzantıdan sonra alana taşıyabileceğiniz yeterli ayrılmamış küme vardır.

  1. Disk üzerindeki dosyanın geçerli düzeninin haritasını almak için FSCTL_GET_RETRIEVAL_POINTERS denetim kodunu kullanın.

  2. FSCTL_GET_RETRIEVAL_POINTERStarafından döndürülen RETRIEVAL_POINTERS_BUFFER yapısını inceleyin.

  3. Yapıda ilerledikçe her kümeyi taşımak için FSCTL_MOVE_FILE denetim kodunu kullanın.

    Not

    Bitmap'i veya erişim yapısını ya da diğer işlemler diske yazarken her ikisini de farklı zamanlarda yenilemeniz gerekebilir.

Birleştirme işlemi sırasında kullanılan işlemlerden ikisi bir birim tanıtıcısı gerektirir. Bir birimin tanıtıcısını yalnızca yöneticiler edinebilir, bu nedenle yalnızca yöneticiler birimde birleştirme işlemi yapabilir. Uygulama, birleştirme yazılımını çalıştırmaya çalışan bir kullanıcının haklarını denetlemeli ve kullanıcının uygun haklara sahip olmaması durumunda bir birimi birleştirmesine izin vermemelidir.

FAT veya FAT32 dosya sistemi biriminin birleştirilmesi sırasında bir dizini açmak için CreateFile kullanırken, GENERIC_READ erişim maskesi değerini belirtin. MAXIMUM_ALLOWED erişim maskesi değerini belirtmeyin. Bu yapılırsa dizine erişim reddedilir.

Bir NTFS dosya sisteminde küme yuvarlatılmış dosya boyutunu aşan ayrılmış kümeleri taşımayı denemeyin, çünkü sonuç bir hatadır.

NTFS dosya sistemi birimlerindeki yeniden ayrıştırma noktaları, bit eşlemleri ve öznitelik listeleri, birleştirilebilir, okuma ve eşitleme için açılabilir ve dosyaadı kullanılarak şu sözdizimi ile adlandırılabilir:ad:tür; örneğin, dirname:$i30:$INDEX_ALLOCATION, mrp::$DATA, mrp::$REPARSE_POINT ve mrp::$ATTRIBUTE_LIST.

NTFS dosya sistemi birimlerini birleştirirken, bir sanal kümeyi bir dosyanın ayırma boyutunun ötesinde birleştirmeye izin verilir.

Disk birleştirme ve gölge kopyalar arasındaki etkileşimleri en aza indirme

Mümkün olduğunda, 16 kilobaytlık (KB) artışlarla birbirine göre hizalanmış bloklardaki verileri taşıyın. Bu, gölge kopya alanı artırıldığından ve aşağıdaki koşullar oluştuğunda performans azaldığından gölge kopyalar etkinleştirildiğinde yazma sırasında kopyalama ek yükünü azaltır:

  • Taşıma isteği bloğu boyutu 16 KB'tan küçüktür.
  • Taşıma deltası 16 KB'lık artışlar halinde değil.

Taşıma deltası, kaynak bloğun başlangıcı ile hedef bloğun başlangıcı arasındaki bayt sayısıdır. Başka bir deyişle, X eksi Y'nin mutlak değeri 16 KB'ın çift katıysa, X uzaklığından (disk üzerinde) başlayan bir blok, başlangıç uzaklığı Y'ye taşınabilir. Bu nedenle, 4 KB kümeleri varsayarsak, küme 3'ten küme 27'ye bir taşıma iyileştirilir, ancak küme 18'den küme 24'e taşıma olmaz. Mod(3,4) = 3 = mod(27,4) olduğunu unutmayın. Mod 4 seçilir çünkü her biri 4 KB olan dört küme 16 KB'a eşdeğerdir. Bu nedenle, 16 KB küme boyutuna biçimlendirilmiş bir birim, tüm taşıma dosyalarının en iyi duruma getirildiğine neden olur.

Gölge kopyalar hakkında daha fazla bilgi için bkz. Birim Gölge Kopyası Hizmeti.

Birleştirme giderme için desteklenen dosyalar, akışlar ve akış türleri

Çoğu dosya FSCTL_MOVE_FILE denetim kodu kullanılarak taşınabilir, ancak tümü taşınamayabilir. aşağıda, FSCTL_MOVE_FILEtarafından desteklenen dosyaların, akışların ve akış türlerinin (öznitelik türü kodları olarak da adlandırılır) listesi yer alır. Diğer dosyalar, akışlar ve akış türleri FSCTL_MOVE_FILEtarafından desteklenmez.

Herhangi bir dosya veya dizin için desteklenen akış türleri.

  • ::$DATA
  • ::$ATTRIBUTE_LIST
  • ::$REPARSE_POINT
  • ::$EA
  • ::$LOGGED_UTILITY_STREAM

Windows 7, Windows Server 2008 R2, Windows Server 2008, Windows Vista, Windows Server 2003 ve Windows XP: ::$EA ve ::$LOGGED_UTILITY_STREAM, Windows 8 ve Windows Server 2012'de desteklenmez

Herhangi bir dizin için desteklenen akış türleri.

  • ::$BITMAP
  • ::$INDEX_ALLOCATION

"dosya adı:akış adı:$tür adı" biçiminde FSCTL_MOVE_FILE tarafından desteklenen sistem dosyası, akış ve akış türleri aşağıdadır.

  • $MFT::$DATA
  • $MFT::$ATTRIBUTE_LIST
  • $MFT::$BITMAP
  • $AttrDef::$DATA
  • $AttrDef::$ATTRIBUTE_LIST
  • $Secure:$SDS:$DATA
  • $Secure::$ATTRIBUTE_LIST
  • $Secure:$SDH:$INDEX_ALLOCATION
  • $Secure:$SDH:$BITMAP
  • $Secure:$SII:$INDEX_ALLOCATION
  • $Secure:$SII:$BITMAP
  • $UpCase::$DATA
  • $UpCase::$ATTRIBUTE_LIST
  • $Extend:$I30:$INDEX_ALLOCATION
  • $Extend::$ATTRIBUTE_LIST
  • $Extend:$I30:$BITMAP
  • $Extend\$UsnJrnl:$J:$DATA
  • $Extend\$UsnJrnl::$ATTRIBUTE_LIST
  • $Extend\$UsnJrnl:$Max:$DATA
  • $Extend\$Quota:$Q:$INDEX_ALLOCATION
  • $Extend\$Quota::$ATTRIBUTE_LIST
  • $Extend\$Quota:$Q:$BITMAP
  • $Extend\$Quota:$O:$INDEX_ALLOCATION
  • $Extend\$Quota:$O:$BITMAP
  • $Extend\$ObjId:$O:$INDEX_ALLOCATION
  • $Extend\$ObjId::$ATTRIBUTE_LIST
  • $Extend\$ObjId:$O:$BITMAP
  • $Extend\$Reparse:$R:$INDEX_ALLOCATION
  • $Extend\$Reparse::$ATTRIBUTE_LIST
  • $Extend\$Reparse:$R:$BITMAP
  • $Extend\$RmMetadata:$I30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata:$I30:$BITMAP
  • $Extend\$RmMetadata::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Repair::$DATA
  • $Extend\$RmMetadata\$Repair::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Repair:$Config:$DATA
  • $Extend\$RmMetadata\$Txf:$I30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata\$Txf::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Txf:$I30:$BITMAP
  • $Extend\$RmMetadata\$Txf:$TXF_DATA:$LOGGED_UTILITY_STREAM
  • $Extend\$RmMetadata\$TxfLog:$I30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata\$TxfLog::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$TxfLog:$I30:$BITMAP
  • $Extend\$RmMetadata\$TxfLog\$Tops::$DATA
  • $Extend\$RmMetadata\$TxfLog\$Tops::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$TxfLog\$Tops:$T:$DATA
  • $Extend\$RmMetadata\$TxfLog\$TxfLog.blf::$DATA
  • $Extend\$RmMetadata\$TxfLog\$TxfLog.blf::$ATTRIBUTE_LIST