Ana belleğin işlemler arasında paylaştırılmasına ana bellek yönetimi ya da bellek yönetimi (Memory Management) adı verilir. İşletim sisteminin bu amaçla oluşturulan kesimine de (memory Manager) adı verilir.
Bellek yöneticisinin görevi, belleğin hangi parçalarının kullanımda olduğunu, hangi parçalarının kullanılmadığını izlemek, süreçlere bellek tahsis etme (allocate), tahsis edilen belleği geri almak ve bellek ile disk arasındaki takas işlemlerini gerçekleştirmektir. Bellek yönetimi dendiğinde genellikle belleğin yığın (heap) alanında tahsis edilmiş olan bellek alanlarının yönetimi kastedilir.
İşletim sisteminde yürütülen programlar ya da gömülü sistem yazılımları kendi içlerinde bellek yönetimi sergileyebilirler. IBM OS/360 ve ardıllarında bellek işletim sistemi tarafından yönetilirken, Unix ve benzeri işletim sistemlerinde bellek uygulama tarafından yönetilir.
Yazılım geliştirmede, bellek yönetimi ilk anlardan beri önemli bir konu olmuştur. Programlama dili teorisi alanında yaşanan gelişme ve iyileştirmeler, yazılım geliştiricilerin farklı yaklaşımları ve ihtiyaçları nedeniyle bellek yönetimi konusunda pek çok yöntem ortaya çıkmıştır. Bu yöntemler genellikle otomatik bellek yönetimi ve manuel bellek yönetimi olacak şekilde ikiye ayrılmaktadır.
Tahsis edilmiş bellekler serbest bırakılana kadar tekrar tahsis edilemezler. Bu nedenle artık kullanılmayan bir bellek tahsisinin serbest bırakılması önemlidir. Tahsis edilen bellekler artık ihtiyaç duyulmadığı takdirde serbest bırakılmazlarsa, bellek sızıntısına (memory leak) neden olurlar.
Amaçlar
Bir işletim sisteminin bellek yönetiminin sonuçları şunlardır:
- Bellekteki herhangi bir işlemi başka bir yere aktarabilmelidir.
- Birden fazla işlem veya kullanıcı olduğunda bir kullanıcını diğer kullanıcını alanlarına girmeleri önlenmelidir.
- Kullanıcılar arası kaynak paylaşımını sağlamalıdır.
- Belleğin mantıksal alanlara bölünmesini sağlayarak bilgiye erişimi kolaylaştırmalıdır.
- Belleğin yetmediği durumlarda fiziksel başka bellek alanlarını yani hard diskleri kullanabilmelidir.
Manuel Bellek Yönetimi
Bir yazılım çalışma zamanında (runtime) bellek tahsisi (allocation) gerçekleştirmek istediğinde çekirdek (kernel) ile iletişim halindedir. Tahsis yöntemi farklılık göstermekle birlikte işletim sisteminin bellek yöneticisi tarafından ayrılan tahsisin konumu önceden bilinmediğinden bir referans (işaretçi / pointer) ile erişilir. Program tarafından tahsis edilen bu alanlar programın kendi içerisinde sergilediği bellek yönetimine kalmaktadır. Program tahsis ettiği alanları artık ihtiyacı kalmadığı durumlarda serbest bırakarak (deallocation) belleği geri kazandırır ve belleğin ilgili bölümleri artık tahsis edilebilir hale gelir. Bu tahsisler geliştirici tarafından manuel bir şekilde gerçekleştirilir ve serbest bırakılır.
Geliştirici ne zaman bellek tahsis etmesi ve serbest bırakması gerektiğine kendisi karar vermelidir. Geliştiricilerin bellek yönetimini verimli ve doğru bir şekilde gerçekleştirmemeleri çeşitli bellek sorunlarına yol açabilir. Örneğin C programlama dilinde artık kullanılmadığından serbest bırakılması gereken tahsisler serbest bırakılmadığında bellek sızıntısına (memory leak) neden olabilir. Bu nedenle geliştirici tahsisleri sürekli olarak gözetmeli ve doğru konumlarda artık serbest bırakmaya özen göstermelidir.
#include <stdio.h> #include <stdlib.h> int main() { int n = 20; // n tane int tutabilecek bir bellek alanı tahsisi int *list = (int*)(malloc(n*sizeof(int))); /* programın işevi */ // Tahsis edilen belleğin serbest bırakılması free(list); list = NULL; return EXIT_SUCCESS; }
Olumlu Yönleri
Manuel bellek yönetiminde programın bellek yönetimi üstünde yazılım geliştirici tam yetkilidir. Ne zaman tahsis edileceğine ve serbest bırakılacağına tamamen kendisi karar verebilir. Bu nedenle bellek tahsisleri konusunda istediği şekilde yönetim sergileyebilir.
Manuel bellek yönetiminde yazılım geliştirici tarafından tahsis yönetimi yapıldığından, genellikle bellek tahsis etmek, serbest bırakmak ve yeniden boyutlandırmak gibi temel işlevler kullanılır, bu işlevler çoğu uygulamada (implementation) ara algoritmalar yoktur ve yalnızca işlevler görevini yaparlar. Bu nedenle manuel bellek yönetimi performansı en düşük oranda etkileyen bellek yönetimi yöntemlerinden biridir.
Olumsuz Yönleri
Bellek tahsislerinin yazılım geliştiriciler tarafından yönetilmesi gerektiğinden çeşitli güvenlik sorunlarına yol açabilecek hatalar yapılabilir. Örneğin tahsis edilen belleğin gözden kaçarak serbest bırakılmaması sonucu bellek sızıntısı meydana gelebilir ya da tahsis edilen belleğin doğru kullanılmamasından kaynaklı olarak çeşitli bellek hataları yapılabilir.
Bu yöntem yazılım geliştirme sürecinde önemli bir efor gerektirebilir, geliştirme ve test sürecini uzatabilir.
Otomatik Bellek Yönetimi
Otomatik bellek yönetimi, bellek yönetimini otomatik hale getiren yöntemlere verilen genel isimdir. Pek çok modern programlama dilinde otomatik bellek yönetimi yaklaşımına rastlanmaktadır. Çalışma zamanında programın bellek yönetiminin kendi içerisinde otomatik bir şekilde gerçekleştirilmesine dayanır. Bu yaklaşımın yaygın örneklerinde geliştiricinin bellek yönetimini düşünmesi gerekmemektedir. Otomatik bellek yönetimi içerisindeki tekniklerin mantığına dayanan ancak birebir aynı olmayan uygulamaları (implementation) bulunmaktadır.
Olumlu Yönleri
Yazılım geliştiriciyi bellek yönetimini düşünmekten büyük oranda ya da tamamen kurtarır. Yazılım geliştirme sürecindeki belek yönetimi kaynaklı hataları azaltır, maliyeti ve geliştirme zamanını düşürür. Bellek yönetimi kolay hale geldiğinden ilgili programlama dilini kullanarak geliştirme yapmak daha kolay hale gelir, bu nedenle teorik olarak daha fazla geliştirici tarafından kullanılabilir.
Olumsuz Yönleri
Yazılım geliştiricinin yazılımın bellek yönetimi konusundaki yetki alanlarını sınırlandırır ve kontrolünü azaltır. Çoğu durumda, belleğin incelikle yazılım geliştirici tarafından yönetilmesi gereken senaryolarda iyi bir seçenek değildir.
Performans açısından kritik yazılımlar için olumsuz etki doğurabilir. Çöp toplama tekniğine göre programın çalışma zamanında (runtime) büyük oranda çöp toplama yükü bulunabilir, ayrıca yönteme göre daha fazla bellek kullanımı gibi sorunlara yol açabilir.
Çöp toplama genellikle otomatik olarak derleyici (compiler) tarafından uygulanan bir derleyici özelliği olduğundan, derleyici kaynaklı bir bellek yönetimi hatası meydana gelmesi durumunda yazılım geliştirici bu sorunun çözümü için daha eski derleyici sürümleri kullanmak zorunda ya da daha yeni sürümleri beklemek zorundadır.
Çöp Toplama (Garbage Collection)
Çöp toplama (Garbage Collection), program tarafından tahsis edilen ve artık kullanılamayan/erişilemeyen tahsislerin serbest bırakılmasına dayanan bir otomatik bellek yönetimi biçimidir, artık ihtiyaç duyulmayan bellek tahsislerine çöp (garbage) denir. Çöp toplama bir programın toplam çalışma süresinin önemli bir bölümünü oluşturabilir ve performansa olumsuz etki edebilir. Çöp toplamanın yürütülmesi öngörülemez olabilir, bu da yapılan performans testlerinde çöp toplama kaynaklı değişken sonuçlar elde edilmesine yol açabilir. Bununla birlikte programda dağılmış olarak önemli duraklamalar meydana gelebilir, bu duraklamalar çöp toplayıcı yürütüldüğü esnasında programın yürütülmesinin kilitlenmesinden kaynaklanmaktadır.
Çöp toplama kullanan dillere çöp toplanmış diller (Garbage Collected Languages) denir. Bir dilin ana tasarımı birden fazla bellek yönetim biçimini barındırabilmektedir. Örneğin bazı derleyiciler çöp toplama ve manuel bellek yönetimi arasında geliştiriciye bir seçim yapma imkânı sunmaktadır. Bir dilin çöp toplama sergiliyor olması için çöp toplamanın dilin ana tasarımına dahil olması ya da bir derleyici özelliği olması gerekmemektedir. Örneğin manuel bellek yönetimi sunan C ve C++ programlama dilleri için çeşitli çöp toplama uygulamaları (implementation) (Bkz. Boehm Garbage Collector) geliştirilmiştir.
Çöp toplama için referans sayımı ya da sahiplik gibi farklı yöntemler geliştirilmiştir.
İzleme (Tracing Garbage Collection)
Çöp toplama tekniği yaygın olarak çöp toplama takibi (Tracing Garbage Collection) ile gerçekleştirilir. Bu o kadar yaygın bir uygulamadır ki genellikle çöp toplama dendiğinde çöp toplama takibi kastedilmektedir. Çöp toplama izleme program içerisinde gerçekleştirilen tahsislerin kullanımlarını analiz eden ve kullanımda olmayan tahsisleri, bu tahsislere çöp (garbage) denir, tespit edip serbest bırakan bir çöp toplama tekniğidir.
Çöp izlemenin gerçekleştirilmesi için bazı izleme verilerinin çalışma zamanında depolanması gerekmektedir, bu da bir ek yük olarak yansımakta ve yazılımın bellek ayak izini artırmaktadır. Bu izlemenin gerçekleştirilmesi için kullanılan pek çok algoritma bulunmaktadır. Çöp toplama takibi bir derleyici özelliği olabilir ve derleyici tarafından çalışma zamanının bir parçası olarak sunulabilir. Örneğin C# ve Java programlama dillerinde çöp toplama takibi kullanılmaktadır ve bu yaklaşım çalışma zamanında tamamen otomatik bir şekilde yürütülür. Oluşturulan ilgili nesneler otomatik olarak çöp toplama takibine dahil edilir. Bir diğer yöntemde ise çöp toplama takibine dahil edilecek tahsislerin geliştirici tarafından bildirilmesi gerekir.
Nesne sonuçlandırma (object finalization) zamanlamasında çöp toplama takibi deterministik değildir. Çöp toplamaya tabii olabilecek duruma gelen her nesne eninde sonunda serbest bırakılacaktır lakin bunun gerçekleşme durumu öngörülemez. Çöp toplamanın ne zaman gerçekleşeceğine ya da gerçekleşmeyeceğine dair hiçbir garanti yoktur. Çöp toplama işlemi programın asıl algoritmasından kaynaklanmayan gecikmelere ve duraklamalara neden olup yürütme zamanının oldukça değişken bir hale gelmesine yol açabilir. Deterministik olmayan yapısı nedeniyle yeni bir nesne tahsis etmek bazen yalnızca nesnenin tahsis edilmesi şeklinde gerçekleşirken bazen uzun bir çöp toplama döngüsünün yürütülmesini tetikleyebilir.
package main import "fmt" type Car struct { Brand string Model string } func main() { // ptr heap tahsisli bir Car barındırmaktadır // tahsisin izlenmesi ve serbest bırakılmasını çöp toplayıcı üstlenmektedir ptr := &Car{"Ferrari", "330 P3"} fmt.Println(ptr.Brand, "-", ptr.Model) }
Referans Sayımı (Reference Counting)
Referans sayma ilgili tahsise yapılan her bir referansın sayılması ve referansların hepsinin sıfıra ulaşması durumunda tahsisin serbest bırakılmasına dayanır. Bu teknikte her referans kendisine referans eden bir sayma verisi bulundurur. Bu sayma verisi referans her kopyalandığında artırılır ve kopya her yok edildiğinde azaltılır. Referans sayma verisi sıfıra ulaştığında tahsisi kullanan bir program noktası olmadığından serbest bırakılır.
Referans sayma çöp toplama takibinde olduğu gibi doğrudan derleyici tarafından otomatik bir şekilde gerçekleştirilebilir ya da yazılım geliştirici tarafından ilgili bölümlerde referans sayma gerçekleştirilebilir.
Referans sayma deterministik bir çöp toplama performansı sergiler. Bunun nedeni program yürütülürken bir referansın oluşturulma, kopyalama ve serbest bırakılma noktaları her zaman sabit olduğundan referansın serbest bırakılma işlemi her zaman aynı algoritma adımında gerçekleşir.
Referans sayma için kullanılan sayma verisi çalışma zamanında ek bellek ayak izi anlamına gelir. Bununla birlikte referans sayma işlemi algoritmaya göre önemli miktarda çalışma zamanı yükü oluşturabilir. Bununla birlikte bazı problemlere sahiptir, bu problemlerin yok edilmesi amacıyla çeşitli yöntemler uygulanmaktadır ve bu yöntemler performansa olumsuz etki edebilmektedir.
Referans saymanın atomiklik (atomicity) sergilemesi gerekmektedir. Çok iş parçacıklı bir ortamda bir referansın aynı anda kopyalanması durumunda referans sayma doğru bir şekilde gerçekleşmeyebilir, bunu önlemek için referans sayma atomik bir şekilde gerçekleştirilmelidir. Bu atomiklik çok iş parçacıklı bir senaryo olmadığı durumlarda dahi küçük de olsa bir çalışma zamanı ek yükü oluşturur.
Referansın sayma verisi üstünde işlem gerektirecek herhangi bir durumun iş parçacıkları tarafından çok fazla tekrarlanması bu atomikliğin programın toplam çalışma süresinin önemli bir bölümünü oluşturmasına neden olabilir.
Referans saymanın diğer bir sorunu döngüselliktir. Örneğin iki referansın birbirlerine referans vermesi durumunda referans sayısının asla sıfırlanmadığı bir döngü oluşturulabilir, bu önlemek için çeşitli döngü algılama algoritmaları vardır.
Referans sayma çeşitli şekillerde uygulanabilir ve bu uygulamaların kendilerine has dezavantajları olabilir. Bazı referans sayma uygulamalarında referans sayma verisi sıfırlandığında tahsisin direkt serbest bırakılması yerine serbest bırakılmayı bekleyen tahsislerin bulunduğu bir bölümde listelenebilir ve periyodik olarak bu listedeki tahsisler serbest bırakılabilir.
Bir referans sayma verisinin sıfıra ulaşılması durumunda yok edilen tahsis de bir referans ise, bu sıralı bir referans sayma başlatabilir ve belirli durumlarda pek çok referansın sayma verisi sıfıra ulaştığından sıralı ve uzun bir serbest bırakmanın tetiklenmesine yol açabilir.
#include <iostream> #include <string> #include <memory> struct Car { std::string brand; std::string model; }; int main() { { // ptr heap tahsisli bir Car sınıfı üstünde referans sayımı gerçekleştiriyor // tahsis ptr ile birlikte 1 referansa sahip std::shared_ptr<Car> ptr(new Car{"Ford", "GT40"}); { // ptr2 artık ptr'nin tahsisine işaret ediyor // tahsisin referans sayısı 2'ye ulaştı std::shared_ptr<Car> ptr2{ ptr }; std::cout << ptr2->brand << " - " << ptr2->model << std::endl; } // ptr2 kapsam dışı kaldığından referans bir eksildi lakin serbest bırakılmadı // halen bir referans daha var, ptr tahsise işaret ediyor } // ptr kapsam dışı kaldı, referans sayısı 0 olduğundan tahsis serbest bırakıldı return EXIT_SUCCESS; }
Sahiplik (Ownership)
Sahiplik Rust programlama dilinin tasarımında benimsenen bir bellek yönetimi tekniğidir. Bu teknik çalışma zamanında çöp toplama amacıyla ek bellek ayak izi oluşturmaz, deterministik çalışır ve manuel bellek yönetimine ek olarak bir performans yükü yoktur. Manuel bellek yönetimi ile tamamen aynı çalışma zamanı maliyetine sahiptir.
Sahiplik kuralları derleyici tarafından kontrol edilir ve yönetilir. Bu da bellek yönetimi kurallarının ihlal edilmesi sonucunda derleyici tarafından hata belgelenmesine yol açacaktır. Bu sayede manuel bellek yönetiminde yazılım geliştirici tarafından yapılabilecek bellek yönetimi hatalarının engellenmesi ve tekniğin olumlu yönlerini korurken olumsuz yönlerinin ortaya çıkmasının engellenmesi amaçlanmaktadır.
Sahipliğin kuralları;
- Bir tahsisin her zaman bir sahibi olmalıdır.
- Bir tahsisin yalnızca tek bir sahibi olabilir.
- Sahibi olmayan bir tahsis kapsam (scope) dışına çıktığında serbest bırakılır.
Bu kuralları irdelemek gerekirse en önemli temel kural bir tahsisin her zaman bir sahibinin olması gerektiğidir. Bu kural sahiplik yaklaşımın kök kuralıdır. Sahibi olan bir tahsis farklı bir sahibe atandığında önceki sahip sahipliğini kaybeder zira aynı anda yalnızca tek bir sahip olma kuralı vardır.
Derleyicinin hata belgeleyeceği yerlerden birisi sahipliğin yanlış kullanımıdır. Sahipliğini kaybetmiş bir değişkeni kullanmak açıkça derleme hatasına neden olacaktır. Bu derleme zamanında gerçekleştirilen bir bellek güvenliği yaklaşımıdır.
Sahiplik tekniği bu noktaya kadar C programlama dilinde yapılan manuel bellek yönetiminden çok farklı değildir. Bir tahsis gerçekleştirildi ve yazılım geliştirici bir işaretçi ile bu tahsisin konumuna sahiptir, bu işaretçiyi farklı bir işaretçiye atayabilir ve bu bir sorun teşkil etmez. C ile geliştirilmiş bir programın tahsisin ne zaman boşaltılacağını anlamak gibi bir amacı yoktur. Bu nedenle yazılım geliştirici serbest bırakana kadar istediği gibi kullanmakta özgürdür lakin sonrasında yapılan bellek yönetimi hataları sonucunda çeşitli bellek sorunları ile karşılaşılabilir.
Rust, C programlama dilinin aksine derleme zamanında tahsisin nerede gerçekleşeceğini bilmek ister. Bunun için yalnızca tek bir sahip olmalıdır. O sahip izlenebilir ve yok edildiği durumda tahsisin serbest bırakılması gerektiği anlaşılmış olur. Tam olarak bu nedenden bir tahsisin tek sahibi vardır.
Sahipliği elinde tutan bir örnek yok edildiğinde, eğer halen elinde bulunduruyorsa doğal olarak başka bir noktada farklı bir sahip olamayacağından tahsisin serbest bırakılması gerçekleşir. Bu yaklaşım manuel bellek yönetiminin güvenli bir şekilde gerçekleştirilmiş olması için derleme zamanında (compile time) teşvik edilen bir türevi olarak düşünülebilir.
fn main() { let a = String::from("Merhaba sahiplik!"); let b = a; // a artık kullanılamaz zira a'nın tahsisinin sahibi b'dir. let c = b; // b artık kullanılamaz zira b'nın tahsisinin sahibi c'dir. let d = c; // c artık kullanılamaz zira c'nın tahsisinin sahibi d'dir. println!("{}", d); // "Merhaba sahiplik!" yazar. } // kapsam sonunda d yok edileceğinden, sahip olduğu tahsis serbest bırakılır.
Özellikler
bellek yönetim sistemleri genellikle aşağıdaki konuları içerir.
Yer değiştirme (relocation)
Sanal bellekli sistemlerde bellekteki programların farklı zamanlarda, belleğin farklı yerlerinde bulunabilmesi gerekir. Bunun temel nedeni, programın bir süreliğine bellekten dışarı götürülmesinin ardından tekrar geri getirildiğinde her zaman aynı bellek bölgesine yerleştirilmesinin mümkün olmamasıdır. Bu yüzden işletim sisteminin bellek yönetimi bellekte programların yerini değiştirebilmeli ve bu yer değiştirme sonrasında program kodu içindeki referansları doğru şekilde ayarlayarak her zaman bellekte doğru yeri işaret etmesini sağlayabilmelidir.
Koruma (protection)
Süreçler (process), başka süreçler için ilgili sürecin izni olmadan bellek başvurusu yapmamalıdır. Bellek koruması adı verilen bu mekanizma ile programdaki kötü niyetli ya da hatalı işleyen bir kodun diğer programların çalışmasını etkilemesi engellenir.
Paylaşma (sharing)
Farklı süreçler arasındaki bellek her ne kadar koruma altında olmuş olsa da uygun durumda farklı sürecin farklı bellek alanına erişip bilgiyi paylaşması mümkün olmalıdır.
Mantıksal yapılanma (logical organization)
Programlar genelde modüller şeklinde yapılandırılmıştır. Bu modüllerin bir kısmı gerek sadece okuma, gerekse veri değiştirme şeklinde başka programlar tarafından da kullanılabilir. Bellek yönetimi doğrusal fiziksel alanından farklı olan bu mantıksal yapılanmanın düzenlenmesinden sorumludur. Bunu sağlamanın yöntemlerinden birisi kesimlemedir (segmentation).
Fiziksel yapılanma (physical organization)
Bellek genellikle hızlı birincil depo ve yavaş ikincil depo şeklinde bölümlenmiştir (örneğin rastgele erişimli bellek RAM ve sabit disk gibi). İşletim sistemlerindeki bellek yönetimi bilginin bu bellek katmanları arasında taşınmasından sorumludur [4].
Ayrıca bakınız
- Sanal bellek (virtual memory)
- Sayfalama (paging)
- (Memory Management Unit)
Kaynakça
- ^ a b Sancaklı, Ali (29 Kasım 2020). . Technopat. 29 Kasım 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 14 Mart 2021.
- ^ . www.belgeler.org. 22 Mayıs 2003 tarihinde kaynağından arşivlendi. Erişim tarihi: 14 Mart 2021.
- ^ "What is Ownership? - The Rust Programming Language". doc.rust-lang.org. 19 Mayıs 2019 tarihinde kaynağından . Erişim tarihi: 10 Aralık 2022.
Dış bağlantılar
- [1] http://yunus.hacettepe.edu.tr/~yurdugul/3/indir/isletim.pdf 5 Ekim 2011 tarihinde Wayback Machine sitesinde .
- [2]
- [3] http://www.bote.gazi.edu.tr/boteabd/bto303/Notlar/Hafta6.pdf[]
wikipedia, wiki, viki, vikipedia, oku, kitap, kütüphane, kütübhane, ara, ara bul, bul, herşey, ne arasanız burada,hikayeler, makale, kitaplar, öğren, wiki, bilgi, tarih, yukle, izle, telefon için, turk, türk, türkçe, turkce, nasıl yapılır, ne demek, nasıl, yapmak, yapılır, indir, ücretsiz, ücretsiz indir, bedava, bedava indir, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, resim, müzik, şarkı, film, film, oyun, oyunlar, mobil, cep telefonu, telefon, android, ios, apple, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, pc, web, computer, bilgisayar
Ana bellegin islemler arasinda paylastirilmasina ana bellek yonetimi ya da bellek yonetimi Memory Management adi verilir Isletim sisteminin bu amacla olusturulan kesimine de memory Manager adi verilir Bellek yoneticisinin gorevi bellegin hangi parcalarinin kullanimda oldugunu hangi parcalarinin kullanilmadigini izlemek sureclere bellek tahsis etme allocate tahsis edilen bellegi geri almak ve bellek ile disk arasindaki takas islemlerini gerceklestirmektir Bellek yonetimi dendiginde genellikle bellegin yigin heap alaninda tahsis edilmis olan bellek alanlarinin yonetimi kastedilir Isletim sisteminde yurutulen programlar ya da gomulu sistem yazilimlari kendi iclerinde bellek yonetimi sergileyebilirler IBM OS 360 ve ardillarinda bellek isletim sistemi tarafindan yonetilirken Unix ve benzeri isletim sistemlerinde bellek uygulama tarafindan yonetilir Yazilim gelistirmede bellek yonetimi ilk anlardan beri onemli bir konu olmustur Programlama dili teorisi alaninda yasanan gelisme ve iyilestirmeler yazilim gelistiricilerin farkli yaklasimlari ve ihtiyaclari nedeniyle bellek yonetimi konusunda pek cok yontem ortaya cikmistir Bu yontemler genellikle otomatik bellek yonetimi ve manuel bellek yonetimi olacak sekilde ikiye ayrilmaktadir Tahsis edilmis bellekler serbest birakilana kadar tekrar tahsis edilemezler Bu nedenle artik kullanilmayan bir bellek tahsisinin serbest birakilmasi onemlidir Tahsis edilen bellekler artik ihtiyac duyulmadigi takdirde serbest birakilmazlarsa bellek sizintisina memory leak neden olurlar AmaclarBir isletim sisteminin bellek yonetiminin sonuclari sunlardir Bellekteki herhangi bir islemi baska bir yere aktarabilmelidir Birden fazla islem veya kullanici oldugunda bir kullanicini diger kullanicini alanlarina girmeleri onlenmelidir Kullanicilar arasi kaynak paylasimini saglamalidir Bellegin mantiksal alanlara bolunmesini saglayarak bilgiye erisimi kolaylastirmalidir Bellegin yetmedigi durumlarda fiziksel baska bellek alanlarini yani hard diskleri kullanabilmelidir Manuel Bellek YonetimiBir yazilim calisma zamaninda runtime bellek tahsisi allocation gerceklestirmek istediginde cekirdek kernel ile iletisim halindedir Tahsis yontemi farklilik gostermekle birlikte isletim sisteminin bellek yoneticisi tarafindan ayrilan tahsisin konumu onceden bilinmediginden bir referans isaretci pointer ile erisilir Program tarafindan tahsis edilen bu alanlar programin kendi icerisinde sergiledigi bellek yonetimine kalmaktadir Program tahsis ettigi alanlari artik ihtiyaci kalmadigi durumlarda serbest birakarak deallocation bellegi geri kazandirir ve bellegin ilgili bolumleri artik tahsis edilebilir hale gelir Bu tahsisler gelistirici tarafindan manuel bir sekilde gerceklestirilir ve serbest birakilir Gelistirici ne zaman bellek tahsis etmesi ve serbest birakmasi gerektigine kendisi karar vermelidir Gelistiricilerin bellek yonetimini verimli ve dogru bir sekilde gerceklestirmemeleri cesitli bellek sorunlarina yol acabilir Ornegin C programlama dilinde artik kullanilmadigindan serbest birakilmasi gereken tahsisler serbest birakilmadiginda bellek sizintisina memory leak neden olabilir Bu nedenle gelistirici tahsisleri surekli olarak gozetmeli ve dogru konumlarda artik serbest birakmaya ozen gostermelidir include lt stdio h gt include lt stdlib h gt int main int n 20 n tane int tutabilecek bir bellek alani tahsisi int list int malloc n sizeof int programin isevi Tahsis edilen bellegin serbest birakilmasi free list list NULL return EXIT SUCCESS Olumlu Yonleri Manuel bellek yonetiminde programin bellek yonetimi ustunde yazilim gelistirici tam yetkilidir Ne zaman tahsis edilecegine ve serbest birakilacagina tamamen kendisi karar verebilir Bu nedenle bellek tahsisleri konusunda istedigi sekilde yonetim sergileyebilir Manuel bellek yonetiminde yazilim gelistirici tarafindan tahsis yonetimi yapildigindan genellikle bellek tahsis etmek serbest birakmak ve yeniden boyutlandirmak gibi temel islevler kullanilir bu islevler cogu uygulamada implementation ara algoritmalar yoktur ve yalnizca islevler gorevini yaparlar Bu nedenle manuel bellek yonetimi performansi en dusuk oranda etkileyen bellek yonetimi yontemlerinden biridir Olumsuz Yonleri Bellek tahsislerinin yazilim gelistiriciler tarafindan yonetilmesi gerektiginden cesitli guvenlik sorunlarina yol acabilecek hatalar yapilabilir Ornegin tahsis edilen bellegin gozden kacarak serbest birakilmamasi sonucu bellek sizintisi meydana gelebilir ya da tahsis edilen bellegin dogru kullanilmamasindan kaynakli olarak cesitli bellek hatalari yapilabilir Bu yontem yazilim gelistirme surecinde onemli bir efor gerektirebilir gelistirme ve test surecini uzatabilir Otomatik Bellek YonetimiOtomatik bellek yonetimi bellek yonetimini otomatik hale getiren yontemlere verilen genel isimdir Pek cok modern programlama dilinde otomatik bellek yonetimi yaklasimina rastlanmaktadir Calisma zamaninda programin bellek yonetiminin kendi icerisinde otomatik bir sekilde gerceklestirilmesine dayanir Bu yaklasimin yaygin orneklerinde gelistiricinin bellek yonetimini dusunmesi gerekmemektedir Otomatik bellek yonetimi icerisindeki tekniklerin mantigina dayanan ancak birebir ayni olmayan uygulamalari implementation bulunmaktadir Olumlu Yonleri Yazilim gelistiriciyi bellek yonetimini dusunmekten buyuk oranda ya da tamamen kurtarir Yazilim gelistirme surecindeki belek yonetimi kaynakli hatalari azaltir maliyeti ve gelistirme zamanini dusurur Bellek yonetimi kolay hale geldiginden ilgili programlama dilini kullanarak gelistirme yapmak daha kolay hale gelir bu nedenle teorik olarak daha fazla gelistirici tarafindan kullanilabilir Olumsuz Yonleri Yazilim gelistiricinin yazilimin bellek yonetimi konusundaki yetki alanlarini sinirlandirir ve kontrolunu azaltir Cogu durumda bellegin incelikle yazilim gelistirici tarafindan yonetilmesi gereken senaryolarda iyi bir secenek degildir Performans acisindan kritik yazilimlar icin olumsuz etki dogurabilir Cop toplama teknigine gore programin calisma zamaninda runtime buyuk oranda cop toplama yuku bulunabilir ayrica yonteme gore daha fazla bellek kullanimi gibi sorunlara yol acabilir Cop toplama genellikle otomatik olarak derleyici compiler tarafindan uygulanan bir derleyici ozelligi oldugundan derleyici kaynakli bir bellek yonetimi hatasi meydana gelmesi durumunda yazilim gelistirici bu sorunun cozumu icin daha eski derleyici surumleri kullanmak zorunda ya da daha yeni surumleri beklemek zorundadir Cop Toplama Garbage Collection Cop toplama Garbage Collection program tarafindan tahsis edilen ve artik kullanilamayan erisilemeyen tahsislerin serbest birakilmasina dayanan bir otomatik bellek yonetimi bicimidir artik ihtiyac duyulmayan bellek tahsislerine cop garbage denir Cop toplama bir programin toplam calisma suresinin onemli bir bolumunu olusturabilir ve performansa olumsuz etki edebilir Cop toplamanin yurutulmesi ongorulemez olabilir bu da yapilan performans testlerinde cop toplama kaynakli degisken sonuclar elde edilmesine yol acabilir Bununla birlikte programda dagilmis olarak onemli duraklamalar meydana gelebilir bu duraklamalar cop toplayici yurutuldugu esnasinda programin yurutulmesinin kilitlenmesinden kaynaklanmaktadir Cop toplama kullanan dillere cop toplanmis diller Garbage Collected Languages denir Bir dilin ana tasarimi birden fazla bellek yonetim bicimini barindirabilmektedir Ornegin bazi derleyiciler cop toplama ve manuel bellek yonetimi arasinda gelistiriciye bir secim yapma imkani sunmaktadir Bir dilin cop toplama sergiliyor olmasi icin cop toplamanin dilin ana tasarimina dahil olmasi ya da bir derleyici ozelligi olmasi gerekmemektedir Ornegin manuel bellek yonetimi sunan C ve C programlama dilleri icin cesitli cop toplama uygulamalari implementation Bkz Boehm Garbage Collector gelistirilmistir Cop toplama icin referans sayimi ya da sahiplik gibi farkli yontemler gelistirilmistir Izleme Tracing Garbage Collection Cop toplama teknigi yaygin olarak cop toplama takibi Tracing Garbage Collection ile gerceklestirilir Bu o kadar yaygin bir uygulamadir ki genellikle cop toplama dendiginde cop toplama takibi kastedilmektedir Cop toplama izleme program icerisinde gerceklestirilen tahsislerin kullanimlarini analiz eden ve kullanimda olmayan tahsisleri bu tahsislere cop garbage denir tespit edip serbest birakan bir cop toplama teknigidir Cop izlemenin gerceklestirilmesi icin bazi izleme verilerinin calisma zamaninda depolanmasi gerekmektedir bu da bir ek yuk olarak yansimakta ve yazilimin bellek ayak izini artirmaktadir Bu izlemenin gerceklestirilmesi icin kullanilan pek cok algoritma bulunmaktadir Cop toplama takibi bir derleyici ozelligi olabilir ve derleyici tarafindan calisma zamaninin bir parcasi olarak sunulabilir Ornegin C ve Java programlama dillerinde cop toplama takibi kullanilmaktadir ve bu yaklasim calisma zamaninda tamamen otomatik bir sekilde yurutulur Olusturulan ilgili nesneler otomatik olarak cop toplama takibine dahil edilir Bir diger yontemde ise cop toplama takibine dahil edilecek tahsislerin gelistirici tarafindan bildirilmesi gerekir Nesne sonuclandirma object finalization zamanlamasinda cop toplama takibi deterministik degildir Cop toplamaya tabii olabilecek duruma gelen her nesne eninde sonunda serbest birakilacaktir lakin bunun gerceklesme durumu ongorulemez Cop toplamanin ne zaman gerceklesecegine ya da gerceklesmeyecegine dair hicbir garanti yoktur Cop toplama islemi programin asil algoritmasindan kaynaklanmayan gecikmelere ve duraklamalara neden olup yurutme zamaninin oldukca degisken bir hale gelmesine yol acabilir Deterministik olmayan yapisi nedeniyle yeni bir nesne tahsis etmek bazen yalnizca nesnenin tahsis edilmesi seklinde gerceklesirken bazen uzun bir cop toplama dongusunun yurutulmesini tetikleyebilir package main import fmt type Car struct Brand string Model string func main ptr heap tahsisli bir Car barindirmaktadir tahsisin izlenmesi ve serbest birakilmasini cop toplayici ustlenmektedir ptr amp Car Ferrari 330 P3 fmt Println ptr Brand ptr Model Referans Sayimi Reference Counting Referans sayma ilgili tahsise yapilan her bir referansin sayilmasi ve referanslarin hepsinin sifira ulasmasi durumunda tahsisin serbest birakilmasina dayanir Bu teknikte her referans kendisine referans eden bir sayma verisi bulundurur Bu sayma verisi referans her kopyalandiginda artirilir ve kopya her yok edildiginde azaltilir Referans sayma verisi sifira ulastiginda tahsisi kullanan bir program noktasi olmadigindan serbest birakilir Referans sayma cop toplama takibinde oldugu gibi dogrudan derleyici tarafindan otomatik bir sekilde gerceklestirilebilir ya da yazilim gelistirici tarafindan ilgili bolumlerde referans sayma gerceklestirilebilir Referans sayma deterministik bir cop toplama performansi sergiler Bunun nedeni program yurutulurken bir referansin olusturulma kopyalama ve serbest birakilma noktalari her zaman sabit oldugundan referansin serbest birakilma islemi her zaman ayni algoritma adiminda gerceklesir Referans sayma icin kullanilan sayma verisi calisma zamaninda ek bellek ayak izi anlamina gelir Bununla birlikte referans sayma islemi algoritmaya gore onemli miktarda calisma zamani yuku olusturabilir Bununla birlikte bazi problemlere sahiptir bu problemlerin yok edilmesi amaciyla cesitli yontemler uygulanmaktadir ve bu yontemler performansa olumsuz etki edebilmektedir Referans saymanin atomiklik atomicity sergilemesi gerekmektedir Cok is parcacikli bir ortamda bir referansin ayni anda kopyalanmasi durumunda referans sayma dogru bir sekilde gerceklesmeyebilir bunu onlemek icin referans sayma atomik bir sekilde gerceklestirilmelidir Bu atomiklik cok is parcacikli bir senaryo olmadigi durumlarda dahi kucuk de olsa bir calisma zamani ek yuku olusturur Referansin sayma verisi ustunde islem gerektirecek herhangi bir durumun is parcaciklari tarafindan cok fazla tekrarlanmasi bu atomikligin programin toplam calisma suresinin onemli bir bolumunu olusturmasina neden olabilir Referans saymanin diger bir sorunu donguselliktir Ornegin iki referansin birbirlerine referans vermesi durumunda referans sayisinin asla sifirlanmadigi bir dongu olusturulabilir bu onlemek icin cesitli dongu algilama algoritmalari vardir Referans sayma cesitli sekillerde uygulanabilir ve bu uygulamalarin kendilerine has dezavantajlari olabilir Bazi referans sayma uygulamalarinda referans sayma verisi sifirlandiginda tahsisin direkt serbest birakilmasi yerine serbest birakilmayi bekleyen tahsislerin bulundugu bir bolumde listelenebilir ve periyodik olarak bu listedeki tahsisler serbest birakilabilir Bir referans sayma verisinin sifira ulasilmasi durumunda yok edilen tahsis de bir referans ise bu sirali bir referans sayma baslatabilir ve belirli durumlarda pek cok referansin sayma verisi sifira ulastigindan sirali ve uzun bir serbest birakmanin tetiklenmesine yol acabilir include lt iostream gt include lt string gt include lt memory gt struct Car std string brand std string model int main ptr heap tahsisli bir Car sinifi ustunde referans sayimi gerceklestiriyor tahsis ptr ile birlikte 1 referansa sahip std shared ptr lt Car gt ptr new Car Ford GT40 ptr2 artik ptr nin tahsisine isaret ediyor tahsisin referans sayisi 2 ye ulasti std shared ptr lt Car gt ptr2 ptr std cout lt lt ptr2 gt brand lt lt lt lt ptr2 gt model lt lt std endl ptr2 kapsam disi kaldigindan referans bir eksildi lakin serbest birakilmadi halen bir referans daha var ptr tahsise isaret ediyor ptr kapsam disi kaldi referans sayisi 0 oldugundan tahsis serbest birakildi return EXIT SUCCESS Sahiplik Ownership Sahiplik Rust programlama dilinin tasariminda benimsenen bir bellek yonetimi teknigidir Bu teknik calisma zamaninda cop toplama amaciyla ek bellek ayak izi olusturmaz deterministik calisir ve manuel bellek yonetimine ek olarak bir performans yuku yoktur Manuel bellek yonetimi ile tamamen ayni calisma zamani maliyetine sahiptir Sahiplik kurallari derleyici tarafindan kontrol edilir ve yonetilir Bu da bellek yonetimi kurallarinin ihlal edilmesi sonucunda derleyici tarafindan hata belgelenmesine yol acacaktir Bu sayede manuel bellek yonetiminde yazilim gelistirici tarafindan yapilabilecek bellek yonetimi hatalarinin engellenmesi ve teknigin olumlu yonlerini korurken olumsuz yonlerinin ortaya cikmasinin engellenmesi amaclanmaktadir Sahipligin kurallari Bir tahsisin her zaman bir sahibi olmalidir Bir tahsisin yalnizca tek bir sahibi olabilir Sahibi olmayan bir tahsis kapsam scope disina ciktiginda serbest birakilir Bu kurallari irdelemek gerekirse en onemli temel kural bir tahsisin her zaman bir sahibinin olmasi gerektigidir Bu kural sahiplik yaklasimin kok kuralidir Sahibi olan bir tahsis farkli bir sahibe atandiginda onceki sahip sahipligini kaybeder zira ayni anda yalnizca tek bir sahip olma kurali vardir Derleyicinin hata belgeleyecegi yerlerden birisi sahipligin yanlis kullanimidir Sahipligini kaybetmis bir degiskeni kullanmak acikca derleme hatasina neden olacaktir Bu derleme zamaninda gerceklestirilen bir bellek guvenligi yaklasimidir Sahiplik teknigi bu noktaya kadar C programlama dilinde yapilan manuel bellek yonetiminden cok farkli degildir Bir tahsis gerceklestirildi ve yazilim gelistirici bir isaretci ile bu tahsisin konumuna sahiptir bu isaretciyi farkli bir isaretciye atayabilir ve bu bir sorun teskil etmez C ile gelistirilmis bir programin tahsisin ne zaman bosaltilacagini anlamak gibi bir amaci yoktur Bu nedenle yazilim gelistirici serbest birakana kadar istedigi gibi kullanmakta ozgurdur lakin sonrasinda yapilan bellek yonetimi hatalari sonucunda cesitli bellek sorunlari ile karsilasilabilir Rust C programlama dilinin aksine derleme zamaninda tahsisin nerede gerceklesecegini bilmek ister Bunun icin yalnizca tek bir sahip olmalidir O sahip izlenebilir ve yok edildigi durumda tahsisin serbest birakilmasi gerektigi anlasilmis olur Tam olarak bu nedenden bir tahsisin tek sahibi vardir Sahipligi elinde tutan bir ornek yok edildiginde eger halen elinde bulunduruyorsa dogal olarak baska bir noktada farkli bir sahip olamayacagindan tahsisin serbest birakilmasi gerceklesir Bu yaklasim manuel bellek yonetiminin guvenli bir sekilde gerceklestirilmis olmasi icin derleme zamaninda compile time tesvik edilen bir turevi olarak dusunulebilir fn main let a String from Merhaba sahiplik let b a a artik kullanilamaz zira a nin tahsisinin sahibi b dir let c b b artik kullanilamaz zira b nin tahsisinin sahibi c dir let d c c artik kullanilamaz zira c nin tahsisinin sahibi d dir println d Merhaba sahiplik yazar kapsam sonunda d yok edileceginden sahip oldugu tahsis serbest birakilir Ozelliklerbellek yonetim sistemleri genellikle asagidaki konulari icerir Yer degistirme relocation Sanal bellekli sistemlerde bellekteki programlarin farkli zamanlarda bellegin farkli yerlerinde bulunabilmesi gerekir Bunun temel nedeni programin bir sureligine bellekten disari goturulmesinin ardindan tekrar geri getirildiginde her zaman ayni bellek bolgesine yerlestirilmesinin mumkun olmamasidir Bu yuzden isletim sisteminin bellek yonetimi bellekte programlarin yerini degistirebilmeli ve bu yer degistirme sonrasinda program kodu icindeki referanslari dogru sekilde ayarlayarak her zaman bellekte dogru yeri isaret etmesini saglayabilmelidir Koruma protection Surecler process baska surecler icin ilgili surecin izni olmadan bellek basvurusu yapmamalidir Bellek korumasi adi verilen bu mekanizma ile programdaki kotu niyetli ya da hatali isleyen bir kodun diger programlarin calismasini etkilemesi engellenir Paylasma sharing Farkli surecler arasindaki bellek her ne kadar koruma altinda olmus olsa da uygun durumda farkli surecin farkli bellek alanina erisip bilgiyi paylasmasi mumkun olmalidir Mantiksal yapilanma logical organization Programlar genelde moduller seklinde yapilandirilmistir Bu modullerin bir kismi gerek sadece okuma gerekse veri degistirme seklinde baska programlar tarafindan da kullanilabilir Bellek yonetimi dogrusal fiziksel alanindan farkli olan bu mantiksal yapilanmanin duzenlenmesinden sorumludur Bunu saglamanin yontemlerinden birisi kesimlemedir segmentation Fiziksel yapilanma physical organization Bellek genellikle hizli birincil depo ve yavas ikincil depo seklinde bolumlenmistir ornegin rastgele erisimli bellek RAM ve sabit disk gibi Isletim sistemlerindeki bellek yonetimi bilginin bu bellek katmanlari arasinda tasinmasindan sorumludur 4 Ayrica bakinizSanal bellek virtual memory Sayfalama paging Memory Management Unit Kaynakca a b Sancakli Ali 29 Kasim 2020 Technopat 29 Kasim 2020 tarihinde kaynagindan arsivlendi Erisim tarihi 14 Mart 2021 www belgeler org 22 Mayis 2003 tarihinde kaynagindan arsivlendi Erisim tarihi 14 Mart 2021 What is Ownership The Rust Programming Language doc rust lang org 19 Mayis 2019 tarihinde kaynagindan Erisim tarihi 10 Aralik 2022 Dis baglantilar 1 http yunus hacettepe edu tr yurdugul 3 indir isletim pdf 5 Ekim 2011 tarihinde Wayback Machine sitesinde 2 3 http www bote gazi edu tr boteabd bto303 Notlar Hafta6 pdf olu kirik baglanti