Paylaşılan Bellek
Hızlı IPC
Paylaşılan Bellek, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.
Paylaşılan Bellekle Hızlı IPC
Paylaşılan bellek, birden çok sürecin aynı fiziksel bellek bölgesini kendi adres alanlarına eşlemesine olanak tanır. Veriler çekirdek üzerinden kopyalanmadığı için IPC'nin en hızlı biçimidir.
Neden Hızlıdır
Pipe'lar ve soketler verileri bir süreçten çekirdeğe, ardından geri kopyalar. Paylaşılan bellek bunu atlar: eşlendikten sonra süreçler her ileti için kopyalama yapmadan aynı baytları doğrudan okur ve yazar.
POSIX ve System V Karşılaştırması
İki API vardır:
- POSIX:
shm_open+mmap, dosya benzeri ve moderndir - System V:
shmget+shmat, anahtar tabanlı ve daha eskidir
Yeni kodlarda genellikle POSIX tercih edilir.
1. Adım: Nesneyi Oluşturma
shm_open, adlandırılmış bir paylaşılan bellek nesnesi oluşturur veya açar ve bir dosya tanımlayıcısı döndürür. Ad, /myshm örneğinde olduğu gibi eğik çizgiyle başlar.
#include <sys/mman.h>
#include <fcntl.h>
int create_shm(const char *name) {
int fd = shm_open(name, O_CREAT | O_RDWR, 0666);
return fd; /* -1 on error */
}2. Adım: Boyutunu Belirleme
Yeni oluşturulan bir paylaşılan nesnenin uzunluğu sıfırdır. Eşlemeden önce boyutunu ayarlamak için ftruncate kullanın.
#include <unistd.h>
#include <stddef.h>
int size_shm(int fd, size_t bytes) {
return ftruncate(fd, (off_t)bytes); /* set the region size */
}3. Adım: Eşleme
mmap, nesneyi sürecin adres alanına eşler ve normal bellek gibi kullanacağınız bir işaretçi döndürür.
#include <sys/mman.h>
#include <stddef.h>
void *map_shm(int fd, size_t bytes) {
void *p = mmap(NULL, bytes, PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
return p; /* MAP_FAILED on error */
}Okuma ve Yazma
Eşleme tamamlandıktan sonra işaretçinin gösterdiği değere doğrudan erişin. Paylaşılan bellekteki bir struct, aynı nesneyi eşleyen her süreç tarafından görülebilir.
#include <string.h>
typedef struct { int counter; char text[64]; } Shared;
void producer(Shared *s) {
s->counter = 42;
strcpy(s->text, "hello from producer");
}MAP_SHARED Zorunludur
Yazma işlemlerinin diğer süreçler tarafından görülebilmesi için MAP_SHARED iletmelisiniz. MAP_PRIVATE, kopya üzerine yazma kullanan özel bir eşleme oluşturur; diğer süreçler bunu asla göremez.
Eşzamanlama Sizin Sorumluluğunuzdur
Paylaşılan bellek yerleşik eşzamanlama sağlamaz. Eşgüdüm olmadan iki süreç bir yarış durumunda verileri bozabilir. Verileri semaforlar, karşılıklı dışlama kilitleri veya atomik işlemlerle koruyun.
Adlandırılmış Semafor Kullanma
POSIX adlandırılmış semaforu (sem_open) erişimi eşgüdümler. Üretici veri hazır olduğunda bildirim gönderir; tüketici okumadan önce bekler.
#include <semaphore.h>
#include <fcntl.h>
sem_t *open_sem(const char *name) {
return sem_open(name, O_CREAT, 0666, 0); /* initial value 0 */
}
/* producer: sem_post(s); consumer: sem_wait(s); */Temizleme
Kaynakları her zaman serbest bırakın:
- Bölgenin eşlemesini kaldırmak için
munmap - Tanımlayıcıyı kapatmak için
close - Adlandırılmış nesneyi kaldırmak için
shm_unlink
Aksi takdirde nesne, süreç sonlandıktan sonra /dev/shm içinde kalır.
#include <sys/mman.h>
#include <unistd.h>
#include <stddef.h>
void cleanup(void *p, size_t bytes, int fd, const char *name) {
munmap(p, bytes);
close(fd);
shm_unlink(name);
}Kısa Kontrol
Paylaşılan bellek hakkındaki anlayışınızı sınayın.
Özet
IPC'nin en hızlı biçimi olan paylaşılan belleği öğrendiniz.
shm_open,ftruncate, ardındanMAP_SHAREDilemmap- Paylaşılan verileri okumak ve yazmak için işaretçinin gösterdiği değere erişin
- Kendi eşzamanlama mekanizmanızı (semaforları) eklemelisiniz
- munmap, close ve shm_unlink ile temizleyin
Sıkça Sorulan Sorular
“Paylaşılan Bellek” dersi ücretsiz mi?
Evet — “Paylaşılan Bellek” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.
“Paylaşılan Bellek” dersinde ne öğreneceğim?
Hızlı IPC C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Paylaşılan Bellek” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Boru Hatları
- Paylaşılan Bellek
- İleti Kuyrukları
- Sinyaller