Makale Özeti

Uygulama etki alanını anlayabilmek için bazı temel kavramları irdeleyelim.

Makale

Uygulama Etki Alanı

Uygulama Etki Alanı

Uygulama etki alanını anlayabilmek için bazı temel kavramları irdeleyelim.

Host Kavramı
Windows işletim sistemi CLR tabanlı uygulamaların çalışmasını desteklemez. CLRyi desteklemek için CLR host kullanır. Her çeşit uygulamaya başlamak için çalışma zamanı hostuna ihtiyaç vardır. Çalışma zamanı hostu, CLR içindeki işleme cevap verecek uygulamanın yüklenmesini, işlem içinde uygulama etki alanı oluşmasını, uygulama etki alanı içinde kullanıcı kodlarının yüklenmesini , ve kodun uygulama etki alanı çerçevesinde çalışmasını sağlayan bir uygulamadır. CLR farklı uygulama tiplerini destekler. .Net Framework, Asp.Net, Internet Explorer gibi hostları içerir.


Assembly
Assembly programın kendi kendisini tanımlamasını sağlayan .Net uygulamalarının temel yapı bloğudur. Çalışma zamanında uygulamanın içeriğini tam olarak anlayabilmesini ve uygulamaya bağlı tanımlanan kurallara uyulmasını sağlayan bir altyapıdır. Assembly; uygulamanın kendisine ait kimlik bilgilerini, mesela çalışırken hangi bileşenleri kullanacağını, kendi üzerinde taşımasını sağlar. Bu sayede uygulamamız başka bir makineye taşınıp, yerleştirildiğinde hiçbir sorun yaşamadan çalışmasına devam eder. Assembly; çalışırken hangi bileşenleri kullandığını taşımasının yanında, assembly versiyon numarasını, güvenlik ayarlarını da üzerinde taşıyarak uygulamamızın taşındığı yere adaptasyonunu kontrol eden dosyalar topluluğudur.

Thread
Uygulamanın bilgisayarda çalışmayan hali program, çalışan hali ise işlemdir. Bilgisayarın çalışma mantığında bir anda sadece bir işlem yapılır. Program çalıştığında meydana gelen işlem bittiğinde, işlemin kullandığı alanı yeni bir işlem için boşaltılır. Bilgisayarımızdaki işletim sistemi işlemler arasındaki bellek kullanım sırasını kontrol eder.
Threadler bir işlemin parçalarıdır. Bu sayede vb.net bize threadlere bölünmüş halde çalışabilen program tasarlamaya ortam sağlar. Uygulamalar işlem bazında değil de, thread bazında çalışır. Bu sayede performans artışı sağlanır.

Her çalışma zamanında, bütün yönetilen kodlar uygulama etki alanında yerleşir ve threadler ile çalışırlar.

Uygulama etki alanı ile thread arasında birebir karşılıklı ilişki yoktur. Birçok thread herhangi bir zamanda tek uygulama etki alanında çalıştırılabilir. Ve threadler tek bir uygulama etki alanı ile sınırlandırılmazlar. Bu sayede, her bir uygulama etki alanı için yeni bir thread oluşturulmak zorunda kalınmaz. Programın herhangi bir yerinde, herhangi bir thread uygulama etki alanı içinde çalıştırılabilir.
CLR hangi threadin hangi uygulama etki alanında çalıştığını tutar. Thread.GetDomain metodu ile etki alanı içinde herhangi bir zamanda çalıştırılan bir thread çağırılabilir.


