Registry Kayıtları, Windows'un Kara Deliği Mi ?

Ben Kenobi

Müdavim
Müdavim
Katılım
6 Kasım 2011
Mesajlar
7,337
Reaksiyon puanı
3,156
Puanları
1,358
Merhaba arkadaşlar.
Bugün yeni bir sohbet dizisiyle karşınızdayım.
Birkaç gündür Windows içerisindeki asıl adı "regedit.exe" olan, Registry Editor şeklinde geçen ve Windows'un dahili veritabanını yöneten sistem ile uğraşıyorum.
Bunun sonucunda bazı tecrübe ve görüşlerimi sizlerle paylaşmak istedim.
Hadi başlayalım.

0 - Regedit Sistemi Neden Var ?
Programların birtakım parametlere ihtiyacı vardır ve bunların bir kısmı çalışma esnasında grafiksel arayüz üzerindeki ayarlar kısmından değiştirilebilir.
Bu ayarlar standart olarak "*.ini" dosyası şeklinde tabir edilen ama farklı formatlarda da olabilen (Misal Firefox için "*.js") ASCII karakter dizilerinden oluşur.
Microsoft firması, Windows 3.1 zamanında yani 1992 yılında, bu ayarları farklı dosyalarda dağıtacağımıza, tek bir veritabanı üzerinden erişelim fikrini ortaya atıyor ve bu karanlık çukurun temelleri atılıyor.
Aslında iyi bir fikir gibi görünen Regedit sistemini inceledikten sonra, hiç de iyi bir fikir olmadığını, dahası çok yanlış şekilde kullanıldığını ve zamanla Windows içerisinde neyin girip neyin çıktığı belli olmayan bir karadeliğe dönüştüğünü gözlemledim.

Bunu elbet benden önce gözlemleyen ve benim aksime çok daha resmi yazılarla belirtenler olmuş, birkaç örnek vereyim.
Was The Windows Registry a Good Idea?
The Windows Registry – It seemed like a good idea at the time
What is the advantage of the Windows Registry vs. text files like every other OS? • r/sysadmin

Şimdi de kendi kişisel görüşlerimden bahsedeyim.

1 - Native Data Tipleri
Bunu elbet veritabanı uzmanları daha iyi bilir lakin bir veritabanı oluştururken ilk önceliklerden biri buraya kaydedilecek veri tiplerinin programların kullanacağı veri tipleri ile uyumlu olmasıdır yoksa sürekli veri tipleri arasında static veya dynamic casting ile çevrilmeler meydana gelir ve bu da performansı düşürür.
Regeditte kullanılan data tiplerine bakalım.
regedit-shell-new-key.png

int32 ?, float32 ? float64 ? bool ? int16 ? int8 ? char ?
Registry Value Types (Windows)
Nedense programların çoğunlukla kullandığı string hariç hiçbir veri tipi bulunmamakta ve expandable string gibi neden kullandığını Microsoft'un bile bilmediğini tahmin ettiğim garip çeşitler bulunmakta. Bu durum tipler arasında çevrimden ötürü performansı azaltmakta. Buradaki binary tipinden daha sonra ayrıntılı bir şekilde bahsedeceğim.

Sadece bununla sınırlı değil, eğer veritabanımız yukarıda bahsettiğim değerlere sahip olsaydı, belki de şu anki boyutunun 10'da 1'i kadar küçük olabilirdi çünkü misal birçok bool değeri aslında 1 bit olmasına rağmen yokluktan ötürü 32 bit dword olarak kaydedilmekte yani olması gerekenden 32 kat daha büyük.
Bu yokluk sadece boyutu değil, performansı da etkiliyor.

