0Pricing
C Academy · Pelajaran

Memori Bersama

IPC cepat.

Memori Bersama adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C Academy mencakup 4 pelajaran total.

IPC Cepat dengan Memori Bersama

Memori bersama memungkinkan beberapa proses memetakan wilayah memori fisik yang sama ke dalam ruang alamat masing-masing. Memori bersama adalah bentuk IPC yang tercepat karena data tidak disalin melalui kernel.

Mengapa Cepat

Pipa dan socket menyalin data dari satu proses ke kernel, lalu menyalinnya kembali. Memori bersama melewati proses ini: setelah dipetakan, proses membaca dan menulis byte yang sama secara langsung, tanpa penyalinan untuk setiap pesan.

POSIX vs System V

Ada dua API:

  • POSIX: shm_open + mmap, menyerupai berkas dan modern
  • System V: shmget + shmat, lebih lama dan berbasis kunci

POSIX umumnya lebih disarankan untuk kode baru.

Langkah 1: Buat Objek

shm_open membuat atau membuka objek memori bersama bernama dan mengembalikan deskriptor berkas. Namanya diawali garis miring, seperti /myshm.

#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 */
}

Langkah 2: Atur Ukurannya

Objek bersama yang baru dibuat memiliki panjang nol. Gunakan ftruncate untuk menetapkan ukurannya sebelum pemetaan.

#include <unistd.h>
#include <stddef.h>

int size_shm(int fd, size_t bytes) {
    return ftruncate(fd, (off_t)bytes); /* set the region size */
}

Langkah 3: Petakan Objek

mmap memetakan objek ke dalam ruang alamat proses dan mengembalikan pointer yang Anda gunakan seperti memori biasa.

#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 */
}

Membaca dan Menulis

Setelah dipetakan, cukup lakukan dereferensi pada pointer. Sebuah struct dalam memori bersama terlihat oleh setiap proses yang memetakan objek yang sama.

#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 Itu Penting

Anda harus meneruskan MAP_SHARED agar penulisan terlihat oleh proses lain. MAP_PRIVATE memberikan pemetaan privat dengan salin-saat-menulis, yang tidak pernah terlihat oleh proses lain.

Sinkronisasi Menjadi Tanggung Jawab Anda

Memori bersama tidak menyediakan sinkronisasi bawaan. Tanpa koordinasi, dua proses dapat merusak data dalam kondisi pacu. Lindungi data tersebut dengan semaphore, mutex, atau operasi atomik.

Menggunakan Semaphore Bernama

Semaphore bernama POSIX (sem_open) mengoordinasikan akses. Produsen memanggil post saat data siap; konsumen menunggu sebelum membaca.

#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); */

Pembersihan

Selalu lepaskan sumber daya:

  • munmap untuk membatalkan pemetaan wilayah
  • close pada deskriptor
  • shm_unlink untuk menghapus objek bernama

Jika tidak, objek tersebut tetap ada di /dev/shm setelah proses berakhir.

#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);
}

Pemeriksaan Singkat

Uji pemahaman Anda tentang memori bersama.

Ringkasan

Anda telah mempelajari memori bersama, IPC yang tercepat.

  • shm_open, ftruncate, lalu mmap dengan MAP_SHARED
  • Lakukan dereferensi pada pointer untuk membaca dan menulis data bersama
  • Anda harus menambahkan sinkronisasi sendiri (semaphore)
  • Lakukan pembersihan dengan munmap, close, dan shm_unlink

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Memori Bersama” gratis?

Ya — teks lengkap “Memori Bersama” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C Academy, upgrade ke CoddyKit PRO. Kursus C Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Memori Bersama”?

IPC cepat. Kamu berlatih C Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C Academy?

Tidak diperlukan pengalaman sebelumnya. C Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Memori Bersama” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C Academy ini?

Ya. Setiap pelajaran C Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Pipe
  2. Memori Bersama
  3. Antrean Pesan
  4. Sinyal
← Kembali ke C Academy