Uygulama Etki Alanı
Windowsta uygulamaların çalışması için gerekli olan kodlar ve diğer bilgiler uygulamanın içine gömülü biçimdedir. Uygulamanın bu şekilde kendi kendini sınırlamasıyla, çalışan diğer uygulamalardan korunmuş olur. Herhangi bir windows uygulaması direk başka bir windows uygulamasına erişemez ve ondan etkilenemez. Bu sayede, herhangi bir programın içinde bir sorun oluşursa, onun zararı yalnızca kendine dokunur. Bu izolasyonun avantajının yanında dezavantajı da vardır. Herhangi bir programın, kendine ait işlemleri gerçekleştirmesinin sonunda çıkan bilgileri, başka programların kullanması için birçok altprogram gerekir. Buna karşılık .net uygulamalarında programların birbirinden izolasyonu, windows işletim sisteminin sağladığı yapıya ek olarak uygulama etki alanları ile daha yüksek seviyede sağlanır. CLR (Comman Language Runtime) .net uygulamaları için yönetilebilir bir ortam sağlamaktadır. Bu ortam kullanılan nesnelerin yaşam sürelerini denetleme, hata ayıklama gibi işlemleri yapacak servisler sunar. Kod CLR tarafından çalıştırılır. CLRda, program sınırları haricinde herhangi bir kaynak kullanılmaz. CLR tek bir uygulama için, birden fazla uygulama etki alanı kullanılmasını sağlar. Aynı zamanda uygulamalar arasında izolasyonu aynı seviyede tutar. Bu şekilde programın izolasyonu ile güvenliği sağlanır. Bu izolasyonun temel ünitesi uygulama etki alanıdır. Her uygulama etki alanı kendi yapılandırma ayarlarını içerir.
Uygulama etki alanı ile, özel uygulamalar bütün işlemler kesilmeden, durdurulabilir. Kullanılan uygulama etki alanı tek uygulama içinde kodun çalışması bittikten sonra kullanılan hafıza alanının geri yüklenmesini sağlar. (Assembly özel olarak geri yüklenemez. Yalnızca bütün etki alanının tamamını geri yükleyebilirsin.)

Bir çok uygulama için kendi uygulama etki alanımızı oluşturma ihtiyacımız olur. Herhangi bir uygulama etki alanıı için gerekli olan çalışma zamanı hostunu oluşturabiliriz. Eğer kendi çalışma zamanı hostunuzu oluşturursanız , uygulama etki alanıi oluşturabilir ve yapılandırabilirsiniz.

Default AppDomain

Default AppDomain, CLR tarafında otomatik olarak oluşturulan , işlem başlangıcında tanımlanan uygulama etki alanıdır. Default etki alanı, işlem sona erdirilmeden, sonlandırılamaz. Bir çok host, default etki alanı içinde kod çalıştıramaz. Bunun sebeplerinden bir tanesi; default etki alanı, işlemlerden bağımsız olarak kapatılamaz. Diğeri ise güvenlik ve izolasyondur. Güvenlik ve izolasyon, kullanıcı kodu ve host kodunun çalıştırılması için farklı uygulama etki alanına ihtiyaç duyabilir. Bunun yerine, hostlar güvenlik ve izolasyon ayarlarıyla birlikte uygulama etki alanları oluştururlar.

Bir CLR uygulaması oluşturulduğunda, kullanacağı AppDomain oluşturulur. Birinci olarak oluşturulan AppDomain, default AppDomain olarak isimlendirilir. Bu default AppDomain uygulama varoldukça geri yüklenemez. Diğer AppDomain host işlemleri veya yönetilen assembly tarafından ihtiyaç duyulduğunda oluşturulur.

Uygulama etki alanı ile Assembly arasındaki ilişki
Uygulamayı çalıştırmadan önce, uygulama içinde assemblyi yüklemek zorundayız. Tipik bir uygulama, uygulama etki alanı içinde birden çok assemblynin yüklenmesine sebep olur.Genel olarak CLR uygulama etki alanı içinde uygulamanın referansı olan bir assembly yükler. bu yolla, assemblynin kodları ve verileri uygulamanın onları kullanım çerçevesinde izole edilmiş olur. Eğer bir assembly, birçok etki alanı tarafından bir işlem içinde kullanılıyorsa, assembly kodları bütün etki alanları tarafından assemblynin referansı ile ortak olarak kullanılabilir. Bu durum çalışma zamanında belleğin kullanımı azaltır. Assembly kodlarını ortaklaşa kullanma yöntemi, aynı DLL referansının işlemler arasında Microsoft Win32 API LoadLibrary ortaklaşa kullanması gibidir. Çalışma zamanı hostu assemblynin yüklenmesine karar verir.