2 - Index Sıralama Optimizasyonu
Bunu da elbet veritabanı uzmanları daha iyi bilir lakin veritabanlarındaki değerlerin belli süre sonra optimize edilmesi gerekir. (Eğer ki girdiyi eklediğiniz, sildiğiniz veya güncellediğiniz an optimize edilmiyorsa veya belli sürelerde otomatik olarak bu işlem yapılmıyorsa) Bunun nedeni, belli süre sonra veritabanındaki index sıralarının değişmesinden ötürüdür. Regedit üzerine hergün onbinlerce veri girip çıkmasına rağmen, hiçbir zaman veritabanında optimizasyon veya bakım işlemleri yapılmaz.
Örnek vereyim.
Kod:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\BCD00000000\Description]
"KeyName"="BCD00000000"
"System"=dword:00000001
"TreatAsSystem"=dword:00000001
"GuidCache"=hex:c2,14,33,11,b1,ca,d2,01,08,27,00,00,03,99,c2,d7,d3,85,26,88,16,\
  00,00,00
Burada en sonda bulunan GuidCache girdisi aslında alfabe sırasına göre en başta bulunmalıydı, buradan anlıyoruz ki bu veri ya sonradan eklenmiş ya da değişmiş ve index sırası bozulmuş. Dolayısıyla bu şekilde onbinlerce girdi, belli süre sonra Regedit performansını düşürmekte.

3 - Kategorizasyon
Bugüne kadar çok kötü kategorize edilmiş hayata dair birtakım detaylar gördüm ama registry kadar kötüsüne sanırım şahit olmadım. Aynı kategoriye ait olması gereken binlerce ayar, binlerce farklı yere umarsızca dağılmış durumda.
Misal şu penceredeki her bir ayar, bambaşka bir kategoride bulunuyor.
turnoffanimations-100621296-orig.png

Bu durum az da olsa performansı da etkiliyor çünkü bu ayarlar ard arda olsa, çok hızlı sürede sequential okuma veya yazma ile yapılacakken, tek bir ayar grubu sandığımız değerlerin kaydı ve okunması sırasında belki de binlerce farklı kategori aşındırılıyor.

Daha da kötüsü, aynı ayar için birden fazla bambaşka yerlerde Regedit girdisi bulunabiliyor.
Misal DPI ayarlarını registry üzerinden değiştirmeye kalkarsanız, şunu yapmanız gerekiyor.
Kod:
Windows Registry Editor Version 5.00

[-HKEY_CURRENT_USER\Control Panel\Desktop\PerMonitorSettings]
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Hardware Profiles\Current\Software\Fonts]
"LogPixels"=dword:00000096
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontDPI]
"LogPixels"=dword:00000096
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\FontDPI]
"LogPixels"=dword:00000096
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\0000\Software\Fonts]
"LogPixels"=dword:00000096
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\0001\Software\Fonts]
"LogPixels"=dword:00000096
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\Current\Software\Fonts]
"LogPixels"=dword:00000096
[HKEY_CURRENT_CONFIG\Software\Fonts]
"LogPixels"=dword:00000060
[HKEY_CURRENT_USER\Control Panel\Desktop]
"DesktopDPIOverride"=dword:00000000
"LogPixels"=dword:00000096
"Win8DpiScaling"=dword:00000000
[HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics]
"AppliedDPI"=dword:00000096

Bunun rezillik olduğunu iddia etmek, çok da iddialı bir iddia olmaz, neden sadece tek bir tane ayarı değiştirebilmek için, bu kadar farklı girdiyle uğraşmamış gerekiyor ?

4 - Kullanıcı Ayarları
Buraya Linux ile örnek vererek başlayayım çünkü Linux gerçekten bu işi kendi kafasına göre değil de, standartlara göre yapan ve hakkıyla yapan bir işletim sistemi. Misal Linux'te her programın varsayılan ayarları olur ve bu ayarlar ya binary içinde gömülü olur, ya da root içerisinde erişim izni olmayan bir ini dosyasında saklı olur. Bunun dışında sadece iki adet kullanıcı profiliyle bu ayarlar override edilebilir, o anki kullanıcıya ait profil ve root yani yönetici profili. Kullanıcı root olarak açarsa ikinci, standart açarsa birinci bahsettiğim profil override dosyası devreye girer. Eğer bu profil dosyaları kayıpsa, binary sistem bu ayarları varsayılan ayarların tamamını kopyalayarak oluşturabilir veya sadece program açıldıktan sonra, varsayılan bir ayar değişirse, sadece değişen ayarları dahil eden bir "*.ini" dosyası oluşturabilir.
Bundan daha iyisini, ben düşünemiyorum. İşte bu yüzden, misal fabrika ayarlarına reset etmek çok kolaydır, home klasöründeki user içeriğine bağlı herşeyi silerseniz, sanki yeni format atmış gibi ayarlarınız olur.

