Makale Özeti

Önceki makalede geleneksel bir Win32 programının aşağı seviyeli çalışması ile ilgili bazı bilgilere genel hatları ile değinmiş ve (process, çizelgeleme, thread gibi) temel kavramları incelemiştik.

Makale

Multi Thread Programlama2

 Multi Thread Programlama - 2

Giriş

          Önceki makalede geleneksel bir Win32 programının aşağı seviyeli çalışması ile ilgili bazı bilgilere genel hatları ile değinmiş ve (process, çizelgeleme, thread gibi) temel kavramları incelemiştik. Bu makalede ise; .NET ortamında multi thread programlamanın tam anlamı ile anlaşılabilmesi için gerekli bir başka konu olan "Uygulama Domain" leri konusunu ele alacağız.

Geleneksel Win32 Sistemlerinde Bellek Yönetimi

         Win32 sistemlerinde çalışan her process, o an sistemde çalışmakta olan tek process in kendisi olduğunu zannederek çalışır. Yani process, aynı anda çalışan diğer process lerin ve dolayısı ile "multi processing" çalışmanın farkında olmadan çalışır.

         Windows sistemlerinde çizelgelemeye giren her process; çalıştığı quanta süresi boyunca 4 GB büyüklüğündeki bir bellek bölgesini tek başına kullanır. Win32 sistemleri çalışmakta olan her process e 4 GB büyüklüğünde bir adres alanı sunar. Process ler bu alanın düşük anlamlı 2 GB sini kendisi, yüksek anlamlı 2 GB sini ise işletim sistemi ile paylaşarak kullanır. Ancak burada önemli olan nokta; 4 GB lik adres alanının söz konusu process in aktif olduğu quanta süresi boyunca, çizelgelemede bekleyen diğer process lerden ayrı ve izole edilmiş bir biçimde kullanılıyor olmasıdır.

         Windows işletim sistemi, VMM (Virtual Machine Manager) olarak anılan bir kernel servisine sahiptir. Bu servis fiziksel olarak aynı makine üzerinde yarattığı farklı sanal makinelerde, process yönetimi ve bellek sayfalama gibi aşağı seviyeli işlemlerin yapılmasından sorumludur.

         Çizelgeleme kuyruğunda bekleyen her process aktif olduğu andan itibaren VMM tarafından yaratılan 4 GB lik adres alanına yüklenir. Quanta süresi boyunca aktif olan process kod ve data bakımından bu adres alanının 2 GB lik düşük anlamlı bölgesini kullanarak çalışır. Quanta süresinin bitiminde ise, bu alan (sıradaki process için tahsis edilmek üzere) boşaltılır. Söz konusu process e tekrar sıra gelinceye kadar bu bilgiler disk üzerindeki sanal belleğe aktarılır (swap işlemi). Böylece çizelgelemede bekleyen tüm process ler, aynı adres alanını sıra ile kullanma fırsatını bulmuş olur.

         İlk makalede bir process in alt parçaları olarak tanımladığımız thread ler açısından konuya baktığımız zaman; her bir thread in TLS (Thread Local Storage) ve Call Stack olarak anılan özgün bellek bölgelerine sahip olduğunu görürüz. Ayrıca process düzeyinde tanımlı, Shared Data olarak isimlendirilen veriler ise; aynı process e ilişkin thread ler arasında paylaşılabilir. Aşağıdaki şekilde aynı process e ilişkin "Thread A" ve "Thread B" isimli thread lerin bellek paylaşımı örneklenmiştir.

Şekil2.1


Uygulama Domain leri

        Geleneksel Win32 uygulamalarında process ler, yukarıda anlatıldığı gibi, birbirlerinden ayrık ve izole edilmiş adres alanlarında çalıştırılabilmekteydi. Ancak .NET uygulamalarında izolasyon, işletim sisteminin sunduğu olanakların ötesinde, uygulama domain inleri ile daha üst düzeyde sağlanabilir.

         Uygulama domain leri; fiziksel bir process in içerisinde çalışan bir dizi mantıksal managed uygulamadır. Bu anlamda bir process birden fazla uygulama domain ine ev sahipliği yapabilir. Bir ugulama domain i ise; birden fazla thread e bölünmüş durumda olabilir. Aşağıdaki şekilde aynı process e ilişkin iki adet uygulama domain i ve bu domain lerin içerdiği thread ler örneklenmektedir.

Şekil2.2

        Uygulama domain leri AppDomain isimli sınıf kullanılarak programatik olarak yaratılabilir. Bu sınıf "mscorlib" isimli assembly içerisindeki, "system" namespace i altında bulunur. Bu sınıf türündeki bir nesne kullanılarak, yeni bir uygulama domain i yaratılabileceği gibi, yaratılan domain in davranışları da kontrol edilebilir. Yeni bir uygulama domain i yaratma işlemi işlemi, AppDomain sınıfına ait CreateDomain() isimli shared fonksiyon kullanılarak gerçekleştirilebilir. Bu fonksiyonun dört farklı overload versiyonu bulunmaktadır. Aşağıda prototipi verilen versiyon; parametresine girilen isimde yeni bir uygulama domain i yaratır ve yarattığı domain i temsil edecek, AppDomain sınıfı türünde bir nesne referansı döndürür.

Overloads Public Shared Function CreateDomain( _
                                                                       ByVal friendlyName as String) as AppDomain

        Aşağıdaki konsol uygulamasında, bir uygulama domain inin yaratılması ve bu domain e ait iki özelliğin uygun property ler kullanılarak elde edilmesi örneklenmiştir.

Module Module1
    Sub Main()
        Dim oAppDom As AppDomain 
        oAppDom = AppDomain.CreateDomain("YeniDomain") 

        Dim sDomInfo As String 
        sDomInfo &= "İsim : " & oAppDom.FriendlyName & vbNewLine
        sDomInfo &= "Directory Path : " & oAppDom.BaseDirectory         

        Console.WriteLine(sDomInfo) 
    End Sub
End Module

        Örnekte oAppDom ismli nesne, CreateDomain() fonksiyonundan dönen, AppDomain sınıfı türündeki referans kullanılarak türetilmiştir. Daha sonra bu nesnenin FriendlyName ve BaseDirectory isimli property lerinin içerdiği değerler; sDomInfo isimli değişken e atanmış ve bu değişkenin içeriği konsol ekranına yazdırılmıştır. Örneğin ekran çıktısı aşağıdaki gibidir;

Şekil2.3

        Uygulama domain lerinin kullanımı, özellikle bir assembly nin birden fazla kopyasının aynı process e yükleneceği durumlar için efektif olmaktadır. Ancak bu optimizasyona tabi tutulmak istenen assembly ler mutlaka "domain neutral" olmalıdır.


Hazırlayan : Aykut TAŞDELEN
e - mail : aykutt@csdos.org
Yararlanılan
Kaynaklar :
Windows API Notları (Kaan ASLAN)
Programming Microsoft Visual Basic .NET (Francesco BALENA)