Assembly içindeki bir kaynağa referans verildiğinde, kaynağa CLR tarafından otomatik olarak erişilir. Referans vererek otomatik olarak o assembly’e bağlanılmasını sağlarız.
Her bir etki alanı içinde assembly ile ilgili farklı ayarlara izin verildiğinde, assembly uygulama etki alanları arasında paylaşılmaz.


Uygulama etki alanı niçin önemli?

AppDomain, standart Windows uygulamaları gibi işler. Böyle olmasına rağmen AppDomain niçin önemli? Bunun temel dört sebebi var:

• Bir AppDomain kendisiyle diğer AppDomain’ler arasında izolasyonu sağlar. Bir AppDomain’in diğer AppDomain’le haberleşmesi gerektiğinde, .Net Remoting gibi bazı mekanizmaların kullanılma zorunluluğu ile, standart Windows uygulamalarından ayrılır. Çoklu AppDomain uygulamalarındaki ve standart windows uygulamalarındaki işlemler arasındaki tek fark, AppDomain’lerde ortak bir hafıza birimi kullanılmasının gerekli olmaması .

• .net içinde assembly ‘ye direk olarak müdahale edilemez. Eğer böyle bir duruma ihtiyaç olursa, AppDomain assemby yi baştan yükleyebilir.

• AppDomain’de farklı yapılandırma ve güvenlik yöntemleri uygulanır.

• AppDomain mantıksal yapı olarak .Net threadlerinin çalışma yapısındadır.


Kodların çalıştırılması
Genel olarak host; yönetilen kod ve yönetilmeyen koddan oluşur. İşlem için CLR tarafından yüklenen ve başlangıçta CLR host tarafından kullanılan yönetilebilir kodlar vardır. Default AppDomain içinde çalışan yönetilen kod, kullanıcı kodlarının içinde bulunduğu uygulama etki alanının oluşması için gerekli bilgileri içerir. Çalıştırma yönetilmeyen kod içerisinden başladığı için bütün CLR hostlar yönetilemez kodlar içermek zorundadır. CLRnin içinde çalışan bütün kodlar assemblynin bir parçası olmak zorundadır.

.Net Framework, hostun kullanabileceği CLR yapılandırması için yönetilemeyen kodların ayarlanmasını, işlemlerin CLR içinde yüklenmesini, Default AppDomain içindeki yönetilen kodların yüklenmesini, ve yönetilemeyen koddan yönetilen koda çevirimi sağlar.

Yönetilen kod aşamasında yapılan diğer bir işlem kullanıcı kodu çalışırken işlem içinde uygulama etki alanı oluşturmaktır. Uygulama etki alanının oluşturulması ile kod izolasyonu , güvenlik ve assembly ile ilgili kriterleri belirlenir.

Oluşturulan bir veya birden fazla uygulama etki alanı içindeki kullanıcı kodunun işlem içinde yönetilen kod ile çalıştırması ile uygulama etki alanı içinde işlemler gerçekleştirilir.

Uygulama etki alanı içinde hostun yönetilen kısmındaki kod, kullanıcı kodu çalıştırıp uygulama etki alanı oluşturma isteğinde bulunduğunda, uygulama etki alanında oluşturulur. Yönetilen kod ile çalışırken, yapılan işlemler yönetilen kod etrafında gerçekleştiği için performans artışı elde ederiz. Eğer hostta yönetilen kodlar olmazsa, her “kullanıcı – host” etkileşiminde yönetilmeyen koddan yönetilen koda dönüşüm gerçekleştirmek zorunda kalınır.


Öznur KARAKUŞOĞLU
oznurkarakusoglu@hotmail.com