পাঠ ০৪ · ৫৬-এর মধ্যে · মডিউল ১
Home / Courses / Operating Systems (OS) / OS স্ট্রাকচার

OS স্ট্রাকচার — মনোলিথিক, মাইক্রোকার্নেল, লেয়ার্ড

OS structure — monolithic, microkernel, layered
৮ মিনিট পড়া শুরু · Beginner Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • মনোলিথিক কার্নেল কীভাবে কাজ করে এবং এর গতি বনাম ভঙ্গুরতার ট্রেড-অফ
  • মাইক্রোকার্নেল কীভাবে ফল্ট আইসোলেশন অর্জন করে, এবং এর জন্য কী মূল্য দিতে হয়
  • লেয়ার্ড আর্কিটেকচারের মূল ধারণা এবং এটি কোথায় দেখা যায়
  • Python দিয়ে দুটি কার্নেল ডিজাইনের একটি সরাসরি তুলনামূলক সিমুলেশন

১ · মনোলিথিক কার্নেল

মনোলিথিক কার্নেলMonolithic Kernelসম্পূর্ণ OS (প্রসেস ম্যানেজমেন্ট, মেমরি ম্যানেজমেন্ট, ফাইল সিস্টেম, ডিভাইস ড্রাইভার) একটি একক বড় প্রোগ্রাম হিসেবে কার্নেল মোডে চলে। -এ OS-এর সবগুলো উপাদান — প্রসেস ম্যানেজমেন্ট, মেমরি ম্যানেজমেন্ট, ফাইল সিস্টেম, ডিভাইস ড্রাইভার — একটি একক বড় প্রোগ্রাম হিসেবে কার্নেল মোডে চলে। যেহেতু সবকিছু একই অ্যাড্রেস স্পেসে থাকে, একে অপরকে সরাসরি ফাংশন কল দিয়ে ডাকতে পারে — কোনো আন্তঃ-কম্পোনেন্ট কমিউনিকেশন ওভারহেড নেই, তাই এটি দ্রুত। কিন্তু এই একই কারণে এর একটি গুরুতর দুর্বলতা আছে — কার্নেলের যেকোনো অংশে (এমনকি একটি ডিভাইস ড্রাইভারেও) একটি বাগ পুরো সিস্টেমকে ক্র্যাশ করে দিতে পারে, কারণ সবকিছু একই প্রিভিলেজ লেভেল ও অ্যাড্রেস স্পেস শেয়ার করে। ঐতিহ্যবাহী Linux/Unix ডিজাইন এই মডেলের উদাহরণ (যদিও আধুনিক Linux লোডেবল মডিউল ব্যবহার করে এই ঝুঁকি কিছুটা প্রশমিত করে)।

২ · মাইক্রোকার্নেল

মাইক্রোকার্নেলMicrokernelকার্নেলকে ন্যূনতম রাখে (শুধু বেসিক IPC, শিডিউলিং, মেমরি ম্যানেজমেন্ট) এবং বাকি সব সার্ভিস আলাদা ইউজার-মোড প্রসেসে চলে, মেসেজ পাসিংয়ের মাধ্যমে যোগাযোগ করে। একটি সম্পূর্ণ ভিন্ন দর্শন নেয় — কার্নেলকে যতটা সম্ভব ছোট রাখে (শুধু বেসিক IPC, শিডিউলিং, মেমরি ম্যানেজমেন্ট), এবং ফাইল সিস্টেম বা ডিভাইস ড্রাইভারের মতো বাকি সবকিছুকে আলাদা ইউজার-মোড প্রসেসে সরিয়ে দেয়, যারা একে অপরের সাথে মেসেজ পাসিংয়ের (L08-এ বিস্তারিত IPC) মাধ্যমে যোগাযোগ করে। এর ফল — অনেক বেশি ফল্ট-আইসোলেটেড (একটি ড্রাইভার প্রসেস ক্র্যাশ করলেও কার্নেল নিজে অক্ষত থাকে, ড্রাইভারটি রিস্টার্ট করা যায়), কিন্তু ধীর (কম্পোনেন্টগুলোর মধ্যে প্রতিটি যোগাযোগের জন্যই মেসেজ-পাসিং ওভারহেড লাগে)।

মনোলিথিক কার্নেল প্রসেস ম্যানেজমেন্ট ফাইল সিস্টেম ডিভাইস ড্রাইভার মেমরি ম্যানেজমেন্ট (সব একই অ্যাড্রেস স্পেসে) ন্যূনতম মাইক্রোকার্নেল IPC · শিডিউলিং · মেমরি ফাইল সিস্টেম ড্রাইভার নেটওয়ার্ক (প্রতিটি আলাদা ইউজার-মোড প্রসেস) মেসেজ পাসিং দিয়ে যোগাযোগ
মনোলিথিক ডিজাইনে সবকিছু এক ব্লকে; মাইক্রোকার্নেলে শুধু ন্যূনতম অংশ কার্নেলে, বাকি সব আলাদা প্রসেসে।

৩ · লেয়ার্ড আর্কিটেকচার