Gelelim Regedit'e.
HKEY_CURRENT_USER vardır. HKEY_LOCAL_MACHINE vardır. Bunların hangisinin ne zaman, hangi koşulda, hangisini override edeceği belli değildir ve programı yazana bağlıdır. Bazı CURRENT_USER değerleri LOCAL_MACHINE'ni override eder, bazı LOCAL_MACHINE değerleri CURRENT_USER'ı override eder. Bazı girdiler sadece LOCAL_MACHINE için geçerlidir, bazı girdiler ise sadece CURRENT_USER için geçerlidir ve bu durumu, dökümantasyonda yazmıyorsa, kendi başınıza tahmin etmek olası değildir.

Bu da yetmezmiş gibi HKEY_USERS içerisinde birçok profil vardır(Bunlardan bir tanesi CURRENT_USER profilidir, zaten CURRENT_USER aslında sadece oradaki profillerden birini işaret eden bir pointer, yani shortcut'dır.) Bu profillerden DEFAULT profili ile LOCAL_MACHINE profili arasında anlam karmaşası vardır misal Login Screen üzerindeki mouse ayarları Local Machine'den değil nedense Default'tan alır. Bu da yetmezmiş gibi bazı programlar buraya kendi kullanıcı profilini üretir. (Bir kullanıcı için birden çok kullanıcı profili ?) Misal Nvidia buraya kendi profilini koyar, basit olması için örnek vereyim, yarın NVIDIA buraya fare hız ayarı koysa, Nvidia Control Panel programındaki pencereye gelince fareniz daha hızlı çalışır, diğer programlardaki pencereye gelince daha yavaş. Bu da yetmezmiş gibi HKEY_CURRENT_CONFIG diye birşey vardır ve bu anahtar neyi ne zaman override eder, ben de bilmiyorum.

5 - Zihniyet Bozuklukları
Eğer bir ayarı kullanıcının değiştirmesini istemiyorsanız ,onu ayar yapmazsınız olur biter. Misal FIFA oyununda futbol takımları 11 kişiden oluşur ve bunu değiştirmek için ayar yoktur. Eğer ayar olsaydı değiştirmek mümkün olurdu. Lakin hem ayar koyup, hem de kullanıcı bunu değiştirmesin diye o ayarı kapatmak bir takım zihniyet bozuklukları olduğuna işaret eder.

Bahsettiğim birden fazla durumu kapsamakta. Birincisi Regedit içerisindeki girdilerin bir kısmı aslında yoktur ama siz koyarsanız olur. (Ben yaptım oldu)
Madem böyle bir ayar var ve mümkün, neden koymuyorsun? En azından görmüş olur kullanıcı(burada kullanıcı dediğime bakmayın, sistem yöneticisi vs), madem kullanıcının onu değiştirmesini istemiyorsun, neden öyle bir ayar yapıyorsun ?
Benzeri durum dökümantasyonlar için de geçerli. Microsoft'un Regedit dökümantasyonu pek de iç açıcı değildir ve çoğu girdiden hiç bahsetmez bile. Madem bahsetmeyeceksin, neden yaptın? Madem yaptın neden bahsetmiyorsun ?

Bir başka zihniyet bozukluğu binary yani hex kısmında karşımıza çıkar. Öncelikle bir girdiyi binary yapmak o girdiyi sadece programın anlayabileceği bir formata dönüştürdüğünden ötürü kullanıcının değiştirmesini engellemek ile benzer anlama gelir. Madem kullanıcının değiştirmesini istemiyorsun, neden o ayarı koyuyorsun sorusu burada da sorulabilir. Bu durumun aslında bir miktar kapalı kaynak kod yapısının da ayar kısmına yansıması olduğunu düşünüyorum. Yani kodlarımın kapalı olduğu gibi ayarlarım da kapalı olsun ve benden başka kimse değiştiremesin dikdatörlüğü devreye giriyor ve Linux'un aksine kullanıcının(sistem yöneticilerinin) özgürlüklerini kısıtlamak adına yeni yöntemler geliştiriliyor.
Bunun performansa da etkisi olabilir. Öyle ki siz 100mb'lık kendi programınızı bu binary girdileri sayesinde regedit'e gömebilirsiniz ve yarın herkes sizin gibi yapsa, belli süre sonra regedit tek bir girdiyi okumak için bile gigabytelarca verinin okunması gereken, gereksiz bir çuval yığın haline gelme tehlikesini barındırmaktadır. Şu an bu durum olmasa bile ileride olmayacağını kim garanti edebilir ?

Şimdi böyle diyince ben de korktum ve acaba abarttım mı diyerek Microsoft'un sitesine baktım ama maalesef haklıyım. Regedit içerisindeki girdilerin max boyutu, sistemdeki hafıza boyutuyla eşdeğer.
Registry Element Size Limits (Windows)
Hatta Microsoft da bu durum için 2048 byte'dan büyük dosyaları ini şeklinde saklayın ve bu ini dosyalarının sadece yerini string olarak regedit içerisinde saklayın ki verimlilik bozulmasın öğüdünü vermiş.

6 - Tembel Programlar
Programlar yüklenme esnasında ve kullanılma esnasında regedit içerisine ayarlarını kaydederler lakin sanki aralarında gizli bir anlaşma varmış gibi çoğu silinirken buradaki kayıtları silmezler. Dolayısıyla çok fazla program yükleyip silen bir kullanıcı belli süre sonra onbinlerce gereksiz girdiyle baş başa kalabilir. Bunların bir kısmını Regedit temizleyiciler tespit edebilir ama kalan yarısını tespit etmesi mümkün değildir.

7 - Parçalanma
Regedit kayıtları eklenip silindikçe, belli süre sonra parçalanmaya başlar ve standart disk birleştirici regedit kayıtlarını birleştiremez. (Güvenlik ve kullanılan sistem dosyalarının yerinin değiştirilme kuralından ötürü) Bu da performansı etkiler lakin en azından bunun çözümü var. IOBit gibi bazı firmalara ait disk birleştirici yazılımları, bilgisayar başlangıcında, kullanıcı ekranı gelmeden önce disk birleştirme yaparak, bu gibi dosyaları birleştirebilmekte lakin Microsoft'un kendi başına dahili bir çözümü yok.

8 - Taşınabilirlik
Hangi programın hangi kayıtlara eriştiği, hangilerini eklediği, hangileri çıkardığı bilinmediğinden (Bunu çok özel programlarla detaylı analiz etmediğiniz sürece) Regedit kullanan programların portable olabilmesi teknik olarak çok zordur. Ayrıca diğer işletim sistemlerinde bulunmadığından ötürü, multi-platform programlarda sıkıntı çıkarır.

9 - gpedit.msc
Asıl adı "gpedit.msc" olan, Group Policy Editor olarak da bilinen ve Windows'un Home sürümlerinde bulunmayan bu yazılımımız, Regeditteki bazı ayarları override etmekte. (Sanki yukarıda belirttiğim üzere regedit'in kendi içerisinde override karmaşası yaşanmıyormuş gibi) Yani siz ne yaparsanız yapın o kural için Group Policy atanmışsa Regedit ayarı geçersiz kılınıyor. Bu durumun her zamanki gibi performansa da etkisi var çünkü her kural için işletim sistemi önce Group Policy'e kayıtlı bir kural var mı diye bakmak için uğruyor.

