CodeBlanks Logo Icon CodeBlanks

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

main.c
#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

main.c
#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ı

Soru
int shmid = shmget(IPC_PRIVATE, 64, 0600 | ____);
Cevap
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.

İleri seviye bölümündeki tüm dersler