লেয়ার্ড আর্কিটেকচারLayered ArchitectureOS-কে একাধিক স্তরে সংগঠিত করা হয়, যেখানে প্রতিটি স্তর শুধু তার ঠিক নিচের স্তরের সার্ভিস ব্যবহার করে। (মূলত ঐতিহাসিক ও শিক্ষামূলক গুরুত্বের) OS-কে একাধিক স্তরে সংগঠিত করে, যেখানে প্রতিটি স্তর শুধু তার ঠিক নিচের স্তরের সার্ভিস ব্যবহার করতে পারে — সবচেয়ে নিচে হার্ডওয়্যার, সবচেয়ে উপরে ইউজার ইন্টারফেস। এই কঠোর স্তরায়ন কোডকে বোঝা ও ডিবাগ করা সহজ করে, কিন্তু প্রতিটি স্তরের সীমানা পার হতে কিছুটা পারফরম্যান্স খরচ হয়। লক্ষ্য করুন — এই ঠিক একই "প্রতিটি স্তর শুধু নিচের স্তরের সার্ভিস ব্যবহার করে" নীতিটি Computer Networks কোর্সের প্রোটোকল-লেয়ারিং ধারণারও ভিত্তি (সেখানে পড়ে থাকলে তা চিনতে পারবেন)।

৪ · একটি তুলনামূলক সিমুলেশন

নিচের কোড সেলে মনোলিথিক ও মাইক্রোকার্নেল ডিজাইনকে fault isolation, IPC ওভারহেড ও উদাহরণ OS-এর ভিত্তিতে পাশাপাশি তুলনা করা হলো।

Python
# কার্নেল ডিজাইনের তুলনা -- fault isolation, IPC ওভারহেড, উদাহরণ (সিমুলেটেড তুলনামূলক টেবিল)
kernel_designs = {
    "মনোলিথিক (Monolithic)": {
        "fault_isolation": "কম -- যেকোনো অংশে (এমনকি ড্রাইভারেও) বাগ পুরো সিস্টেম ক্র্যাশ করাতে পারে",
        "ipc_overhead": "নেই/সামান্য -- সব একই অ্যাড্রেস স্পেসে সরাসরি ফাংশন কল",
        "example_os": "ঐতিহ্যবাহী Linux/Unix ডিজাইন",
    },
    "মাইক্রোকার্নেল (Microkernel)": {
        "fault_isolation": "উচ্চ -- একটি ড্রাইভার প্রসেস ক্র্যাশ করলেও কার্নেল অক্ষত থাকে",
        "ipc_overhead": "বেশি -- কম্পোনেন্টগুলোর মধ্যে মেসেজ পাসিং প্রয়োজন",
        "example_os": "MINIX, QNX",
    },
}

print("কার্নেল ডিজাইন তুলনা\n")
for design, info in kernel_designs.items():
    print(f"[{design}]")
    print(f"  Fault isolation : {info['fault_isolation']}")
    print(f"  IPC ওভারহেড     : {info['ipc_overhead']}")
    print(f"  উদাহরণ OS       : {info['example_os']}")
    print()

# একটি সরল স্কোর -- fault isolation ও গতির মধ্যে ট্রেড-অফ কতটা স্পষ্ট তা দেখানোর জন্য
tradeoff_note = (
    "লক্ষ্য করুন: fault isolation যত বেশি (মাইক্রোকার্নেল), IPC ওভারহেডও তত বেশি -- "
    "এটি একটি সরাসরি ট্রেড-অফ, কোনো ডিজাইনই উভয় দিক থেকে সেরা নয়।"
)
print(tradeoff_note)

    
লক্ষ্য করুন — কোনো সংখ্যাসূচক "স্কোর" এখানে নেই, কারণ fault isolation ও IPC ওভারহেড বাস্তবে পরিমাপযোগ্য হলেও পরস্পরের সাথে সরাসরি তুলনীয় নয় — এটি একটি ইঞ্জিনিয়ারিং ট্রেড-অফ, একটি "সঠিক উত্তর" নয়।
মূল কথা · Key takeaway

মনোলিথিক ও মাইক্রোকার্নেল একটি ক্লাসিক ইঞ্জিনিয়ারিং ট্রেড-অফের দুই প্রান্ত — গতি বনাম আইসোলেশন। বাস্তব সিস্টেমগুলো প্রায়ই এই দুই প্রান্তের মাঝামাঝি কোথাও বসে (যেমন লোডেবল-মডিউল-সহ মনোলিথিক Linux)। L08-এর IPC ও M11-এর প্রোটেকশন মডিউল এই একই থিমগুলো আরও গভীরভাবে অন্বেষণ করবে।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ আধুনিক Linux "মনোলিথিক" হয়েও লোডেবল কার্নেল মডিউল সাপোর্ট করে। এটি কি মাইক্রোকার্নেলের মতোই ফল্ট আইসোলেশন দেয়?

