Bu güne kadar sizlere yazdığım makalelerde, çektiğim görsel derslerde veyahut birebir verdiğim derslerde sürekli Stack yahut Heap gibi bellek kavramlarından bahsettim.

Bu güne kadar sizlere yazdığım makalelerde, çektiğim görsel derslerde veyahut birebir verdiğim derslerde sürekli Stack yahut Heap gibi bellek kavramlarından bahsettim. Ne yazık ki bu kavramlar üzerinde geniş bir anlatım veya diğer bellek yerlerine atıfta bulunma gibi bir yeltenmede bulunmadım. Bu makalemizde belleğin bir tek Stack ve Heap kısımlarından ibaret olmadığını anlayacak diğer kısımlarla birlikte tüm bellek anatomisine hakim olacağız. Storage, nesnelerin bellekteki yerini ifade ettiğimiz kavramdır. Hadi gelin şimdi belleğimiz hangi bölümlerden oluşmaktaymış detaylıca inceleyelim…

Stack Bölgesi

Stack bölgesi, değişkenlerimizin türüne göre işlem gerçekleştiren bir yapıya sahiptir. Eğer elimizdeki değişken bir Değer Tipli(Value Type) değişken ise değişkenin adını ve değerini tutmaktadır. Yok eğer değişkenimiz Referans Tipli(Reference Type) değişken ise değişkenin sadece referansını tutmakta, eğer o referansın varsa işaret ettiği bir nesne Heap bölgesinde tutulmaktadır.

Heap Bölgesi

C# programlama dilinde oluşturduğumuz nesneler bu alanda tutulmaktadır. Bu alandaki nesnelere Stack bölgesindeki referans aracılığıyla erişebilmekteyiz. “new” anahtar sözcüğüyle Heap bölgesinde nesne üretebilmekteyiz. Stack bölgesi, sadece referans yahut değer tipli değişkenleri tuttuğundan dolayı Heap bölgesine nazaran daha hızlı çalışmaktadır.

Register Bölgesi

Stack ve Heap bölgelerine nazaran oldukça hızlı olan Register bölgesine mikroişlemci diğer alanlara nazaran kat be kat daha hızlı erişebilmektedir. Değişkenlerin değeri belleğe değil Register bölgesine gönderilip haliyle ilgili değişken çağrıldığı zaman değeri için her defasında belleğe gidilmez, direkt olarak Register bölgesinden değeri alınabilir. Buda bize performans ve maliyet açısından olumlu neticeler doğurmaktadır.

Hatta C#’ta volatile Anahtar Sözcüğü başlıklı yazımda Data Register bölgesinin bu artısından dolayı doğabilecek olası hatayı ortadan kaldırmak için volatile anahtar sözcüğünü kullanmaktayız. Nihayetinde bir değişkenin değeri direkt olarak belleğe yansıtılır lakin Register alanında eski değer tutuluyor olabilir. Tabi o değişkeni çağırdığımızda Register’da ki eski değerine ulaşmamız mikrosaniyelik iş gerektirdiği için düşük ihtimaldir ama asenkron bir yaklaşım sergiliyorsak bu ihtimal güçlenmektedir. İşte böyle bir durumda derleyici ve mikroişlemcinin insafına kalmaktansa olası hatalara mahal vermemek için mikroişlemcinin ilgili değişkenin değerini Register’dan değil bellekten okumasını isteriz.

Static Bölge

Programlama sürecinde kullanacağımız elemanlarda nesnelere ihtiyacımız yoksa ilgili elemanı static olarak işaretliyorduk. Haliyle bu elemanlar sınıf isimleri üzerinden erişilebilir yapılar haline geliyordu. Bir eleman static olarak ayarlanıyorsa ve nesne olmadan çalıştırılıyorsa bir yerde fiziksel olarak bu eleman tutulmalıdır. İşte o alan Static bölgesidir. Bellekte herhangi bir sabit bölgedir diyebiliriz.

Bir nesne oluşturup, nesne üzerinden bir metodu çalıştırabiliriz. Lakin o nesneyle işimiz bittiği yahut fiziksel olarak sildiğimiz vakit nesnenin yaşam döngüsü programın çalışma sürecinin belirli bir parçasını teşkil etmektedir. Ama metodumuzu static olarak belirlersek Static bölgede tutulacağı için bu metod programın tüm çalışma sürecinde fiziksel olarak bulunacaktır.

Constant Bölge

C#’ta const anahtar sözcüğüyle oluşturduğumuz sabit değişkenlerin tutulduğu alan Constant alanıdır. Bu değişkenler sadece okunabilir olduklarından dolayı değerleri değiştirilemez. Ee doğal olarak ROM(Read Only Memory)‘de tutulurlar.

RAM Olmayan Bölge

Bildiğiniz HardDisk, Flash Bellek vs. gibi bellek türleridir.

Bellek kavramlarını teorik olarak bilmek, yapıların nerede ne amaçla üretildiğini daha geniş kapsamlı kavrayabilmeye yaramaktadır.

Gençay Yıldız ın tüm makalelerine bu linkten ulaşabilirsiniz. 

 

İlgili Makaleler

Bu yazıya 0 yorum yapılmış.

Yorum Gönder