Bellek ve Thread Güvenliği: Yazılım Geliştirmenin Temel Taşları
Modern yazılım geliştirmede güvenilir uygulamalar oluşturmak için iki kritik kavramı anlamak gerekir: bellek güvenliği ve thread güvenliği…
Bellek ve Thread Güvenliği: Yazılım Geliştirmenin Temel Taşları
Modern yazılım geliştirmede güvenilir uygulamalar oluşturmak için iki kritik kavramı anlamak gerekir: bellek güvenliği ve thread güvenliği. Bu makale, bu kavramları pratik örneklerle açıklayarak, günlük programlama yaşamınızda karşılaştığınız sorunlara çözümler sunacak.
Bellek Güvenliği: Temellerden Başlayalım
Bellek Güvenliği Nedir?
Bellek güvenliği (memory safety), bir programın belleğe erişiminde izin verilen sınırlar içinde kalmasını sağlayan bir kavramdır. Basit bir benzetmeyle, bir kütüphanede sadece size ait raflardaki kitaplara erişebilmeniz gibi, program da yalnızca kendisine ayrılan bellek alanlarını kullanmalıdır.
Bellek güvenliğinin temel amacı şu durumları engellemektir:
- Başkasına ait bellek alanlarına erişim
- Ayrılmamış belleğe yazma
- Serbest bırakılmış belleği kullanma
- Buffer taşmaları (overflow)
Temel Bellek Güvenliği Kavramları
1. Sınır Kontrolü (Bounds Checking)
Bir dizi (array) veya buffer’a erişirken, indeksin geçerli aralıkta olup olmadığının kontrol edilmesidir.
int arr[5] = {1, 2, 3, 4, 5};
// Güvenli: arr[0] ile arr[4] arası
// Tehlikeli: arr[10] // Sınır dışı erişim
2. Dangling Pointer (Sarkmış İşaretçi)
Serbest bırakılmış bellek alanına erişimin engellenmesi kritik önem taşır. Bu durumu bir benzetmeyle açıklayalım:
Kiraya verdiğin evi boşalttın ve anahtarı arkadaşına verdin ama hala ona eski anahtarla girmeye çalışıyorsun — artık o ev sana ait değil.
int *p = malloc(sizeof(int));
free(p);
// p artık dangling pointer
*p = 42; // Tehlikeli: Use-after-free
Doğru kullanım:
free(p);
p = NULL; // Pointer'ı temizle
3. Double-free (Çifte Serbest Bırakma)
Aynı bellek bloğunu iki kez free etmek, runtime hatasına veya bellek bozulmasına yol açar.
int *p = malloc(sizeof(int));
free(p);
free(p); // Hata! Double-free
Memory Leak: Bellek Sızıntısının Anatomisi
Memory leak, programlama dünyasının en yaygın sorunlarından biridir. Bunu basit bir benzetmeyle açıklayalım:
Bilgisayardan sandalye istersin (malloc), kullanırsın, ama işin bitince geri vermezsin (free). Sen artık onları kullanmıyorsun ama kimse de kullanamıyor.
Veri Bütünlüğü: Güvenilir Bilgi İşleme
Veri bütünlüğü (data integrity), bir değişkenin veya nesnenin beklenmedik şekilde değiştirilmemesini sağlar. Pratik örneklerle inceleyelim:
1. Banka Hesabı Senaryosu
Sorun:
- Hesap bakiyesi = 1000 TL
- Aynı anda iki işlem: 200 TL yatır, 300 TL çek
- Eşzamanlı işlemler sonucu yanlış bakiye
Çözüm:
- Transaction sistemi (ya hep ya hiç mantığı)
- Lock/mutex ile aynı anda tek işlem
2. Sağlık Sistemi Kritik Durumu
Hasta A’nın kan tahlili sonuçlarının Hasta B’ye gitmesi hem sağlık hatası hem güvenlik açığıdır. Bu durumda:
- Kimlik doğrulama (hasta ID, TC kimlik no)
- Checksum ve hash ile veri kontrolü gereklidir
Genel Çözüm Yöntemleri
- Transaction (ya hep ya hiç işlemler)
- Lock/Mutex (eşzamanlı erişim kontrolü)
- Checksum/Hash (veri aktarımı doğrulaması)
- Access Control (erişim yetkilendirmesi)
- Immutable Veri (değiştirilemez veri yapıları)
Stack vs Heap: Bellek Yönetiminin İki Yüzü
Stack (Yığın)
Stack, fonksiyonların geçici değişkenleri için kullanılır.
Özellikleri:
- Otomatik yönetilir
- Çok hızlıdır (LIFO mantığı)
- Boyutu sınırlıdır (birkaç MB)
- Kapsam (scope) ile bağlıdır
Benzetme: Masanın üstüne kitapları üst üste koymak gibi. En son koyduğunu önce alırsın.
Heap (Serbest Alan)
Heap, dinamik olarak ayrılan büyük veriler için kullanılır.
Özellikleri:
- Manuel yönetilir (malloc/free)
- Daha yavaştır
- Boyutu çok büyüktür
- Bellek hatalarına açık
Benzetme: Bir depo kiralamak gibi. İstediğin kadar yer tutabilirsin, ama anahtarını unutursan yer boşa gider.
Thread Güvenliği: Çoklu İş Parçacığında Harmoni
Thread Güvenliği Nedir?
Thread safety, birden fazla thread aynı anda çalışırken verilerin karışmaması, beklenmedik sonuçların oluşmaması demektir. Basitçe söylemek gerekirse: “Birden fazla kişi aynı dosyayı aynı anda düzenlemeye kalkarsa, her şey birbirine girmesin” önlemidir.
Race Condition: Tehlikeli Yarış
Banka hesabı örneğiyle race condition’ı inceleyelim:
int balance = 1000;
void deposit(int amount) {
balance += amount;
}
void withdraw(int amount) {
balance -= amount;
}
Senaryo:
- Thread A → deposit(100)
- Thread B → withdraw(50)
- Başlangıç: balance = 1000
Hatalı durum:
- Thread A okur: balance = 1000
- Thread B okur: balance = 1000
- Thread A yazar: balance = 1100
- Thread B yazar: balance = 950
Sonuç 1050 olması gerekirken 950 oldu!
Thread Güvenliği Çözümleri
1. Lock/Mutex Yaklaşımı
Mantık: “Bir kişi değiştirirken diğerleri beklesin.”
pthread_mutex_lock(&lock); // Kilidi al
balance += 100; // Kritik bölüm
pthread_mutex_unlock(&lock); // Kilidi bırak
Çalışma prensibi:
- Thread A kilidi alır → işlemini yapar
- Thread B bekler
- Thread A kilidi bırakır → Thread B devam eder
2. Atomic Operations
Atomic işlemler, “okuma → işlem → yazma” adımlarını tek bir bölünemez adım olarak yapar. Bir thread işlemi başlatınca, bitene kadar diğer thread’ler aynı değişkene işlem yapamaz.
3. Thread-safe Kütüphaneler
ConcurrentLinkedQueue gibi özel olarak tasarlanmış veri yapıları:
- Kendi içinde kilit mekanizması bulundurur
- Aynı anda birden fazla thread işlem yapabilir
- Sıra ve veri bütünlüğü korunur
Thread Güvenliği Yöntemlerinin Karşılaştırması
1. Thread-unsafe Durum (Hiç Önlem Yok)

