Shared memory
- C kursu
- İleri seviye
- Ders 33/83
- 5 dk
shmget ve shmat ile paylaşılan bellek öğrenirsin.
Shared memory
Paylaşılan bellek, süreçlerin aynı fiziksel bellek bölgesini eşlemesidir; en hızlı IPC yöntemidir çünkü çekirdek kopyalama yapmaz. shmget(key, size, flags) ile segment oluşturulur, shmat(shmid, NULL, 0) ile süreç adres alanına eklenir.
IPC_PRIVATE anahtarı her zaman yeni ve benzersiz bir segment üretir; fork öncesi oluşturulursa çocuk da eşlemeyi miras alır. flags olarak 0600 | IPC_CREAT yaygın bir seçimdir. İş bitince shmdt ile ayrılır, shmctl(shmid, IPC_RMID, NULL) ile segment silinir.
shmat ve fork
shmat bir void * işaretçisi döndürür; istediğin türe cast edersin. Ebeveyn int *shared = (int *)shmat(shmid, NULL, 0); ile alır, *shared = 42; ile yazar. fork sonrası çocuk aynı eşlemeyi miras aldığından *shared okuması 42 verir.
Senkronizasyon gerekmez çünkü ebeveyn önce yazar sonra fork yapar; çocuk okurken değer hazırdır. Eğer ters sıra gerekirse semafor veya bayrakla senkronize et. Bitince shmdt(shared) ile ayrılır, shmctl(shmid, IPC_RMID, NULL) ile silinir.
Uygulama Paylaşılan belleğe değer yaz
int shmid = shmget(IPC_PRIVATE, 64, 0600 | IPC_CREAT); ile segment oluştur. int *shared = (int *)shmat(shmid, NULL, 0); ile eşle. *shared = 42; ile yaz. pid_t pid = fork(); ile çocuk oluştur. Çocukta printf("%d\n", *shared);, shmdt(shared); _exit(0);. Ebeveynde wait(NULL);, shmdt(shared);, shmctl(shmid, IPC_RMID, NULL);.
Başlangıç kodu
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <unistd.h>
// shared memory segment oluştur ve eşle
// fork ile çocuk okusun
// ebeveyn bekleyip temizlesin
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <unistd.h>
int main(void) {
int shmid = shmget(IPC_PRIVATE, 64, 0600 | IPC_CREAT);
int *shared = (int *)shmat(shmid, NULL, 0);
*shared = 42;
pid_t pid = fork();
if (pid == 0) {
printf("%d\n", *shared);
shmdt(shared);
_exit(0);
}
wait(NULL);
shmdt(shared);
shmctl(shmid, IPC_RMID, NULL);
return 0;
}Beklenen çıktı
42
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 shmget çağrısı
int shmid = shmget(IPC_PRIVATE, 64, 0600 | ____);
int shmid = shmget(IPC_PRIVATE, 64, 0600 | IPC_CREAT);
Açıklama: IPC_CREAT bayrağı yoksa segment oluşturulmasını sağlar.
2 Shared memory fonksiyonlarını eşle
| Kavram | Anlamı |
|---|---|
shmget |
Segment oluşturur |
shmat |
Sürece eşler |
shmdt |
Ayrılır |
shmctl |
Segmenti siler |
3 shmat çağrısı ne döndürür?
- void * işaretçi Doğru cevap
- int tanıtıcı
- long boyut
- pid_t kimlik
Açıklama: shmat, eşlenen adresi void * olarak döndürür.