10 - Farklı Ayarları Tek Bir Girdide Birleştirme
Önceki konularda bir ayarı değiştirmek için onlarca girdiyi değiştirmemiz gerektiğinden bahsetmiştik, şimdi ise farklı ayarların tek bir girdide toplanmasından bahsedeceğiz. Elbette ki burada Regedit'in kendi suçu yok ancak yanlış kullanımından kaynaklanan bir sorun söz konusu.

Misal "HKEY_CURRENT_USER\Control Panel\Desktop" içerisindeki UserPreferencesMask değeri 32 farklı ayarı tek bir girdide barındırır yani bu girdide bulunan bir ayarı değiştirebilmek için, öncelikle parametreyi 2'lik bit sistemine çevireceğiz, sonra bizim ayarımız hangi bit üzerinde yer alıyor bulacağız, değiştireceğiz, en sonunda bu bit serisini tekrar hex'e çevirip kaydedeceğiz. Tahmin edeceğiniz üzere bu durum kolaylık değil ciddi bir zorluk barındırıyor.
UserPreferencesMask

Userpreerencesmask.png


Gelelim sonuca;
İşte bu gibi sebeplerden ötürü, Linux işletim sistemleri, tek bir elde toplanmış dahili veri tabanı yerine, her programın user profile içerisinde, kendi ayarlarını, kendi istediği alana kaydettiği *.ini" kayıt sistemlerini tercih etmekte ve ben de doğru seçimin bu olduğunu kendi tecrübelerim sonucunda vardığım görüş itibarıyla düşünmekteyim.
--- Gönderi Güncellendi ---
Benden izin almanıza gerek olmaksızın, istediğiniz yerde yazıyı yayınlayabilirsiniz.
 