Sonuç: Yanlış! Race condition oluştu.
2. Mutex/Lock

Sonuç: Doğru! Thread’ler sırayla güvenli işlem yaptı.
3. Atomic Operations

Sonuç: Doğru! Thread A işlemi bitirmeden Thread B aynı veri üzerinde işlem yapamadı.
4. Thread-safe Kütüphane (Concurrent Queue)
Özel olarak tasarlanmış thread-safe veri yapıları, programcının ekstra güvenlik önlemi almasına gerek kalmadan güvenli işlemler sunar.
Transaction Sınıfı ve ConcurrentLinkedQueue Örneği:
class Transaction {
int amount;
Transaction(int a) { amount = a; }
}
ConcurrentLinkedQueue<Transaction> transactions = new ConcurrentLinkedQueue<>();
transactions.add(new Transaction(100)); // Thread A
transactions.add(new Transaction(-50)); // Thread B
ConcurrentLinkedQueue thread-safe bir kütüphane/veri yapısıdır. Aynı anda birden fazla thread add() veya poll() yapsa bile:
- İşlemler kaybolmaz
- Sıra bozulmaz
- Race condition oluşmaz

Sonuç: Güvenli!
- Queue kendi içinde thread-safe
- Thread’ler aynı anda ekleyebilir, sıra ve veri bütünlüğü korunur
Gerçek hayat analojisi: Bir sırada Thread A ve Thread B aynı anda fişleri sıraya koyuyor. Queue kendisi “otomatik olarak” fişleri doğru sıraya yerleştiriyor. Kimse fişi kaybetmez, sıra bozulmaz, programcı ayrıca bekletme/kilitleme yapmıyor.
Thread Güvenliği Yöntemleri Özeti
Kısa hatırlatma:
- Thread-unsafe → Hiçbir önlem yok → riskli
- Mutex → Sıra bekletme ile güvenli
- Atomic → Tek adımda değişim
- Thread-safe kütüphane → Veri yapısı kendi güvenliğini sağlıyor
- Immutable → Sadece okuma, değişmez → güvenli
Ek Bellek Güvenliği Kavramları
Stack Overflow (Fonksiyon Çağrılarıyla İlgili)
Stack overflow, çok derin veya sonsuz fonksiyon çağrıları (rekürsiyon) ya da çok büyük stack değişkenleri yüzünden stack’in dolması durumudur.
Benzetme: Masanın üstündeki kağıtlar birbirinin üstüne binip en sonunda her şeyin devrilmesi.
Pointer Arithmetic (İşaretçi Aritmetiği)
İşaretçiler üzerinde yapılan toplama/çıkarma işlemleriyle bellekte ileri/geri gitme yöntemidir.
int *p;
p = arr;
p + 3; // İşaretçi p'yi dizide 3 eleman ileri taşır
Bu işlem bellekte 3 * sizeof(int) byte ilerler.
Stack Frame / Call Stack (Fonksiyon Çağrı Yığını)
Her fonksiyon çağrıldığında, onun lokal değişkenleri, dönüş adresi ve bazı kayıtlar stack’te bir “frame” oluşturur.
Stack Frame İçeriği:
- Return Address (Dönüş Adresi): Fonksiyon bittiğinde programın hangi satırdan devam edeceği
- Fonksiyon Parametreleri: Fonksiyona gönderilen argümanlar
- Yerel Değişkenler: Fonksiyon içinde tanımlanan değişkenler için bellek
- Kaydedilmiş Register’lar: Base pointer (EBP/RBP) gibi register’lar
Call Stack görünümü:
[C fonksiyonunun frame'i]
[B fonksiyonunun frame'i]
[A fonksiyonunun frame'i]
[main fonksiyonunun frame'i]
Static vs Dynamic Allocation (Statik vs Dinamik Tahsis)
Statik Tahsis:
- Program başında ya da compile zamanı belirlenen
- Ömrü programın sonuna kadar
- Örnek: Global değişkenler, statik değişkenler
Dinamik Tahsis:
- Çalışma zamanında heap’ten ayrılır
- Serbest bırakılana kadar sürer
Benzetme:
- Statik = daima kiraladığın daire
- Dinamik = günlük kiraladığın oda (kullanıp bırakman gerek)
Programlama Dillerinde Bellek Güvenliği
Zayıf Bellek Güvenliği
C, C++: Programcıya tam kontrol verir ancak hataya açıktır.
Güçlü Bellek Güvenliği
Java, C#, Python, Rust: Sınır kontrolleri, otomatik bellek yönetimi (garbage collection) veya özel güvenlik mekanizmaları bulundurur.
Sonuç ve Öneriler
Bellek ve thread güvenliği, modern yazılım geliştirmede kritik önem taşır. Bu kavramları anlamak ve doğru uygulamak:
- Program çökmelerini önler
- Veri bozulmalarını engeller
- Güvenlik açıklarını kapatır
- Performans sorunlarını çözer
Hatırlatma:
- Memory Leak: Bellek ayrılıyor ama geri verilmeden unutuluyor
- Dangling Pointer: Bellek serbest bırakıldı ama işaretçi hâlâ o adresi gösteriyor
- Use-after-free: Serbest bırakılmış belleği kullanmaya çalışıyorsun
- Double-free: Aynı bellek alanı iki kez free ediliyor
Thread güvenliği için:
- Thread-unsafe: Hiçbir önlem yok → riskli
- Mutex: Sıra bekletme ile güvenli
- Atomic: Tek adımda değişim
- Thread-safe kütüphane: Veri yapısı kendi güvenliğini sağlıyor
Bu kavramları projelerinizde uygulayarak daha güvenilir ve performanslı yazılımlar geliştirebilirsiniz.
Bu makale, yazılım geliştirmede karşılaştığınız bellek ve thread güvenliği sorunlarına pratik çözümler sunmayı amaçlamaktadır. Sorularınız ve deneyimlerinizi yorumlarda paylaşabilirsiniz.
메타데이터
- post_id
- 4ccca321a882
- slug
- bellek-ve-thread-güvenliği-yazılım-geliştirmenin-temel-taşları-4ccca321a882
- url
- https://medium.com/@zeynepucar129.828/bellek-ve-thread-g%C3%BCvenli%C4%9Fi-yaz%C4%B1l%C4%B1m-geli%C5%9Ftirmenin-temel-ta%C5%9Flar%C4%B1-4ccca321a882
- canonical_url
- https://medium.com/@zeynepucar129.828/bellek-ve-thread-g%C3%BCvenli%C4%9Fi-yaz%C4%B1l%C4%B1m-geli%C5%9Ftirmenin-temel-ta%C5%9Flar%C4%B1-4ccca321a882
- author_url
- https://medium.com/@zeynepucar129.828
- status
- ok
- fetched_at
- 2026-07-07 00:45:30