যখন আমাদের ইতিমধ্যেই ভাগ করা মেমরি আছে তখন কেন আমাদের বার্তা সারি দরকার? এটি একাধিক কারণে হতে পারে, আসুন আমরা এটিকে সরলীকরণের জন্য একাধিক পয়েন্টে বিভক্ত করার চেষ্টা করি -
-
যেমন বোঝা যায়, একবার কোনো প্রক্রিয়ার মাধ্যমে বার্তাটি প্রাপ্ত হলে এটি আর কোনো প্রক্রিয়ার জন্য উপলব্ধ হবে না। যেখানে ভাগ করা মেমরিতে, ডেটা অ্যাক্সেস করার জন্য একাধিক প্রক্রিয়ার জন্য উপলব্ধ।
-
আমরা যদি ছোট বার্তা ফরম্যাটের সাথে যোগাযোগ করতে চাই।
-
শেয়ার করা মেমরি ডেটা সিঙ্ক্রোনাইজেশনের মাধ্যমে সুরক্ষিত করা প্রয়োজন যখন একাধিক প্রক্রিয়া একই সময়ে যোগাযোগ করে।
-
শেয়ার্ড মেমরি ব্যবহার করে লেখা এবং পড়ার ফ্রিকোয়েন্সি বেশি, তাহলে কার্যকারিতা বাস্তবায়ন করা খুব জটিল হবে। এই ধরনের ক্ষেত্রে ব্যবহারের ক্ষেত্রে মূল্য নেই।
-
কি হবে যদি সমস্ত প্রক্রিয়ার শেয়ার করা মেমরি অ্যাক্সেস করার প্রয়োজন না হয় কিন্তু খুব কম প্রসেস শুধুমাত্র এটির প্রয়োজন হয়, তাহলে বার্তা সারি দিয়ে বাস্তবায়ন করা ভাল হবে৷
-
আমরা যদি বিভিন্ন ডাটা প্যাকেটের সাথে যোগাযোগ করতে চাই, বলুন যে প্রসেস এ বি প্রসেস করতে মেসেজ টাইপ 1 পাঠাচ্ছে, সি প্রসেস করতে মেসেজ টাইপ 10 এবং ডি প্রসেস করার জন্য মেসেজ টাইপ 20 পাঠাচ্ছে। এই ক্ষেত্রে, মেসেজ সারি দিয়ে বাস্তবায়ন করা আরও সহজ। প্রদত্ত বার্তাটি 1, 10, 20 হিসাবে সহজ করার জন্য, এটি 0 বা +ve বা –ve হতে পারে যা নীচে আলোচনা করা হয়েছে৷
-
অবশ্যই, বার্তা সারির ক্রম হল FIFO (ফার্স্ট ইন ফার্স্ট আউট)। সারিতে ঢোকানো প্রথম বার্তাটি পুনরুদ্ধার করা প্রথম।
শেয়ার্ড মেমরি বা মেসেজ সারি ব্যবহার করা নির্ভর করে অ্যাপ্লিকেশনটির প্রয়োজনীয়তার উপর এবং এটি কতটা কার্যকরভাবে ব্যবহার করা যেতে পারে৷
বার্তা সারি ব্যবহার করে যোগাযোগ নিম্নলিখিত উপায়ে ঘটতে পারে -
-
একটি প্রক্রিয়া দ্বারা ভাগ করা মেমরিতে লেখা এবং অন্য প্রক্রিয়া দ্বারা ভাগ করা মেমরি থেকে পড়া। আমরা জানি, পড়া একাধিক প্রক্রিয়ার সাথেও করা যেতে পারে।
বিভিন্ন ডেটা প্যাকেট সহ একটি প্রক্রিয়া দ্বারা ভাগ করা মেমরিতে লেখা এবং একাধিক প্রক্রিয়ার মাধ্যমে এটি থেকে পড়া, অর্থাত্ বার্তার ধরন অনুযায়ী৷
বার্তা সারি সম্পর্কে কিছু তথ্য দেখার পরে, এখন সময় এসেছে সিস্টেম কল (সিস্টেম V) যা বার্তা সারি সমর্থন করে তা পরীক্ষা করার৷
বার্তা সারি ব্যবহার করে যোগাযোগ সঞ্চালন করতে, নিম্নলিখিত ধাপগুলি হল −
ধাপ 1 − একটি বার্তা সারি তৈরি করুন বা ইতিমধ্যে বিদ্যমান একটি বার্তা সারিতে সংযোগ করুন (msgget())
ধাপ 2 - বার্তা সারিতে লিখুন (msgsnd())
ধাপ 3 - বার্তা সারি থেকে পড়ুন (msgrcv())
পদক্ষেপ 4৷ − বার্তা সারিতে (msgctl())
নিয়ন্ত্রণ অপারেশন সম্পাদন করুনএখানে আমরা দুটি প্রক্রিয়া তৈরি করব। একজন লিখতে পারে আরেকজন পড়তে পারে। আসুন দেখি কিভাবে পাঠক এবং লেখক প্রক্রিয়াগুলি ভাগ করা মেমরি ব্যবহার করে কাজ করছে৷
উদাহরণ কোড
#include <stdio.h> #include <sys/ipc.h> #include <sys/msg.h> // structure for message queue struct msg_buffer { long msg_type; char msg[100]; } message; main() { key_t my_key; int msg_id; my_key = ftok("progfile", 65); //create unique key msg_id = msgget(my_key, 0666 | IPC_CREAT); //create message queue and return id message.msg_type = 1; printf("Write Message : "); fgets(message.msg, 100, stdin); msgsnd(msg_id, &message, sizeof(message), 0); //send message printf("Sent message is : %s \n", message.msg); }
উদাহরণ কোড
#include <stdio.h> #include <sys/ipc.h> #include <sys/msg.h> // Define message queue structure struct msg_buffer { long msg_type; char msg[100]; } message; main() { key_t my_key; int msg_id; my_key = ftok("progfile", 65); //create unique key msg_id = msgget(my_key, 0666 | IPC_CREAT); //create message queue and return id msgrcv(msg_id, &message, sizeof(message), 1, 0); //used to receive message // display the message printf("Received Message is : %s \n", message.msg); msgctl(msg_id, IPC_RMID, NULL); //destroy the message queue return 0; }ধ্বংস করুন
আউটপুট