C
Shared memory
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);.
Örnek çözümü göster
#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;
}
Kendini test et
-
shmget çağrısı
int shmid = shmget(IPC_PRIVATE, 64, 0600 | ____);
Cevabı göster
int shmid = shmget(IPC_PRIVATE, 64, 0600 | IPC_CREAT);
-
Shared memory fonksiyonlarını eşle
- shmget
- Segment oluşturur
- shmat
- Sürece eşler
- shmdt
- Ayrılır
- shmctl
- Segmenti siler
-
shmat çağrısı ne döndürür?
- void * işaretçi
- int tanıtıcı
- long boyut
- pid_t kimlik
Cevabı göster
void * işaretçi — shmat, eşlenen adresi void * olarak döndürür.
Sıradaki ders: Message queue