না, সম্পূর্ণভাবে নয়। লোডেবল মডিউল (যেমন একটি ডিভাইস ড্রাইভার) রানটাইমে লোড/আনলোড করা যায়, যা নমনীয়তা দেয়, কিন্তু মডিউলটি এখনও কার্নেল মোডে, একই অ্যাড্রেস স্পেসে চলে — তাই মডিউলের একটি বাগ এখনও পুরো কার্নেলকে ক্র্যাশ করাতে পারে। প্রকৃত মাইক্রোকার্নেল আইসোলেশনের জন্য দরকার সার্ভিসটি সম্পূর্ণ আলাদা ইউজার-মোড প্রসেসে চলা, যেখানে ক্র্যাশ হলে শুধু সেই প্রসেসটিই মরে, কার্নেল নয়।

প্র ০২ মাইক্রোকার্নেলের মেসেজ-পাসিং ওভারহেড ঠিক কোথা থেকে আসে — কেন এটি মনোলিথিক ডিজাইনের সরাসরি ফাংশন কলের চেয়ে ধীর?

মনোলিথিক ডিজাইনে একটি কম্পোনেন্ট আরেকটিকে ডাকা মানে শুধু একটি সাধারণ ফাংশন কল (একই অ্যাড্রেস স্পেস, কোনো মোড সুইচ নেই)। মাইক্রোকার্নেলে ফাইল-সিস্টেম প্রসেস ও ড্রাইভার প্রসেস আলাদা ইউজার-মোড প্রসেস হওয়ায়, তাদের মধ্যে যোগাযোগ করতে হলে কার্নেলের মধ্য দিয়ে একটি প্রকৃত মেসেজ পাঠাতে হয় — এর মানে কমপক্ষে দুটি মোড-সুইচ (L03-এর সিস্টেম কল প্রক্রিয়ার মতো) এবং ডেটা কপি করা, যা সরাসরি ফাংশন কলের চেয়ে বহুগুণ ব্যয়বহুল।

প্র ০৩ উপরের কোড সেলে দুটি ডিজাইনের তুলনা করার সময়, কেন কোনো একক "বিজয়ী" ঘোষণা করা হয়নি?

কারণ fault_isolation ও ipc_overhead সরাসরি বিপরীত দিকে চলে — মাইক্রোকার্নেলের উচ্চ fault isolation তার উচ্চ IPC ওভারহেডের বিনিময়েই আসে। কোড সেলে এই দুটি বৈশিষ্ট্যকে আলাদা স্ট্রিং হিসেবে পাশাপাশি রাখা হয়েছে, একটি সংখ্যায় মিশিয়ে ফেলা হয়নি — কারণ বাস্তবে কোনটি "ভালো" তা নির্ভর করে ব্যবহারের প্রেক্ষাপটের উপর (যেমন একটি এমবেডেড কন্ট্রোল সিস্টেমে আইসোলেশন বেশি গুরুত্বপূর্ণ হতে পারে, একটি হাই-পারফরম্যান্স সার্ভারে গতি)।

অনুশীলন

  1. চিন্তা করুন: আপনি যদি একটি মেডিকেল ডিভাইসের OS ডিজাইন করতেন (যেখানে একটি ড্রাইভার ক্র্যাশ করলেও বাকি সিস্টেম চালু থাকা জরুরি), মনোলিথিক নাকি মাইক্রোকার্নেল বেছে নিতেন?

    এখানে মাইক্রোকার্নেল ডিজাইনের যুক্তি স্পষ্টভাবে জেতে — একটি সেন্সর ড্রাইভার ক্র্যাশ করলেও কার্নেল ও বাকি সিস্টেম (যেমন হার্ট-রেট মনিটরিং) চালু রাখা জীবন-রক্ষাকারী হতে পারে। এখানে fault isolation-এর মূল্য IPC ওভারহেডের খরচের চেয়ে অনেক বেশি গুরুত্বপূর্ণ — এই কারণেই বাস্তবে অনেক সেফটি-ক্রিটিক্যাল এমবেডেড সিস্টেম (যেমন QNX-ভিত্তিক) মাইক্রোকার্নেল আর্কিটেকচার বেছে নেয়।

  2. পরীক্ষা করুন: উপরের কোড সেলে kernel_designs-এ একটি তৃতীয় এন্ট্রি "লেয়ার্ড (Layered)" যোগ করে তার fault_isolation ও ipc_overhead কী হবে বলে মনে করেন তা লিখে Run চাপুন।

    লেয়ার্ড আর্কিটেকচারের fault isolation মনোলিথিকের চেয়ে সামান্য ভালো হতে পারে (স্তরের সীমানা কিছুটা সংগঠন দেয়) কিন্তু মাইক্রোকার্নেলের মতো প্রকৃত প্রসেস-স্তরের আইসোলেশন নেই (সব স্তরই সাধারণত একই কার্নেল মোডে থাকে) — এর IPC ওভারহেড সরাসরি ফাংশন কলের কাছাকাছি (মনোলিথিকের মতো), শুধু প্রতিটি স্তর-অতিক্রমে সামান্য অতিরিক্ত নিয়ন্ত্রণ থাকে। ডিকশনারিতে নতুন এন্ট্রি যোগ করলে তা লুপে স্বয়ংক্রিয়ভাবে তৃতীয় সারি হিসেবে প্রিন্ট হবে।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

আগের পাঠ
সিস্টেম কল ও OS সার্ভিস