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

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

যখন শেয়ার্ড মেমরি (shared memory) আছে, তবও মেসেজ কিউ (message queues) কেন দরকার? এর একাধিক কারণ হতে পারে, আসুন এটাকে একাধিক পয়েন্টে ভাগ করে সহজ করে বুঝি:

  • যখন একটি প্রসেস মেসেজ রিসিভ করে, তখন সেটি আর অন্য কোনো প্রসেসের জন্য উপলব্ধ নয়। কিন্তু শেয়ার্ড মেমরিতে ডেটা একাধিক প্রসেসের জন্য উপলব্ধ থাকে।

  • যদি ছোট মেসেজ ফরম্যাটে কমিউনিকেশন করতে চাই।

  • শেয়ার্ড মেমরির ডেটা একাধিক প্রসেস একই সময় অ্যাক্সেস করলে সিঙ্ক্রোনাইজেশন দিয়ে প্রোটেক্ট করতে হয়।

  • শেয়ার্ড মেমরি ব্যবহার করে পড়া-লেখার ফ্রিকোয়েন্সি বেশি হলে, ফাংশনালিটি ইমপ্লিমেন্ট করা খুব জটিল হয়। এমন কেসে এটি ব্যবহার করার মান নেই।

  • যদি সব প্রসেস শেয়ার্ড মেমরি অ্যাক্সেস না করে খুব কম প্রসেসই অ্যাক্সেস করে, তবে মেসেজ কিউতে ইমপ্লিমেন্ট করা ভালো।

  • যদি ভিন্ন ডেটা প্যাকেট দিয়ে কমিউনিকেশন করতে চাই: প্রসেস A, প্রসেস B-কে মেসেজ টাইপ ১, প্রসেস C-কে মেসেজ টাইপ ১০, প্রসেস D-কে মেসেজ টাইপ ২০ পাঠায়। এই কেসে মেসেজ কিউতে ইমপ্লিমেন্ট করা সহজ। মেসেজ টাইপ ১, ১০, ২০ সহজ করতে ০ বা +ve বা -ve হতে পারে (নিচে আলোচনা করা হয়েছে)।

  • অবশ্যই, মেসেজ কিউর অর্ডার FIFO (First In First Out)। কিউতে প্রথম ইনসার্ট করা মেসেজটি প্রথমে রিট্রিভ হবে।

শেয়ার্ড মেমরি নাকি মেসেজ কিউ ব্যবহার করা হবে তা অ্যাপ্লিকেশনের প্রয়োজন এবং কতটা কার্যকরভাবে ব্যবহার করা যাবে তার ওপর নির্ভর করে।

মেসেজ কিউ ব্যবহার করে কমিউনিকেশন নিচের পদ্ধতিতে হয়ে থাকতে পারে:

  • একটি প্রসেস শেয়ার্ড মেমরিতে লিখে এবং অন্য একটি প্রসেস শেয়ার্ড মেমরি থেকে পড়ে। আমরা জানি, পড়া একাধিক প্রসেসও করতে পারে।
    IPC: মেসেজ কিউ (Message Queues) ব্যবহার করে ইন্টার-প্রসেস কমিউনিকেশন

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

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

মেসেজ কিউর উপর কিছু তথ্য দেখার পর, এখন সিস্টেম কল (System V) চেক করব যেটি মেসেজ কিউ সাপোর্ট করে।

মেসেজ কিউ ব্যবহার করে কমিউনিকেশন করার ধাপগুলো:

Step 1 - মেসেজ কিউ তৈরি করা বা ইতিমধ্যে বিদ্যমান মেসেজ কিউতে কানেক্ট করা (msgget())

Step 2 - মেসেজ কিউতে লেখা (msgsnd())

Step 3 - মেসেজ কিউ থেকে পড়া (msgrcv())

Step 4 - মেসেজ কিউতে কন্ট্রোল অপারেশন করা (msgctl())

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

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

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>

// মেসেজ কিউর জন্য স্ট্রাকচার
struct msg_buffer {
    long msg_type;
    char msg[100];
} message;

int main() {
    key_t my_key;
    int msg_id;
    my_key = ftok("progfile", 65); // ইউনিক কি তৈরি
    msg_id = msgget(my_key, 0666 | IPC_CREAT); // মেসেজ কিউ তৈরি ও আইডি ফেরত
    message.msg_type = 1;
    printf("Write Message: ");
    fgets(message.msg, 100, stdin);
    msgsnd(msg_id, &message, sizeof(message), 0); // মেসেজ পাঠানো
    printf("Sent message is: %s \n", message.msg);
    return 0;
}

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

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>

// মেসেজ কিউ স্ট্রাকচার ডিফাইন
struct msg_buffer {
    long msg_type;
    char msg[100];
} message;

int main() {
    key_t my_key;
    int msg_id;
    my_key = ftok("progfile", 65); // ইউনিক কি তৈরি
    msg_id = msgget(my_key, 0666 | IPC_CREAT); // মেসেজ কিউ তৈরি ও আইডি ফেরত
    msgrcv(msg_id, &message, sizeof(message), 1, 0); // মেসেজ রিসিভ
    // মেসেজ ডিসপ্লে
    printf("Received Message is: %s \n", message.msg);
    msgctl(msg_id, IPC_RMID, NULL); // মেসেজ কিউ ধ্বংস
    return 0;
}

আউটপুট

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

  1. C-তে লিংকড লিস্ট ব্যবহার করে প্রায়োরিটি কিউ (Priority Queue using Linked List)

  2. C++ কিউ ব্যবহার করে BST-এ একটি পথ রিভার্স করুন

  3. ডাবলি লিংকড লিস্ট দিয়ে প্রায়োরিটি কিউ বাস্তবায়ন C++-তে

  4. Truecaller ব্যবহার করে মেসেজ শিডিউল করার পদ্ধতি