0Pricing
C Academy · درس

الذاكرة المشتركة

IPC سريع

الذاكرة المشتركة درس مجاني في C Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.

اتصال سريع بين العمليات باستخدام الذاكرة المشتركة

تتيح الذاكرة المشتركة لعدة عمليات تعيين المنطقة نفسها من الذاكرة الفعلية في مساحات عناوينها. وهي الشكل الأسرع من IPC لأن البيانات لا تُنسخ عبر النواة.

سبب سرعتها

تنسخ القنوات والمقابس البيانات من عملية إلى النواة ثم تعيدها. أما الذاكرة المشتركة فتتجاوز ذلك؛ فبعد تعيينها، تقرأ العمليات البايتات نفسها وتكتبها مباشرةً دون نسخ لكل رسالة.

POSIX مقابل System V

توجد واجهتان لبرمجة التطبيقات:

  • POSIX: shm_open + mmap، شبيهة بالملفات وحديثة
  • System V: shmget + shmat، أقدم وتعتمد على المفاتيح

يُفضّل POSIX عمومًا في الشيفرة الجديدة.

الخطوة 1: إنشاء الكائن

ينشئ shm_open كائن ذاكرة مشتركة مُسمّى أو يفتحه، ويعيد واصف ملف. ويبدأ الاسم بشرطة مائلة، مثل /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 */
}

الخطوة 2: تحديد الحجم

يكون طول كائن الذاكرة المشتركة الجديد صفرًا. استخدموا ftruncate لتحديد حجمه قبل تعيينه.

#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: تعيينه

يعيّن mmap الكائن في مساحة عناوين العملية، ويعيد مؤشرًا تستخدمونه مثل الذاكرة العادية.

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

القراءة والكتابة

بعد التعيين، يكفي إلغاء إشارة المؤشر. ويكون struct الموجود في الذاكرة المشتركة مرئيًا لكل عملية تعيّن الكائن نفسه.

#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

يجب تمرير MAP_SHARED لكي تكون الكتابات مرئية للعمليات الأخرى. أما MAP_PRIVATE فيوفّر تعيينًا خاصًا بنسخ عند الكتابة، ولا تراه العمليات الأخرى مطلقًا.

التزامن مسؤوليتكم

لا توفر الذاكرة المشتركة أي تزامن مضمّن. ومن دون تنسيق، قد تفسد عمليتان البيانات بسبب حالة سباق. احموا الذاكرة باستخدام semaphores أو mutexes أو atomics.

استخدام Semaphore مُسمّى

ينسّق Semaphore مُسمّى من POSIX (sem_open) الوصول. يرسل المنتج إشارة عند جاهزية البيانات، وينتظر المستهلك قبل القراءة.

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

التنظيف

احرصوا دائمًا على تحرير الموارد:

  • استخدموا munmap لإلغاء تعيين المنطقة
  • استخدموا close لإغلاق الواصف
  • استخدموا shm_unlink لإزالة الكائن المُسمّى

وإلا فسيظل الكائن موجودًا في /dev/shm بعد انتهاء العملية.

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

تحقّق سريع

اختبر مدى فهمك للذاكرة المشتركة.

مراجعة

تعلّمتم الذاكرة المشتركة، وهي أسرع أساليب IPC.

  • shm_open، ثم ftruncate، ثم mmap مع MAP_SHARED
  • ألغوا إشارة المؤشر لقراءة البيانات المشتركة وكتابتها
  • يجب أن تضيفوا آلية التزامن الخاصة بكم (semaphores)
  • نظّفوا الموارد باستخدام munmap وclose وshm_unlink

الأسئلة الشائعة

هل درس «الذاكرة المشتركة» مجاني؟

نعم — نص درس «الذاكرة المشتركة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.

ماذا ستتعلم في «الذاكرة المشتركة»؟

IPC سريع تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟

لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «الذاكرة المشتركة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟

نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الأنابيب
  2. الذاكرة المشتركة
  3. قوائم انتظار الرسائل
  4. الإشارات
← العودة إلى C Academy