কম্পিউটার টিউটোরিয়াল

IPC: শেয়ার্ড মেমরি (Shared Memory) ব্যবহার করে ইন্টার-প্রসেস কমিউনিকেশন

শেয়ার্ড মেমরি (Shared memory) হলো দুটি বা ততোধিক প্রসেসের মধ্যে শেয়ার করা মেমরি। তবে, আমাদের মেমরি শেয়ার করার বা অন্য কোনো কমিউনিকেশন মিডিয়াম কেন দরকার?

দুहरাতে হলে, প্রতিটি প্রসেসের নিজস্ব অ্যাড্রেস স্পেস (address space) থাকে। যদি কোনো প্রসেস নিজের অ্যাড্রেস স্পেস থেকে কোনো ইনফরমেশন অন্য প্রসেসে পাঠাতে চায়, তবে সেটি শুধু IPC (Inter Process Communication) টেকনিক দিয়ে সম্ভব। আমরা ইতিমধ্যে জানি, কমিউনিকেশন রিলেটেড (related) বা আনরিলেটেড (unrelated) প্রসেসের মধ্যে হয়তে পারে।

সাধারণত, ইন্টার-রিলেটেড প্রসেস কমিউনিকেশন পাইপ (Pipes) বা নামড পাইপ (Named Pipes) দিয়ে করা হয়। আনরিলেটেড প্রসেস (যেমন একটি প্রসেস একটা টার্মিনালে এবং অন্যটি আরেকটা টার্মিনালে চলছে) কমিউনিকেশন নামড পাইপ বা জনপ্রিয় IPC টেকনিক শেয়ার্ড মেমরি এবং মেসেজ কিউ দিয়ে করা হয়।

আমরা ইতিমধ্যে পাইপ এবং নামড পাইপের IPC টেকনিক দেখেছি। এখন বাকি IPC টেকনিকগুলো জানার পালা: শেয়ার্ড মেমরি (Shared Memory), মেসেজ কিউ (Message Queues), সেমাফোর (Semaphores), সিগন্যাল (Signals), এবং মেমরি ম্যাপিং (Memory Mapping)।

IPC: শেয়ার্ড মেমরি (Shared Memory) ব্যবহার করে ইন্টার-প্রসেস কমিউনিকেশন

দুই বা ততোধিক প্রসেসের মধ্যে কমিউনিকেশনের জন্য শেয়ার্ড মেমরি ব্যবহার করার আগে সিস্টেম কল দিয়ে কী কী করতে হয়, তা দেখি:

  • শেয়ার্ড মেমরি সেগমেন্ট তৈরি করা বা ইতিমধ্যে তৈরি শেয়ার্ড মেমরি সেগমেন্ট ব্যবহার করা (shmget())
  • প্রসেসকে ইতিমধ্যে তৈরি শেয়ার্ড মেমরি সেগমেন্টের সাথে আট্যাচ করা (shmat())
  • প্রসেসকে ইতিমধ্যে আট্যাচ করা শেয়ার্ড মেমরি সেগমেন্ট থেকে ডিট্যাচ করা (shmdt())
  • শেয়ার্ড মেমরি সেগমেন্টের উপর কন্ট্রোল অপারেশন (shmctl())

এখানে আমরা দুটি প্রসেস তৈরি করব। একটি লিখবে এবং অন্যটি পড়বে। শেয়ার্ড মেমরি ব্যবহার করে রিডার এবং রাইটার প্রসেস কীভাবে কাজ করে তা দেখি।

রাইটার প্রসেস (Writer Process)

#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
using namespace std;

int main() {
    key_t my_key = ftok("shmfile", 65); // ftok ফাংশন ইউনিক কি জেনারেট করে
    int shmid = shmget(my_key, 1024, 0666 | IPC_CREAT); // shmget আইডি ফেরত দেয় shmid-এ
    char* str = (char*) shmat(shmid, (void*)0, 0); // shmat শেয়ার্ড মেমরিতে জয়েন করে
    cout << "Write Data: ";
    fgets(str, 50, stdin);
    printf("Data written in memory: %s\n", str);
    // শেয়ার্ড মেমরি থেকে ডিট্যাচ
    shmdt(str);
    return 0;
}

রিডার প্রসেস (Reader Process)

#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
using namespace std;

int main() {
    key_t my_key = ftok("shmfile", 65); // ftok ফাংশন ইউনিক কি জেনারেট করে
    int shmid = shmget(my_key, 1024, 0666 | IPC_CREAT); // shmget আইডি ফেরত দেয় shmid-এ
    char* str = (char*) shmat(shmid, (void*)0, 0); // shmat শেয়ার্ড মেমরিতে জয়েন করে
    printf("Data read from memory: %s\n", str);
    shmdt(str);
    shmctl(shmid, IPC_RMID, NULL); // শেয়ার্ড মেমরি ধ্বংস
    return 0;
}

আউটপুট

IPC: শেয়ার্ড মেমরি (Shared Memory) ব্যবহার করে ইন্টার-প্রসেস কমিউনিকেশন

  1. IPC: মেসেজ কিউ (Message Queues) ব্যবহার করে ইন্টার-প্রসেস কমিউনিকেশন

  2. ডিস্ট্রিবিউটেড শেয়ারড মেমরি বাস্তবায়নের অ্যালগরিদম

  3. গুগল ক্রোম মেমরি ব্যবহার ও লিক সমস্যা বুঝুন এবং ফিক্স করুন

  4. IRQL_NOT_LESS_OR_EQUAL (0x0000000A) বাগ চেক সমাধান – ড্রাইভার ও মেমরি ফিক্সের ধাপে ধাপে গাইড