Son düzenleme:

Halktan Biri

Dekan
Emektar
Katılım
30 Ekim 2016
Mesajlar
9,401
Reaksiyon puanı
9,165
Puanları
293
6 - Tembel Programlar
Programlar yüklenme esnasında ve kullanılma esnasında regedit içerisine ayarlarını kaydederler lakin sanki aralarında gizli bir anlaşma varmış gibi çoğu silinirken buradaki kayıtları silmezler. Dolayısıyla çok fazla program yükleyip silen bir kullanıcı belli süre sonra onbinlerce gereksiz girdiyle baş başa kalabilir. Bunların bir kısmını Regedit temizleyiciler tespit edebilir ama kalan yarısını tespit etmesi mümkün değildir.
Revo Uninstaller ya da IObit Uninstaller gibi program kaldırıcılardan programı kaldırınca kayıt defterinde silinen programla ilgili dosyalaı taratılııp silinebiliyor. Peki bu %100 işe yarıyor mudur?
Ayrıca birkaç şey daha sormak istiyorum. Bazı registry temizliği yapan programlar (örneğin CCleaner, Wise Registry Cleaner) ile kayıt defterini taratıp, bulunan sorunları silmemiz gerçekten işe yarıyor mudur? Bence bu biraz tehlikeli bir iş. Yani yanlış bir kayıt defteri içeriği silinirse sistemde kararsızlıklara ve çökmelere sebep olabilir.
Peki bu registry temizleyiciler kayıt defterindeki sorunları nasıl buluyorlar?
--- Gönderi Güncellendi ---
Benden izin almanıza gerek olmaksızın istediğiniz yerde yazıyı yayınlayabilirsiniz.
©©© Copyright Ben Kenobi Reyiz ©©© :)
 

Ben Kenobi

Müdavim
Müdavim
Katılım
6 Kasım 2011
Mesajlar
7,337
Reaksiyon puanı
3,156
Puanları
1,358
Genel olarak yarı yarıya işe yarıyor diyebilirim, yani yarısı kadarını bulup temizliyor, hiç yoktan iyidir.
Ancak programın yüklenmesi sırasında Revo Uninstaller kayıt tutmuşsa(Agent mode gibi birşeydi yanlış hatırlamıyorsam), yüzde 90'ını temizliyor, yine de kullanım sırasında oluşan bazı kayıtları bulması mümkün değil ki bu girdiler benim tahminime göre yüzde 10 civarına denk geliyor.

CCleaner ve Bleachbit programları çok bariz bazı kayıtlar dışında temizlik yapmıyor.
Benim gördüğüm en detaylı arama yapan, Advanced SystemCare içerisinde paralı yani profesyonel versiyonundaki temizleyici.
Bu tür programlar Windows 7 için güvenle kullanılabilir ama Windows 10 için ben de temkinliyim çünkü en ufak nemden ötürü bozulmaya meyilli bir sistem olduğundan, henüz bu tür faaliyetler için olgunlaşmadı.
--- Gönderi Güncellendi ---
Düzeltme: UserPrefencesMask değeri 32 bit değil 64 bit yani 64 adet ayar tek bir girdi üzerinde saklanıyor ama bazılarına atama yapılmamış, ileride yeni efektler gelirse diye rezerve edilmiş.
 

Ben Kenobi

Müdavim
Müdavim
Katılım
6 Kasım 2011
Mesajlar
7,337
Reaksiyon puanı
3,156
Puanları
1,358
Bugün regedit kayıtlarına bakarken ilginç birşey keşfettim.
Herhangi bir klasöre gelin(masaüstü hariç) naber.txt isimli bir dosya üretin ve içine rastgele harfler doldurun.
Sonra iki dakika bekleyin, dosyanın oluşturulma tarihi atıyorum 8:32 ise 8:34'e kadar bekleyin.
Dosyayı silin ve hemen aynı isimde ve uzantıda tekrar bir dosya oluşturun, dosyanın oluşturulma tarihine bakın, saat 8:34 olmasına rağmen 8:32 yazıyor olmalı.
Bu özellik "File System Tunneling" denen bir algoritmadan kaynaklı ve Windows 95 yılında Quantum mekaniklerinden etkilenilerek implemente edilmiş.
Ne işe yaradığını merak eden varsa yazayım.
 

Ben Kenobi

Müdavim
Müdavim
Katılım
6 Kasım 2011
Mesajlar
7,337
Reaksiyon puanı
3,156
Puanları
1,358
Misal Adobe Photohop ile çok büyük 1GB'lık resim yapıyorsun, tam resmi kaydederken birşey oldu(elektrikler kesildi, mavi ekran hatası oldu, program hatası oldu)
Böyle bir durumda hem yeni resmi kaydedememiş olacaksın, hem de eski resmin yarısı yeni resimle kaydolacağı için dosyayı açtığında tüm renklerin birbirine girdiğini göreceksin.
Bu durumu engellemek için programlar şu çözümü kullanır.
Dosyayı Temp klasöründe bir yere kaydeder, eski dosyayı siler, Temp içerisindeki dosyayı kaydedilmek istenen yere taşır.
Eğer kaydetmede sorun olursa eski resim olduğu gibi durur, yeni resmin yarısı da Temp klasörü içerisinde bozuk dosyada kalır, zaten bu klasör belli aralıklarla temizlenir.
Taşıma esnasında yukarıda bahsettiğim sorunlar olsa bile programlar bunu algılayıp Temp'deki dosyayı tekrar taşıyarak(eğer başka programlar tarafından silinmediyse) kurtarma işlemi yapabilir yani her türlü kurtarılır. (Bu yüzden Office gibi programlar her türlü hatadan sonra kaldığı yerden devam edebilir)
Bunun bir sorunu var.
Dosyayı sıfırdan Temp üzerinde üretince dosyanın üretim tarihi sürekli değişir.
Halbuki biz üretim tarihi değişmesin ama modifikasyon tarihi değişsin istiyoruz.
Bu yüzden bir dosya silindikten sonra 15 saniye boyunca cache içerisinde kalır ve aynı isimle, aynı klasörde, yeni bir dosya oluşturulursa, üretim tarihi o dosyaya aktarılır.
 

KNMX

Dekan
Katılım
2 Temmuz 2017
Mesajlar
6,936
Reaksiyon puanı
3,747
Puanları
293
Kuzennn abii.. çabuk gel linux kurdurtturcam sana... Kuzenimle görüşme imkanımız yok, linux kuramıyorum. Ve yine böyle bir konu :( linuxuma bir an önce kavuşmak istiyorum
 
Üst