সরাসরি পর্বে যান
পর্ব ২৬ · ৫৫-এর মধ্যে · মডিউল ৪

অপারেটিং সিস্টেমের ভেতরে — process, scheduling আর file system

Operating System Internals — Kernel, System Calls, Processes, CPU Scheduling, Deadlock and File Systems

Taught in Bangla, this lesson looks inside the operating system: the kernel and user versus kernel mode, system calls and interrupts, processes and threads, multitasking and CPU scheduling, inter-process communication, synchronization and deadlock, memory management and file systems built on blocks, permissions and drivers, types of operating systems, virtualization and containers.

এই পর্বে যা শিখবেন

  • kernel আর user space, user mode আর kernel mode — কেন অ্যাপ সরাসরি হার্ডওয়্যার ছুঁতে পারে না
  • system call আর interrupt — একটি ফাইল খোলার পুরো যাত্রা অ্যাপ থেকে ডিস্ক পর্যন্ত
  • process, PCB, process state, thread, context switch আর multitasking-এর “একসাথে চলার” মায়া
  • FCFS, SJF, Round Robin আর priority scheduling — Gantt chart এঁকে গড় waiting time হিসাব
  • deadlock-এর চার শর্ত, file system (FAT32, exFAT, NTFS, ext4, APFS), journaling, permission, OS-এর প্রকারভেদ আর virtualization

১ · এক কম্পিউটার, অনেক দাবিদার — kernel আর দুই mode

এই মুহূর্তে আপনার কম্পিউটারে হয়তো ব্রাউজারে এই পাতা খোলা, পাশে গান বাজছে, পেছনে Windows আপডেট নামাচ্ছে, অ্যান্টিভাইরাস ফাইল দেখছে। অথচ CPU-তে core হয়তো চারটি বা আটটি, আর চলমান প্রোগ্রাম কয়েকশো। সবাই CPU চায়, সবাই RAM চায়, সবাই ডিস্কে লিখতে চায়। কেউ কারও জায়গায় হাত দিলে বা একজন সব সময় দখল করে রাখলে কম্পিউটার অচল হয়ে যেত।

পর্ব ০৬-এ আপনি অপারেটিং সিস্টেমকে দেখেছেন ব্যবহারকারীর চোখে — Start মেনু, ফাইল, সেটিংস। এই পর্বে আমরা ঢুকব পর্দার পেছনে। সেখানে OS-এর আসল পরিচয় একটি বাক্যে:

মূল ধারণা

অপারেটিং সিস্টেম হলো ম্যানেজার, যে একটি কম্পিউটারকে অনেক প্রোগ্রাম আর অনেক ব্যবহারকারীর মধ্যে ভাগ করে দেয়। সে ঠিক করে কোন প্রোগ্রাম CPU-তে কতক্ষণ চলবে, প্রত্যেককে নিজের সুরক্ষিত মেমরি দেয়, ডিস্কের কাঁচা block-কে ফাইল আর ফোল্ডারে রূপ দেয়, আর প্রোগ্রামকে হার্ডওয়্যার ব্যবহার করতে দেয় শুধু কয়েকটি নিরাপদ, নিয়ন্ত্রিত দরজা দিয়ে।

উপমা: কমলাপুর রেলস্টেশনের কথা ভাবুন। লাইন আর প্ল্যাটফর্ম সীমিত, ট্রেন অনেক। কোন ট্রেন কোন লাইনে কখন ঢুকবে, কতক্ষণ দাঁড়াবে — ঠিক করেন স্টেশন মাস্টার আর সিগন্যাল কেবিন। ট্রেনের চালক নিজে সিগন্যাল বদলাতে পারেন না; তিনি অনুরোধ করেন, কেবিন অনুমতি দেয়। কম্পিউটারে ট্রেন হলো প্রোগ্রাম, লাইন হলো CPU আর মেমরি, আর সিগন্যাল কেবিন হলো OS-এর হৃদয় — kernel.

Kernel space আর user space

OS-এর সব অংশ সমান ক্ষমতার নয়। কেন্দ্রে থাকে kernel — যে সরাসরি CPU, মেমরি আর ডিভাইস নিয়ন্ত্রণ করে। kernel যে মেমরি-এলাকায় থাকে, তাকে বলে kernel space; সেখানে সাধারণ প্রোগ্রামের ঢোকা নিষেধ। আপনার ব্রাউজার, Word, গেম — এমনকি OS-এর অনেক অংশ, যেমন File Explorer বা Settings অ্যাপ — চলে user space-এ।

User mode আর kernel mode — CPU-র ভেতরের তালা

এই ভাগ শুধু নিয়মের খাতায় নয়, CPU-র হার্ডওয়্যারেই বাঁধা। CPU দুই রকম অবস্থায় চলতে পারে। User mode-এ কিছু নির্দেশ (instruction) চালানো নিষেধ — যেমন সরাসরি ডিস্ক কন্ট্রোলারে লেখা, অন্য প্রোগ্রামের মেমরি পড়া, বা টাইমার বন্ধ করা। এমন নির্দেশ চালাতে গেলে CPU নিজেই থেমে OS-কে খবর দেয়, আর OS সাধারণত প্রোগ্রামটি বন্ধ করে দেয়। Kernel mode-এ সব নির্দেশ চলে — শুধু kernel-এর কোড এই অবস্থায় চলে। Intel/AMD CPU-তে এগুলোকে বলে ring 3 আর ring 0; ARM চিপে EL0 আর EL1.

User mode

ব্রাউজার, গেম, Excel — সব অ্যাপ। নিজের মেমরি ছাড়া কিছু ছুঁতে পারে না। ভুল করলে শুধু নিজেই বন্ধ হয় (“Not responding”, তারপর End task).

সীমিত ক্ষমতা

Kernel mode

kernel আর বেশিরভাগ device driver. সব হার্ডওয়্যার আর সব মেমরি ছুঁতে পারে। এখানে ভুল হলে পুরো কম্পিউটার আটকে যায় — Windows-এর নীল পর্দা (BSOD) বা Linux-এর kernel panic.

পূর্ণ ক্ষমতা

কেন এত কড়াকড়ি? যেকোনো অ্যাপ সরাসরি ডিস্কে লিখতে বা অন্যের মেমরি পড়তে পারলে একটি বাগ-ওয়ালা গেম ফাইল-তালিকা মুছে দিত, আর একটি ক্ষতিকর অ্যাপ ব্যাংকিং অ্যাপের পাসওয়ার্ড পড়ে ফেলত। দুই mode-এর দেয়াল একটি অ্যাপের ভুল সেই অ্যাপের মধ্যেই আটকে রাখে — আধুনিক কম্পিউটারের স্থিরতা আর নিরাপত্তার ভিত্তি এটাই।

২ · System call আর interrupt — নিয়ন্ত্রিত দরজা আর হার্ডওয়্যারের ডাক

অ্যাপ যদি হার্ডওয়্যার ছুঁতেই না পারে, তাহলে Notepad ফাইল সেভ করে কীভাবে? উত্তর: অনুরোধ করে। kernel-এর কাছে কাজ চাওয়ার নির্দিষ্ট, নিয়ন্ত্রিত দরজাকে বলে system call. ব্যাংকের কাউন্টারের মতো ভাবুন — আপনি ভল্টে ঢুকতে পারেন না, কিন্তু কাউন্টারে ফর্ম দিলে কর্মকর্তা আপনার পরিচয় যাচাই করে টাকা এনে দেন।

আপনি যা করেনঅ্যাপ kernel-কে যা বলেLinux-এ system call
একটি ফাইল খোলা“এই নামের ফাইলটি খুলে দাও”open, তারপর read
লেখা সেভ করা“এই byte-গুলো ফাইলে লিখে দাও”write
WhatsApp-এ বার্তা পাঠানো“এই ডেটা নেটওয়ার্কে পাঠাও”socket, send
নতুন প্রোগ্রাম খোলা“নতুন একটি process বানাও”fork, execve

Windows-এ অ্যাপ সাধারণত সরাসরি system call ডাকে না, ডাকে Win32 API-র ফাংশন (যেমন CreateFileW), আর সেই ফাংশন ভেতরে kernel-এর system call করে। Linux-এ কয়েকশো system call আছে। প্রতিবার system call হলে CPU user mode থেকে kernel mode-এ যায়, kernel কাজ শেষ করে, তারপর আবার user mode-এ ফিরে আসে। নিচে একটি ফাইল খোলার পুরো যাত্রা দেখুন:

  1. অ্যাপnotes.txtuser mode
  2. System callopen()mode বদল
  3. Kernelঅনুমতি?kernel mode
  4. File systemনাম → blockNTFS, ext4
  5. DriverNVMe/SATAদোভাষী
  6. SSD/HDDblock পড়াinterrupt
  1. অ্যাপ চাইছে। আপনি Notepad-এ File → Open দিয়ে notes.txt বাছলেন। Notepad চলছে user mode-এ; ডিস্কে সরাসরি হাত দেওয়ার ক্ষমতা তার নেই।
  2. System call — দরজায় টোকা। Notepad একটি system call করে (Linux-এ open, Windows-এ শেষ পর্যন্ত NtCreateFile). একটি বিশেষ CPU-নির্দেশ চালু হয়, CPU kernel mode-এ চলে যায়, আর নিয়ন্ত্রণ যায় kernel-এর একটি নির্দিষ্ট প্রবেশপথে — অ্যাপ নিজের ইচ্ছামতো kernel-এর যেকোনো জায়গায় লাফ দিতে পারে না।
  3. Kernel যাচাই করে। ফাইলটি আছে কি না, আর এই ব্যবহারকারীর পড়ার অনুমতি আছে কি না (অংশ ৭)। অনুমতি না থাকলে এখানেই “Access denied” ফেরত যায়।
  4. File system ঠিকানা খোঁজে। path ধরে ফোল্ডারের পর ফোল্ডার খুঁজে ফাইলের metadata পায় — আকার, তারিখ, আর সবচেয়ে জরুরি: ডিস্কের কোন কোন block-এ ফাইলের লেখা আছে।
  5. Driver হার্ডওয়্যারের ভাষায় বলে। ডিস্কের driver সেই block নম্বরগুলো SSD বা HDD-র নিজস্ব কমান্ডে রূপান্তর করে কন্ট্রোলারে পাঠায়। এই ফাঁকে Notepad “Waiting” অবস্থায় যায়, আর CPU অন্য প্রোগ্রাম চালায় — বসে থাকে না।
  6. ডিস্ক পড়ে, interrupt দিয়ে ডাকে। SSD block পড়ে ডেটা RAM-এ রাখে, তারপর CPU-কে একটি interrupt পাঠায়: “কাজ শেষ!” CPU হাতের কাজ এক মুহূর্ত থামিয়ে kernel-এর interrupt handler চালায়।
  7. ডেটা ফিরে যায়। kernel ডেটা Notepad-এর নিজের মেমরিতে কপি করে, Notepad-কে আবার “Ready” করে, আর তার পালা এলে CPU user mode-এ ফিরে Notepad চালায়। পর্দায় লেখা ভেসে ওঠে — পুরো যাত্রায় হয়তো এক মিলিসেকেন্ডও লাগেনি।

Interrupt — হার্ডওয়্যার যেভাবে CPU-র মনোযোগ পায়

CPU যদি বারবার কিবোর্ডকে জিজ্ঞেস করত “কোনো বোতাম চাপা হয়েছে?”, তাহলে তার বেশিরভাগ সময় নষ্ট হতো। এর বদলে হার্ডওয়্যার নিজেই CPU-কে একটি সংকেত পাঠায় — interrupt. ক্লাসে ছাত্র হাত তোলার মতো: শিক্ষক পড়াতে থাকেন, কেউ হাত তুললে এক বাক্য শেষ করে তার কথা শোনেন, তারপর আবার পড়ানো শুরু করেন। CPU-ও তাই করে: হাতের নির্দেশটি শেষ করে, বর্তমান অবস্থা সংরক্ষণ করে, kernel-এর নির্দিষ্ট interrupt handler চালায়, তারপর আগের কাজে ফেরে।

  • কিবোর্ড ও মাউস: প্রতিটি চাপ বা নড়াচড়ায় interrupt — তাই টাইপ করা অক্ষর সঙ্গে সঙ্গে পর্দায় আসে।
  • ডিস্ক ও নেটওয়ার্ক কার্ড: “ডেটা পড়া শেষ”, “নতুন প্যাকেট এসেছে”।
  • টাইমার: সবচেয়ে গুরুত্বপূর্ণ। একটি হার্ডওয়্যার টাইমার নিয়মিত বিরতিতে interrupt দেয়। এতে কোনো প্রোগ্রাম অসীম লুপে আটকে গেলেও kernel নিয়ন্ত্রণ ফিরে পায় আর অন্যকে CPU দিতে পারে (অংশ ৪)।

৩ · Process আর thread — চলমান প্রোগ্রামের জীবন

ডিস্কে রাখা chrome.exe একটি প্রোগ্রাম — নিষ্ক্রিয় একটি ফাইল, রান্নার রেসিপির বইয়ের মতো। আপনি যখন সেটি চালান, OS প্রোগ্রামটি RAM-এ এনে চালু করে — এই চলমান রূপের নাম process. রেসিপি একটি, কিন্তু একই রেসিপি দিয়ে তিনটি চুলায় তিনবার রান্না চলতে পারে — তেমনি একই প্রোগ্রাম থেকে একাধিক process হতে পারে (যেমন দুটি আলাদা Notepad উইন্ডো)।

একটি process-এর ভেতরে কী থাকে

  • Code (text): প্রোগ্রামের নির্দেশগুলো — শুধু পড়া যায়।
  • Data ও heap: global ভেরিয়েবল আর চলার সময় চাওয়া মেমরি (যেমন খোলা ছবির pixel).
  • Stack: কোন ফাংশন কাকে ডেকেছে, local ভেরিয়েবল — কাজ শেষে আপনা-আপনি খালি হয়।
  • PCB (Process Control Block): এটি process-এর ভেতরে নয়, kernel-এর কাছে থাকা তার “পরিচয়পত্র” — process ID (PID), বর্তমান অবস্থা, CPU-র register-এর শেষ মান, কোন নির্দেশ পর্যন্ত চলেছে (program counter), কোন মেমরি তার, কোন ফাইল খোলা, অগ্রাধিকার কত। হাসপাতালের রোগীর ফাইলের মতো — ডাক্তার বদলালেও ফাইল দেখে চিকিৎসা ঠিক সেখান থেকে চলে।

Process-এর পাঁচ অবস্থা

জন্ম থেকে মৃত্যু পর্যন্ত একটি process কয়েকটি অবস্থার মধ্যে ঘোরে:

Process state diagram

New → Ready ⇄ Running → Terminated, with Running → Waiting → Ready

Process-এর পাঁচ অবস্থার চিত্র New থেকে admit হয়ে Ready, Ready থেকে dispatch হয়ে Running, Running থেকে সময় শেষ হলে আবার Ready, Running থেকে exit হয়ে Terminated, Running থেকে I/O-র অপেক্ষায় Waiting, আর Waiting থেকে I/O শেষ হলে Ready. New Ready Running Terminated Waiting admit dispatch সময় শেষ exit I/O-র অপেক্ষা I/O শেষ
ছবি ২৬.১ — Running থেকে সরাসরি Ready-তে ফেরা মানে “সময় শেষ, লাইনে দাঁড়াও”; Waiting থেকে কেউ সরাসরি Running-এ যায় না, আগে Ready-তে আসে।
  • New: process তৈরি হচ্ছে — PCB বানানো, মেমরি বরাদ্দ।
  • Ready: সব প্রস্তুত, শুধু CPU-র অপেক্ষা। এমন process-দের সারিকে বলে ready queue.
  • Running: এই মুহূর্তে CPU-তে চলছে। একটি core-এ একসাথে একটিই।
  • Waiting (Blocked): কোনো ঘটনার অপেক্ষা — ডিস্ক থেকে ডেটা, ব্যবহারকারীর টাইপ, নেটওয়ার্কের উত্তর। CPU দিলেও এখন কিছু করতে পারত না।
  • Terminated: কাজ শেষ বা জোর করে বন্ধ; kernel মেমরি আর PCB ফেরত নেয়।

এবার দেখুন, একটি core-এ দুটি প্রোগ্রাম — A (একটি Excel হিসাব, যে মাঝে ডিস্ক থেকে ফাইল পড়বে) আর B (গান বাজানোর প্রোগ্রাম) — কীভাবে পালা করে চলে:

একটি core-এ দুটি process
ঘটনা
Process A (Excel)
Process B (গান)
CPU-তে চলছে
ডিস্ক
  1. দুটি process জন্ম নিল। kernel দুজনের PCB বানিয়ে মেমরি দিল, তারপর দুজনকেই ready queue-তে রাখল। CPU এখনো কাউকে দেওয়া হয়নি।
  2. A Running. kernel-এর scheduler সারির প্রথম জন A-কে বাছল। A হিসাব করছে; B অপেক্ষা করছে — Ready, কিন্তু চলছে না।
  3. A ডিস্ক চাইল → Waiting. A একটি system call দিয়ে ফাইল পড়তে চাইল। ডিস্ক CPU-র তুলনায় হাজার হাজার, এমনকি লাখ গুণ ধীর, তাই CPU-কে বসিয়ে রাখার মানে নেই। A চলে গেল Waiting-এ, আর B পেল CPU — গান বাজতে থাকল। এটাই multiprogramming-এর মূল লাভ।
  4. ডিস্কের interrupt. ডেটা পড়া শেষ — ডিস্ক interrupt দিল। kernel এক মুহূর্তের জন্য B-কে থামিয়ে handler চালাল, A-কে Waiting থেকে Ready-তে আনল (সরাসরি Running-এ নয়!), তারপর B আবার চলতে থাকল।
  5. টাইমার interrupt — পালা বদল। B-র বরাদ্দ সময় (time slice) শেষ। kernel B-কে Ready-তে পাঠিয়ে A-কে CPU দিল। একজনের অবস্থা সংরক্ষণ করে আরেকজনেরটা ফিরিয়ে আনার এই কাজের নাম context switch (অংশ ৪)।
  6. A শেষ → Terminated. A কাজ শেষ করে exit করল; kernel তার মেমরি আর PCB ফেরত নিল। B আবার CPU পেল। পুরো সময় কোনো মুহূর্তে CPU অলস বসে থাকেনি।

Thread — একই ঘরে কয়েকজন কারিগর

একটি process-এর ভেতরে কাজের একাধিক স্বাধীন ধারা থাকতে পারে — প্রতিটিকে বলে thread. সব thread একই process-এর কোড, ডেটা আর খোলা ফাইল ভাগ করে নেয়; প্রত্যেকের শুধু নিজের stack আর register-এর মান আলাদা। তাই thread বানানো আর এক thread থেকে আরেক thread-এ যাওয়া process-এর তুলনায় সস্তা — একে “light-weight process” বলা হয়।

উদাহরণ: একটি ওয়েব ব্রাউজার। Chrome শুরু থেকেই (২০০৮) ট্যাবগুলোকে আলাদা process-এ চালানোর নকশা নেয়; আজকের Chrome আর Edge সাধারণত প্রতিটি ওয়েবসাইটকে আলাদা process-এ রাখে — একটি ট্যাব ক্র্যাশ করলে বাকিগুলো বাঁচে, আর এক সাইট আরেক সাইটের মেমরি পড়তে পারে না। আবার প্রতিটি process-এর ভেতরে অনেকগুলো thread — একটি পাতা আঁকে, একটি নেটওয়ার্ক থেকে ডেটা আনে, একটি JavaScript চালায়।

বিষয়ProcessThread
মেমরিনিজস্ব, অন্যের থেকে সুরক্ষিতএকই process-এর সবার সাথে ভাগ করা
তৈরি ও বদলের খরচবেশিকম
একজন ক্র্যাশ করলেসাধারণত শুধু সেই process বন্ধ হয়পুরো process-ই বন্ধ হতে পারে
নিজেদের মধ্যে যোগাযোগkernel-এর সাহায্যে (IPC)সরাসরি একই মেমরিতে — দ্রুত, কিন্তু সাবধানতা লাগে

৪ · Multitasking আর CPU scheduling — কে কখন CPU পাবে

একটি core একসাথে একটিই নির্দেশ-ধারা চালায়। তবু আপনি গান শুনতে শুনতে টাইপ করেন, আর মনে হয় সব একসাথে চলছে। রহস্যটা গতিতে। OS প্রত্যেক process-কে ছোট একটি সময়-টুকরো দেয় — time slice বা quantum, সাধারণত কয়েক মিলিসেকেন্ড থেকে কয়েক দশ মিলিসেকেন্ড। টুকরো শেষ হলে টাইমার interrupt আসে, আর kernel পরের জনকে CPU দেয়। সেকেন্ডে শত শত বার এই পালা বদল হয় বলে মানুষের চোখে মনে হয় সবাই একসাথে চলছে — একে বলে multitasking.

উপমা: দাবা খেলায় একজন গ্র্যান্ডমাস্টার একসাথে ২০ জনের সাথে “simultaneous exhibition” খেলেন। তিনি টেবিলে টেবিলে ঘুরে প্রতিটিতে একটি চাল দেন। প্রতিটি প্রতিপক্ষের মনে হয় তিনি তাঁর সাথেই খেলছেন — আসলে তিনি একা, শুধু দ্রুত ঘুরছেন। প্রতিটি টেবিলে বোর্ডের অবস্থা দেখে খেলা ঠিক সেখান থেকে ধরেন — ঠিক PCB-র মতো।

Context switch — পালা বদলের খরচ

এক process থেকে আরেক process-এ যেতে kernel-কে তিনটি কাজ করতে হয়: চলমান process-এর register আর program counter তার PCB-তে লিখে রাখা, পরের process-এর PCB থেকে সেগুলো CPU-তে ফিরিয়ে আনা, আর মেমরির মানচিত্র বদলানো। এর নাম context switch. এতে সাধারণত কয়েক মাইক্রোসেকেন্ড লাগে, আর এই সময়টায় কোনো ব্যবহারকারীর কাজ হয় না — শুধু হিসাবরক্ষণ। এজন্য time slice খুব ছোট করলে CPU-র বড় অংশ পালা বদলেই নষ্ট হয়, আর খুব বড় করলে কম্পিউটার “আটকে আটকে” চলে মনে হয়।

Scheduling-এর হিসাবের ভাষা

Ready queue-তে কয়েকটি process দাঁড়িয়ে — scheduler কাকে আগে দেবে? সেটা ঠিক হয় scheduling algorithm দিয়ে। তুলনার জন্য কয়েকটি মাপ লাগে:

  • Burst time: একটি process-এর মোট কতক্ষণ CPU লাগবে।
  • Turnaround time: আসা থেকে শেষ হওয়া পর্যন্ত মোট সময় = শেষ হওয়ার সময় − আসার সময়।
  • Waiting time: ready queue-তে মোট অপেক্ষা = turnaround time − burst time.
  • Response time: আসা থেকে প্রথমবার CPU পাওয়া পর্যন্ত সময় — ব্যবহারকারীর কাছে “কম্পিউটার কত দ্রুত সাড়া দেয়” তার মাপ।

একটি উদাহরণ ধরুন, যা পুরো অংশে চলবে। চারটি process, সবাই সময় ০-তে একসাথে এসেছে, সারিতে P1, P2, P3, P4 ক্রমে দাঁড়িয়ে (সময় যেকোনো এককে, ধরুন মিলিসেকেন্ড):

Processআসার সময়Burst timePriority (ছোট সংখ্যা = বেশি জরুরি)
P1063
P2031
P3014
P4042

চারটি পরিচিত algorithm

  • FCFS (First Come, First Served): যে আগে এসেছে সে আগে — ব্যাংকের লাইনের মতো। সহজ, কিন্তু সামনে একটি লম্বা কাজ থাকলে পেছনের ছোট কাজগুলো অযথা বসে থাকে (একে বলে convoy effect).
  • SJF (Shortest Job First): যার burst সবচেয়ে ছোট সে আগে। সবাই একসাথে এলে গড় waiting time সবচেয়ে কম হয় — গাণিতিকভাবে প্রমাণিত। সমস্যা: ভবিষ্যতে কোন কাজ কতক্ষণ লাগবে, OS আগে থেকে জানে না; আগের আচরণ দেখে অনুমান করতে হয়। এর preemptive রূপকে বলে SRTF (Shortest Remaining Time First).
  • Round Robin (RR): সবাই পালা করে একটি করে quantum পায়; শেষ না হলে লাইনের পেছনে গিয়ে দাঁড়ায়। কেউ বেশিক্ষণ বঞ্চিত থাকে না — time-sharing কম্পিউটারের মূল নীতি।
  • Priority: সবচেয়ে জরুরি জন আগে। হাসপাতালের জরুরি বিভাগের মতো — সর্দি-কাশির রোগী আগে এলেও দুর্ঘটনার রোগী আগে চিকিৎসা পান।

FCFS-এ সারির ক্রমেই চলে: P1 ০–৬, P2 ৬–৯, P3 ৯–১০, P4 ১০–১৪. waiting time যথাক্রমে ০, ৬, ৯, ১০ — গড় ২৫ ÷ ৪ = ৬.২৫. SJF-এ ছোট থেকে বড়: P3 ০–১, P2 ১–৪, P4 ৪–৮, P1 ৮–১৪ — waiting ০, ১, ৪, ৮, গড় ১৩ ÷ ৪ = ৩.২৫. এবার Round Robin, quantum ২ — ধাপে ধাপে Gantt chart ভরাট করুন:

P1 = 6, P2 = 3, P3 = 1, P4 = 4 · সবাই সময় 0-তে
সময়
CPU-তে
Ready queue (সামনে → পেছনে)
বাকি burst
Gantt chart
শেষ হয়েছে (সময়)
  1. সময় ০–২: P1. সারির প্রথম P1 পেল ২ একক। তার বাকি ৬ থেকে ৪. শেষ হয়নি, তাই quantum ফুরোতেই সে চলে যায় লাইনের একেবারে পেছনে।
  2. সময় ২–৪: P2. P2 পেল ২ একক, বাকি থাকল ১. সে-ও লাইনের পেছনে — এখন সারি P3, P4, P1, P2.
  3. সময় ৪–৫: P3 শেষ! P3-এর দরকার মাত্র ১ একক। quantum ২ হলেও সে ১ একক চালিয়েই শেষ, আর বাকি সময় নষ্ট না করে CPU সঙ্গে সঙ্গে পরের জনের কাছে যায়। P3 শেষ হলো সময় ৫-এ।
  4. সময় ৫–৭: P4. P4 পেল ২, বাকি ২. পেছনে গেল — সারি P1, P2, P4.
  5. সময় ৭–৯: P1 দ্বিতীয়বার। বাকি ৪ থেকে ২. আবার পেছনে — সারি P2, P4, P1.
  6. সময় ৯–১০: P2 শেষ। বাকি ১ একক চালিয়ে P2 শেষ হলো সময় ১০-এ।
  7. সময় ১০–১২: P4 শেষ। বাকি ২ একক — ঠিক একটি quantum. P4 শেষ সময় ১২-তে।
  8. সময় ১২–১৪: P1 শেষ। সারিতে আর কেউ নেই; P1 শেষ ২ একক চালিয়ে সময় ১৪-তে শেষ। পুরো Gantt chart: P1, P2, P3, P4, P1, P2, P4, P1.
  9. হিসাব। সবাই ০-তে এসেছে, তাই turnaround = শেষের সময়: P1 ১৪, P2 ১০, P3 ৫, P4 ১২. waiting = turnaround − burst: P1 ১৪ − ৬ = ৮, P2 ১০ − ৩ = ৭, P3 ৫ − ১ = ৪, P4 ১২ − ৪ = ৮. মোট ২৭, গড় ৬.৭৫. যাচাইয়ের কৌশল: Gantt chart-এর মোট দৈর্ঘ্য (১৪) সব burst-এর যোগফলের (৬ + ৩ + ১ + ৪ = ১৪) সমান হতেই হবে।
FCFS      |        P1       |   P2   |P3|     P4    |
          0                 6        9 10          14
SJF       |P3|   P2   |     P4    |        P1       |
          0  1        4           8                14
RR q=2    |  P1 |  P2 |P3|  P4 |  P1 |P2|  P4 |  P1 |
          0     2     4  5     7     9 10    12    14
Priority  |   P2   |     P4    |        P1       |P3|
          0        3           7                13 14
Algorithmগড় waitingগড় turnaroundগড় response
FCFS6.259.756.25
SJF3.256.753.25
Round Robin (q = 2)6.7510.252.75
Priority (non-preemptive)5.759.255.75

অবাক হওয়ার মতো ফল: এই সেটে Round Robin-এর গড় waiting time সবচেয়ে বেশি! তাহলে Windows, Linux কেন RR-ঘরানার নীতি ব্যবহার করে? কারণ শেষ কলাম — response time. RR-এ প্রত্যেকে খুব দ্রুত প্রথম সুযোগ পায় (গড় ২.৭৫), তাই আপনি কোনো বোতাম চাপলে কম্পিউটার সাথে সাথে সাড়া দেয়। ডেস্কটপ আর ফোনে ব্যবহারকারীর কাছে এটাই সবচেয়ে জরুরি। কোনো একটি algorithm সব মাপে সেরা নয় — প্রতিটি একটি trade-off.

Starvation — অনন্ত অপেক্ষা

Priority scheduling-এ P3-এর দিকে তাকান: তার কাজ মাত্র ১ একক, তবু সে অপেক্ষা করেছে ১৩ একক, কারণ তার priority সবচেয়ে কম। এখন ভাবুন, জরুরি process নিয়মিত আসতেই থাকে — তাহলে P3 হয়তো কখনোই CPU পাবে না। একে বলে starvation. প্রচলিত সমাধান aging: কেউ যত বেশি অপেক্ষা করে, তার priority ধীরে ধীরে তত বাড়ানো হয় — বয়স্ক যাত্রীকে লাইনে এগিয়ে দেওয়ার মতো। SJF-এও একই বিপদ আছে: ছোট কাজ আসতে থাকলে বড় কাজ বঞ্চিত থাকে।

বাস্তবের scheduler: আসল OS এই নীতিগুলোর মিশ্রণ চালায়। Windows-এ ৩২টি priority স্তর, প্রতিটি স্তরে Round Robin; Linux বহু বছর ব্যবহার করেছে CFS (Completely Fair Scheduler), যা সবচেয়ে কম CPU পাওয়া জনকে আগে দেয় — সাম্প্রতিক সংস্করণে এসেছে এর উত্তরসূরি EEVDF.

নিজে চালিয়ে দেখুন — scheduling সিমুলেটর

নিচের কোড একই চারটি process-এ FCFS, SJF আর Round Robin চালিয়ে টেক্সট Gantt chart আর গড় সময় লিখে দেয়। লক্ষ করুন, তিনটি algorithm-এর জন্য একটিই ফাংশন: FCFS আর SJF আসলে “quantum অসীম” Round Robin — শুধু সারির ক্রম আলাদা।

const procs = [['P1', 6], ['P2', 3], ['P3', 1], ['P4', 4]]; // নাম, burst; সবাই সময় 0-তে
function run(title, order, q) {            // order: সারির ক্রম, q: quantum
  const queue = order.map(([n, b]) => ({ n, b, left: b }));
  let t = 0, bar = '', wait = 0, tat = 0;
  while (queue.length) {
    const p = queue.shift();                // সারির সামনের জন CPU পায়
    const slice = Math.min(q, p.left);      // এবার কতক্ষণ চলবে
    bar += `|${p.n} ${t}-${t + slice}`;
    t += slice;
    p.left -= slice;
    if (p.left > 0) queue.push(p);          // শেষ হয়নি: লাইনের পেছনে
    else { tat += t; wait += t - p.b; }     // শেষ: turnaround = t, waiting = t - burst
  }
  const k = order.length;
  console.log(`${title}\n  ${bar}|\n  avg waiting = ${wait / k}, avg turnaround = ${tat / k}`);
}
run('FCFS', procs, Infinity);
run('SJF', [...procs].sort((a, b) => a[1] - b[1]), Infinity);
run('Round Robin (q=2)', procs, 2);

Run চাপলে তিনটি ব্লক আসে। FCFS: |P1 0-6|P2 6-9|P3 9-10|P4 10-14|, avg waiting = 6.25, avg turnaround = 9.75. SJF: |P3 0-1|P2 1-4|P4 4-8|P1 8-14|, avg waiting = 3.25, avg turnaround = 6.75. Round Robin: |P1 0-2|P2 2-4|P3 4-5|P4 5-7|P1 7-9|P2 9-10|P4 10-12|P1 12-14|, avg waiting = 6.75, avg turnaround = 10.25 — হাতে করা হিসাবের সাথে হুবহু মিলে গেল। কোডের মূল কৌশল একটি সারি (queue): shift দিয়ে সামনের জনকে নেওয়া, শেষ না হলে push দিয়ে পেছনে পাঠানো। Math.min(q, p.left) নিশ্চিত করে যে P3-এর মতো ছোট কাজ পুরো quantum নষ্ট না করে। procs-এ সংখ্যা বদলে, বা শেষ লাইনে quantum ১ বা ৪ করে দেখুন — quantum বাড়ালে RR ধীরে ধীরে FCFS-এর মতো আচরণ করে।

৫ · Process-দের সহযোগিতা আর বিপদ — IPC, synchronization আর deadlock

Process-রা একা একা কাজ করে না। আপনি ব্রাউজার থেকে কিছু কপি করে Word-এ পেস্ট করেন; একটি প্রোগ্রামের আউটপুট আরেকটির ইনপুট হয়। process-দের মধ্যে ডেটা আদান-প্রদানকে বলে IPC (Inter-Process Communication). প্রধান উপায়গুলো: shared memory (kernel দুজনকে একটি সাধারণ মেমরি-এলাকা দেয়), message passing (kernel-এর মাধ্যমে চিঠি পাঠানোর মতো), pipe (একজনের আউটপুট সরাসরি আরেকজনের ইনপুটে — পর্ব ২৯-এ কমান্ড লাইনে | চিহ্নে দেখবেন), আর নেটওয়ার্ক socket.

Race condition আর lock

একই ডেটা দুজন একসাথে বদলাতে গেলে বিপদ। ধরুন একটি bKash-ধরনের অ্যাকাউন্টে ১,০০০ টাকা আছে, আর দুটি thread প্রায় একই মুহূর্তে ৫০০ করে জমা দিচ্ছে। প্রত্যেকে আগে ব্যালান্স পড়ে (১,০০০), তারপর ৫০০ যোগ করে লেখে (১,৫০০)। দুজনেই ১,০০০ পড়ে থাকলে শেষ ফল ২,০০০ না হয়ে ১,৫০০ — ৫০০ টাকা হাওয়া! ফল নির্ভর করছে কে কখন চলল তার ওপর — একে বলে race condition. সমাধান: যে অংশে সাধারণ ডেটা বদলায় (critical section), সেখানে একসাথে একজনই ঢুকবে। এজন্য ব্যবহার হয় lock বা mutex — বাথরুমের ছিটকিনির মতো, একজন ভেতরে থাকলে বাকিরা বাইরে অপেক্ষা করে। আরও সাধারণ একটি হাতিয়ার semaphore — একটি গণক, যা বলে দেয় একসাথে সর্বোচ্চ কতজন ঢুকতে পারবে (পার্কিং লটের খালি জায়গার বোর্ডের মতো)।

Deadlock — কেউ এগোতে পারে না

lock সমস্যা মেটায়, কিন্তু নতুন একটি বিপদ আনে। পুরান ঢাকার একটি সরু গলিতে দুই দিক থেকে দুটি রিকশা ঢুকে মুখোমুখি দাঁড়িয়েছে। কেউ পেছাতে রাজি নয়, তাই কেউই এগোতে পারছে না — চিরকালের জন্য আটকে। একই ঘটনা process-দের মধ্যে হলে তাকে বলে deadlock. নিচে দুটি lock দিয়ে কীভাবে ঘটে আর কীভাবে এড়ানো যায় দেখুন:

P1 আর P2 দুজনেরই দরকার প্রিন্টার আর স্ক্যানার
P1-এর হাতে
P1 চাইছে
P2-এর হাতে
P2 চাইছে
অবস্থা
  1. P1 প্রিন্টার নিল। P1-এর একটি স্ক্যান করা কাগজ ছাপাতে হবে — দুটো যন্ত্রই লাগবে। সে আগে প্রিন্টারের lock নিল।
  2. P2 স্ক্যানার নিল। প্রায় একই সময়ে P2-এরও দুটোই লাগবে, কিন্তু সে উল্টো ক্রমে আগে স্ক্যানারের lock নিল। এখনো কেউ আটকায়নি।
  3. দুজনেই অপরেরটা চাইল। P1 স্ক্যানার চায় — সেটি P2-এর হাতে, তাই অপেক্ষা। P2 প্রিন্টার চায় — সেটি P1-এর হাতে, তাই অপেক্ষা। কেউ নিজেরটা ছাড়বে না, কারণ দুজনেই কাজ শেষের অপেক্ষায়। দুজনই চিরকাল Waiting — deadlock.
  4. সমাধান: lock-এর নির্দিষ্ট ক্রম। নিয়ম করা হলো, সবাই আগে প্রিন্টার, পরে স্ক্যানার নেবে। এখন P2 প্রথমেই প্রিন্টার চেয়ে অপেক্ষা করে — হাতে কিছু না রেখে। P1 দুটো নিয়ে কাজ সেরে ছেড়ে দেয়, তারপর P2 পায়। চক্র তৈরিই হতে পারে না।

১৯৭১ সালে E. G. Coffman ও তাঁর সহকর্মীরা দেখান, deadlock হতে হলে চারটি শর্ত একসাথে সত্য হতে হয় (Coffman conditions):

  1. Mutual exclusion: সম্পদটি একসাথে একজনই ব্যবহার করতে পারে।
  2. Hold and wait: একজন কিছু ধরে রেখে আরও কিছুর জন্য অপেক্ষা করে।
  3. No preemption: কারও হাত থেকে জোর করে সম্পদ কেড়ে নেওয়া যায় না।
  4. Circular wait: অপেক্ষার একটি চক্র — P1 অপেক্ষা করে P2-এর, P2 অপেক্ষা করে P1-এর।

চারটির যেকোনো একটি ভাঙলেই deadlock অসম্ভব। ওপরের stepper-এ lock-এর নির্দিষ্ট ক্রম “circular wait” ভেঙেছে।

৬ · মেমরি আর file system — block থেকে ফাইল

মেমরি ব্যবস্থাপনা — এক নজরে

প্রত্যেক process-কে OS নিজস্ব একটি “কাল্পনিক” ঠিকানা-জগৎ দেয় — virtual memory. process ভাবে ঠিকানা ০ থেকে শুরু করে বিশাল একটি মেমরি তার একার; আসলে OS আর CPU-র একটি অংশ (MMU) মিলে প্রতিটি ঠিকানা RAM-এর আসল জায়গায় অনুবাদ করে, page নামের ছোট টুকরো ধরে। এতে দুটি বড় লাভ: এক process আরেক process-এর মেমরি দেখতেই পায় না (সুরক্ষা), আর RAM ভরে গেলে কম ব্যবহৃত page স্টোরেজে সরিয়ে রাখা যায় (paging/swapping). page, page table আর TLB-র পুরো গল্প পর্ব ২৫-এ পাবেন; এখানে শুধু মনে রাখুন — মেমরিও CPU-র মতোই OS-এর ভাগ করে দেওয়া সম্পদ।

File system — ডিস্কের কাঁচা block থেকে ফাইল-ফোল্ডার

SSD বা HDD নিজে “ফাইল” চেনে না। সে চেনে শুধু নম্বর দেওয়া সমান মাপের টুকরো — block (সাধারণত ৪ KB). “block ৮১২৩৪ পড়ো”, “block ৫০২-এ লেখো” — ব্যস। এই কাঁচা block-এর সারিকে নাম, ফোল্ডার, তারিখ আর অনুমতিওয়ালা ফাইলের জগতে রূপ দেয় file system. একটি বিশাল গুদামের কথা ভাবুন, যেখানে হাজার হাজার নম্বর দেওয়া তাক আছে। file system হলো গুদামের খাতা — কোন মালিকের কোন মাল কোন কোন তাকে আছে।

file system তিন রকম তথ্য রাখে:

  • ডেটা block: ফাইলের আসল বিষয়বস্তু — লেখা, ছবির pixel, গানের নমুনা।
  • Metadata: ফাইল সম্পর্কে তথ্য — আকার, মালিক, অনুমতি, তৈরি ও বদলের সময়, আর কোন কোন block-এ ডেটা আছে। Linux-এর ext4-এ প্রতিটি ফাইলের metadata থাকে একটি inode-এ; NTFS-এ একই কাজ করে MFT (Master File Table)-এর একটি এন্ট্রি।
  • Directory: একটি ফোল্ডার আসলে একটি বিশেষ ফাইল, যার ভেতরে শুধু একটি তালিকা: “এই নাম → এই inode নম্বর”। Unix-ধরনের সিস্টেমে ফাইলের নাম inode-এ নয়, এই তালিকাতেই থাকে। তাই একই ড্রাইভের ভেতরে ফাইল সরানো (move) প্রায় তাৎক্ষণিক — শুধু তালিকার একটি লাইন বদলায়, ডেটা নড়ে না।
File systemকোথায় দেখবেনবিশেষ কথা
FAT32পুরোনো পেনড্রাইভ, মেমরি কার্ড, ক্যামেরাপ্রায় সব যন্ত্রে চলে; কিন্তু একটি ফাইল সর্বোচ্চ ৪ GB (আসলে ৪ GB থেকে ১ byte কম); কোনো permission বা journaling নেই
exFATবড় পেনড্রাইভ, SDXC কার্ড, এক্সটার্নাল ড্রাইভMicrosoft-এর তৈরি (২০০৬); ৪ GB-এর সীমা নেই; Windows আর macOS দুটোতেই পড়া-লেখা যায়
NTFSWindows-এর C: ড্রাইভWindows NT-এর সাথে (১৯৯৩); journaling, বিস্তারিত permission (ACL), এনক্রিপশন, compression
ext4বেশিরভাগ Linux, অনেক সার্ভার আর Android ফোনjournaling, inode, rwx permission
APFSMac, iPhone, iPadApple-এর (২০১৭); SSD-র জন্য নকশা; journaling-এর বদলে copy-on-write, snapshot আর এনক্রিপশন

বাস্তব সমস্যা: ৬ GB-র একটি সিনেমা পেনড্রাইভে কপি করতে গেলে Windows বলে “The file is too large for the destination file system” — অথচ পেনড্রাইভে ৩০ GB খালি! কারণ পেনড্রাইভটি FAT32. সমাধান: দরকারি ফাইল সরিয়ে নিয়ে ড্রাইভে ডান-ক্লিক → Format → File system: exFAT (মনে রাখুন, Format করলে ভেতরের সব মুছে যায়)। শুধু Windows-এ ব্যবহার করলে NTFS-ও চলে, তবে অনেক টিভি, গাড়ির স্টেরিও বা পুরোনো যন্ত্র NTFS পড়তে পারে না।

Fragmentation আর journaling

ফাইল বারবার তৈরি, বড় আর মোছা হতে হতে একটি ফাইলের block ডিস্কের নানা জায়গায় ছড়িয়ে যায় — একে বলে fragmentation. HDD-তে এতে পড়ার মাথাকে বারবার লাফাতে হয়, তাই কম্পিউটার ধীর হয়; এর প্রতিকার defragmentation (পর্ব ০৮-এ দেখেছেন)। SSD-তে যেকোনো block পড়তে সমান সময় লাগে, তাই সেখানে এটি প্রায় সমস্যাই নয়।

এবার ভাবুন, ফাইল সেভ হওয়ার মাঝপথে লোডশেডিং। ডেটা হয়তো অর্ধেক লেখা হয়েছে, আর metadata হয়তো বলছে ফাইলটি পুরো — file system-এর খাতা আর তাকের মাল মিলছে না। আধুনিক file system ব্যবহার করে journaling: বড় পরিবর্তনের আগে একটি আলাদা খাতায় (journal) লিখে রাখে “এই কাজটি করতে যাচ্ছি”, কাজ শেষে লেখে “করা হয়েছে”। মাঝপথে বিদ্যুৎ গেলে চালু হওয়ার পর journal দেখে অসমাপ্ত কাজ শেষ করে বা বাতিল করে — দোকানের খাতায় আগে লিখে তারপর মাল দেওয়ার মতো। FAT32 আর exFAT-এ সাধারণত journaling নেই, এজন্য পেনড্রাইভ খোলার আগে “Safely Remove” বা “Eject” করা জরুরি।

৭ · অনুমতি, driver আর OS-এর জানালা

Permission — কে কী করতে পারবে

একটি কম্পিউটারে অনেক ব্যবহারকারী থাকতে পারেন, আর OS-এর নিজের ফাইলও আছে। তাই প্রতিটি ফাইলের সাথে metadata-য় লেখা থাকে কে কী করতে পারবে — file permission. Unix আর Linux-এ তিন রকম অনুমতি: r (read — পড়া), w (write — বদলানো), x (execute — প্রোগ্রাম হিসেবে চালানো; ফোল্ডারের ক্ষেত্রে ভেতরে ঢোকা)। আর তিন দল মানুষ: owner (মালিক), group (একই দলের সদস্য), others (বাকি সবাই)।

-rwxr-x---  1 rahim  staff  report.sh
 ───┬──┬──┬
    │  │  └─ others: ---  কিছুই না            → 0
    │  └──── group : r-x  পড়া ও চালানো         → 4+0+1 = 5
    └─────── owner : rwx  পড়া, লেখা, চালানো   → 4+2+1 = 7      সংখ্যায়: 750

r = ৪, w = ২, x = ১ ধরে যোগ করলে প্রতিটি দলের অনুমতি একটি অঙ্কে লেখা যায়, তাই chmod 750 report.sh কমান্ড ঠিক ওপরের অনুমতি বসায় (কমান্ড লাইনের সাথে পরিচয় হবে পর্ব ২৯-এ)। Windows-এ ধারণাটি আরও বিস্তারিত — ACL (Access Control List): প্রতিটি ফাইলের সাথে একটি তালিকা, যেখানে আলাদা আলাদা ব্যবহারকারী বা দলের জন্য Read, Write, Modify, Full control ইত্যাদি দেওয়া বা নিষেধ করা থাকে। ফাইলে ডান-ক্লিক → Properties → Security ট্যাবে এটি দেখা যায়। সব অনুমতির ঊর্ধ্বে থাকেন administrator (Linux-এ root) — এজন্য প্রতিদিনের কাজ সাধারণ অ্যাকাউন্টে করাই নিরাপদ।

Device driver — kernel-এর দোভাষী

পর্ব ০৫-এ দেখেছেন, driver হলো হার্ডওয়্যার আর OS-এর মাঝের দোভাষী। ভেতর থেকে দেখলে, kernel সব প্রিন্টারের সাথে একই ভাষায় কথা বলে — “এই পাতা ছাপাও”। প্রতিটি কোম্পানির প্রিন্টারের নিজস্ব কমান্ড অনুবাদ করে তার driver. বেশিরভাগ driver kernel mode-এ চলে, তাই একটি খারাপ driver পুরো সিস্টেম ফেলে দিতে পারে — ২০২৪ সালের জুলাইয়ে একটি নিরাপত্তা-সফটওয়্যারের ত্রুটিপূর্ণ আপডেট kernel-স্তরে চলায় বিশ্বজুড়ে লাখ লাখ Windows কম্পিউটার নীল পর্দায় আটকে গিয়েছিল। চালু হওয়ার সময় driver কীভাবে লোড হয়, তা পরের পর্বে (পর্ব ২৭) দেখবেন।

Task Manager আর top — OS-এর ভেতরে উঁকি

এই পর্বের প্রায় সবকিছু আপনি নিজের চোখে দেখতে পারেন। Windows-এ Ctrl+Shift+Esc চেপে Task Manager খুলুন:

  • Processes ট্যাব: প্রতিটি process আর তার CPU, মেমরি, ডিস্ক, নেটওয়ার্ক ব্যবহার।
  • Performance ট্যাব: CPU অংশে নিচে লেখা থাকে মোট Processes, Threads আর Handles — সাধারণত কয়েকশো process আর কয়েক হাজার thread, অথচ core মাত্র কয়েকটি! scheduling-এর কাজ কত বড়, এই সংখ্যাতেই বোঝা যায়।
  • Details ট্যাব: প্রতিটি process-এর PID — PCB-র সেই পরিচয় নম্বর। ডান-ক্লিক → Set priority দিয়ে priority-ও বদলানো যায় (সাবধানে)।

Linux বা Mac-এর টার্মিনালে top (বা আরও রঙিন htop) লিখলে একই তথ্য — প্রতিটি process-এর PID, অবস্থা (R = running, S = sleeping/waiting), CPU% আর মেমরি। macOS-এ গ্রাফিক্যাল রূপটির নাম Activity Monitor.

৮ · OS-এর প্রকারভেদ, virtualization আর container

সব কম্পিউটারের কাজ এক নয়, তাই OS-ও এক রকম নয়। ইতিহাস আর ব্যবহার মিলিয়ে প্রধান ধরনগুলো:

ধরনমূল ভাবনাউদাহরণ
Batchকাজগুলো একসাথে জমা দিয়ে একটির পর একটি চালানো, ব্যবহারকারীর সাথে কথোপকথন নেই১৯৫০–৬০-এর দশকের mainframe; আজকের ব্যাংকের রাতের হিসাব-প্রক্রিয়া একই ধাঁচের
Time-sharingঅনেক ব্যবহারকারী একসাথে, প্রত্যেকে দ্রুত পালা পান — Round Robin-এর জন্মস্থানCTSS, Multics, Unix; আজকের প্রায় সব ডেস্কটপ OS
Real-time (RTOS)কাজটি নির্দিষ্ট সময়ের মধ্যে শেষ হবেই — দেরি মানে ব্যর্থতাগাড়ির airbag ও ব্রেক নিয়ন্ত্রণ, চিকিৎসা-যন্ত্র, শিল্প-রোবট; VxWorks, FreeRTOS, QNX
Distributedঅনেক কম্পিউটার মিলে একটি ব্যবস্থা হিসেবে কাজ করেGoogle-এর মতো বড় ডেটা সেন্টার আর ক্লাউড (ক্লাউড কম্পিউটিং পর্ব ৩৫-এ)
Mobileটাচ, ব্যাটারি বাঁচানো, প্রতিটি অ্যাপ আলাদা খাঁচায় (sandbox)Android (Linux kernel-এর ওপর), iOS
Embeddedএকটিমাত্র কাজের যন্ত্রে লুকিয়ে থাকা ছোট OS বা firmwareরাউটার, স্মার্ট টিভি, ওয়াশিং মেশিন — embedded system

Real-time মানে “খুব দ্রুত” নয় — মানে “নিশ্চিত সময়ের মধ্যে”। গাড়ির airbag-এর সেন্সর ধাক্কা টের পেলে কয়েক দশ মিলিসেকেন্ডের মধ্যে ব্যাগ ফোলাতে হয়; গড়ে দ্রুত হলে চলবে না, প্রতিবারই সময়মতো হতে হবে। তাই এমন যন্ত্রের সফটওয়্যার কঠোর real-time নিয়মে নকশা করা হয়, আর priority scheduling সেখানে কেন্দ্রীয় হাতিয়ার।

Virtualization — এক কম্পিউটারে কয়েকটি কম্পিউটার

OS যেমন একটি CPU-কে অনেক process-এর মধ্যে ভাগ করে, তেমনি আরেক স্তর নিচে একটি পুরো কম্পিউটারকে কয়েকটি “কাল্পনিক কম্পিউটারে” ভাগ করা যায়। প্রতিটিকে বলে virtual machine (VM), আর ভাগ করে দেওয়া সফটওয়্যারটির নাম hypervisor. Windows ল্যাপটপে VirtualBox বা Hyper-V দিয়ে একটি Linux VM চালালে সেই Linux ভাবে তার নিজের CPU, RAM আর ডিস্ক আছে — আসলে সবই hypervisor-এর দেওয়া।

Container — হালকা খাঁচা

প্রতিটি VM-এ একটি পুরো OS চলে — কয়েক GB মেমরি আর চালু হতে অনেক সময়। অনেক সময় শুধু একটি অ্যাপকে আলাদা রাখাই যথেষ্ট। Container (সবচেয়ে পরিচিত টুল Docker, ২০১৩) ঠিক তা-ই করে: সব container একই host OS-এর kernel ভাগ করে, কিন্তু kernel প্রত্যেককে আলাদা ফাইল, আলাদা process-তালিকা আর আলাদা নেটওয়ার্ক দেখায়। ফলে container চালু হয় সেকেন্ডে, আর একটি সার্ভারে শত শত চলতে পারে।

পরীক্ষা ও ইন্টারভিউতে — এ ধরনের প্রশ্ন প্রায়ই আসে:

  • Program আর process-এর পার্থক্য কী? program ডিস্কে রাখা নিষ্ক্রিয় নির্দেশের ফাইল; process হলো সেই program-এর চলমান রূপ — নিজস্ব মেমরি, অবস্থা আর PCB-সহ।
  • Process-এর অবস্থাগুলো কী কী? New, Ready, Running, Waiting (Blocked), Terminated; I/O শেষ হলে Waiting থেকে যায় Ready-তে, Running-এ নয়।
  • Round Robin-এ গড় waiting time বের করুন। Gantt chart আঁকুন, প্রতিটির শেষের সময় থেকে turnaround = শেষ − আসা, waiting = turnaround − burst; যেমন burst 6, 3, 1, 4 আর quantum 2 হলে গড় waiting 6.75.
  • Deadlock-এর চারটি প্রয়োজনীয় শর্ত? mutual exclusion, hold and wait, no preemption, circular wait — চারটি একসাথে থাকলে তবেই deadlock সম্ভব।
  • পেনড্রাইভে ৪ GB-এর বড় ফাইল যায় না কেন? ড্রাইভটি FAT32; এর একটি ফাইলের সর্বোচ্চ আকার ৪ GB. exFAT বা NTFS-এ format করলে যায়।

আরও গভীরে: এই পর্বে প্রতিটি বিষয় এক বা দুই অনুচ্ছেদে দেখেছেন। arrival time-সহ preemptive SJF, multilevel feedback queue, Banker’s algorithm দিয়ে deadlock এড়ানো, semaphore দিয়ে producer-consumer সমস্যা, আর file allocation-এর পদ্ধতিগুলো বিস্তারিত পাবেন আমাদের Operating Systems কোর্সে। শুরু করতে পারেন priority scheduling আর Round Robin বা deadlock-এর চার শর্ত পর্ব দিয়ে।

৯ · AI-এর যুগে — ব্যাখ্যা নিন, হিসাব নিজে মেলান

OS-এর ধারণা বোঝাতে AI চ্যাটবট সত্যিই ভালো: “context switch সহজ উপমায় বোঝাও”, “thread আর process-এর পার্থক্য টেবিলে দাও” — এমন প্রশ্নে সাধারণত পরিষ্কার উত্তর আসে। কিন্তু scheduling-এর অঙ্কে AI প্রায়ই ভুল করে, আর ভুলটা দেখায় খুব আত্মবিশ্বাসী। কারণ AI ধাপে ধাপে সারি চালিয়ে দেখে না, পরের শব্দ অনুমান করে লেখে; লম্বা Gantt chart-এ একটি ভুল পালা পরের সব সংখ্যা বদলে দেয়।

AI-এর সাধারণ ভুলকীভাবে ধরবেন
Round Robin-এ quantum শেষে process-কে লাইনের পেছনে না পাঠিয়ে আবার সামনে রাখাপ্রতিটি পালার পর ready queue লিখে রাখুন, যেমন ওপরের stepper-এ
ছোট কাজ quantum-এর আগে শেষ হলেও পুরো quantum ধরে হিসাবGantt chart-এর মোট দৈর্ঘ্য = সব burst-এর যোগফল (CPU কখনো অলস না থাকলে)
waiting আর turnaround গুলিয়ে ফেলা, বা arrival time বিয়োগ করতে ভুলে যাওয়াturnaround = শেষ − আসা; waiting = turnaround − burst; কোনো waiting ঋণাত্মক হতে পারে না
একই সময়ে নতুন process আসা আর পুরোনোটির quantum শেষ হলে কে আগে — নিয়ম না বলেই একটা ধরে নেওয়াপ্রশ্নের নিয়ম দেখুন; সাধারণ প্রথা হলো নতুন আসা process আগে সারিতে ঢোকে

নিচের prompt-টি কপি করে নিজের প্রশ্নের সংখ্যা বসান। AI-কে শুধু উত্তর নয়, প্রতিটি ধাপ দেখাতে বলা হয়েছে, যাতে আপনি মিলিয়ে নিতে পারেন:

আমি অপারেটিং সিস্টেমের CPU scheduling অনুশীলন করছি। process-গুলো: [এখানে লেখো, যেমন P1: arrival 0, burst 6; P2: arrival 0, burst 3; ...]. algorithm: Round Robin, quantum = 2. ১. প্রতিটি quantum-এর পরে ready queue-তে কে কোন ক্রমে আছে, একটি টেবিলে দেখাও (সময়, CPU-তে কে, বাকি burst, queue). ২. একই সময়ে নতুন process আসা আর quantum শেষ হলে তুমি কোন নিয়ম ধরছ, শুরুতেই স্পষ্ট বলো। ৩. Gantt chart দাও, তারপর প্রতিটি process-এর completion, turnaround = completion − arrival, waiting = turnaround − burst আলাদা কলামে লেখো। ৪. শেষে যাচাই করো: Gantt chart-এর মোট দৈর্ঘ্য সব burst-এর যোগফলের সমান কি না। ৫. কোথাও অনিশ্চিত হলে বলো; অনুমানকে নিশ্চিত তথ্য হিসেবে লিখবে না।

AI-এর উত্তর হাতে পেলে — যাচাইয়ের চেকলিস্ট

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

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন। আজকের Windows, Android বা Linux-এর প্রতিটি নকশা-সিদ্ধান্তের পেছনে আছে কয়েক দশকের পরীক্ষা, ভুল আর বিতর্ক।

প্র ০১একসময় কম্পিউটারের সামনে বসে কাজ করার সুযোগই ছিল না — কার্ড জমা দিয়ে পরের দিন ফল নিতে হতো। batch থেকে time-sharing হয়ে Unix পর্যন্ত যাত্রাটা কেমন ছিল?

১৯৫০-এর দশকে কম্পিউটার ছিল বিশাল আর ভয়ানক দামি। প্রোগ্রামাররা punched card-এ প্রোগ্রাম লিখে অপারেটরের কাছে জমা দিতেন; অপারেটর অনেকের কাজ একসাথে (batch) সাজিয়ে একটির পর একটি চালাতেন। প্রথম দিকের “অপারেটিং সিস্টেম” আসলে ছিল এই batch চালানোর স্বয়ংক্রিয় ব্যবস্থাপক — যাতে দুই কাজের মাঝে দামি মেশিন অলস না থাকে। পরে multiprogramming এল: একটি কাজ টেপ বা ডিস্কের অপেক্ষায় থাকলে আরেকটি CPU পায় — এই পর্বের Waiting অবস্থার ধারণা।

কিন্তু মানুষ তখনো যন্ত্রের সাথে “কথা” বলতে পারত না। MIT-তে Fernando Corbató-র দল ১৯৬১ সালে প্রথম দেখায় CTSS (Compatible Time-Sharing System): কয়েকজন ব্যবহারকারী আলাদা টার্মিনালে বসে একই কম্পিউটার ব্যবহার করছেন, আর OS দ্রুত পালা বদলে প্রত্যেককে মনে করাচ্ছে যন্ত্রটি তাঁর একার। এখান থেকেই time slice আর Round Robin-ঘরানার scheduling-এর জন্ম। Corbató পরে Turing Award পান।

এরপর আরও উচ্চাভিলাষী প্রকল্প Multics (১৯৬০-এর দশকের মাঝামাঝি শুরু; MIT, General Electric আর Bell Labs মিলে)। Multics এনেছিল ফোল্ডারের ভেতরে ফোল্ডার — hierarchical file system, protection ring (এই পর্বের user/kernel mode-এর পূর্বসূরি), আর নিরাপত্তাকে নকশার কেন্দ্রে রাখার দর্শন। কিন্তু প্রকল্পটি জটিল আর ধীরগতির হয়ে পড়ে; ১৯৬৯ সালে Bell Labs সরে আসে।

Bell Labs-এর দুই গবেষক Ken Thompson আর Dennis Ritchie Multics-এর ভালো ধারণাগুলো মাথায় রেখে একটি পুরোনো PDP-7 কম্পিউটারে অনেক ছোট ও সরল একটি সিস্টেম লিখতে শুরু করেন ১৯৬৯ সালে — নাম দাঁড়ায় Unix. ১৯৭১ সালে এর প্রথম সংস্করণের manual প্রকাশ পায়, আর ১৯৭৩ সালে Unix প্রায় পুরোটাই নতুন ভাষা C-তে আবার লেখা হয় — ফলে অন্য কম্পিউটারেও সহজে নেওয়া যেত। ১৯৮৩ সালে দুজনে Turing Award পান।

মূল উপলব্ধি: OS-এর ইতিহাস আসলে “দামি জিনিস কীভাবে সবচেয়ে ভালোভাবে ভাগ করা যায়” — এই প্রশ্নের ক্রমাগত উত্তর। প্রথমে যন্ত্রের সময় দামি ছিল, তাই batch; পরে মানুষের সময় দামি হলো, তাই time-sharing. আজকের ফোনের প্রতিটি অ্যাপ-বদল সেই একই চিন্তার উত্তরাধিকার।

প্র ০২Linux, macOS, Android, iPhone — আজকের এত OS কি একই পরিবারের? “Unix দর্শন” জিনিসটা কী?

Unix-এর নকশাকারেরা কয়েকটি সরল নীতিতে বিশ্বাস করতেন, যা পরে “Unix philosophy” নামে পরিচিত হয়। Bell Labs-এর Doug McIlroy এর সারকথা বলেছিলেন মোটামুটি এভাবে: প্রতিটি প্রোগ্রাম একটি কাজ করবে এবং ভালোভাবে করবে; প্রোগ্রামগুলো একসাথে কাজ করবে; আর সাধারণ লেখা (text) হবে সবার সাধারণ ভাষা। এর বাস্তব রূপ pipe — ১৯৭৩ সালে Unix-এ যোগ হওয়া কৌশল, যেখানে একটি প্রোগ্রামের আউটপুট সরাসরি আরেকটির ইনপুট হয় (এই পর্বের IPC). আরেকটি নীতি: “সবকিছুই ফাইল” — ডিস্ক, কিবোর্ড, এমনকি প্রিন্টারও একই open, read, write system call দিয়ে ব্যবহার করা যায়।

১৯৯১ সালে ফিনল্যান্ডের ছাত্র Linus Torvalds শখের প্রকল্প হিসেবে একটি Unix-ধরনের kernel লেখা শুরু করেন এবং ইন্টারনেটে প্রকাশ করেন — Linux. Richard Stallman-এর GNU প্রকল্পের (১৯৮৩ থেকে) compiler আর টুলের সাথে মিলে এটি একটি পূর্ণ, মুক্ত OS হয়ে ওঠে। আজ বিশ্বের বেশিরভাগ ওয়েব সার্ভার, প্রায় সব supercomputer আর ক্লাউড Linux-এ চলে। Android (২০০৮) Linux kernel-এর ওপর তৈরি — তাই আপনার পকেটের ফোনটিও Linux পরিবারের সদস্য। অন্যদিকে Apple-এর macOS এসেছে Steve Jobs-এর NeXT কোম্পানির NeXTSTEP থেকে, যার ভিত্তি ছিল Mach kernel আর BSD Unix; iOS তার ভাইবোন। macOS আনুষ্ঠানিক UNIX সার্টিফিকেশনও পেয়েছে।

মূল উপলব্ধি: ৫০ বছরেরও বেশি পুরোনো কিছু সরল ধারণা — ছোট টুল, pipe, “সবকিছুই ফাইল”, process আর permission-এর মডেল — আজও কোটি কোটি যন্ত্রে বেঁচে আছে। ভালো abstraction প্রযুক্তির প্রজন্ম পেরিয়ে টিকে থাকে।

প্র ০৩পাঁচজন দার্শনিক, পাঁচটি কাঁটাচামচ, এক থালা খাবার — একটি ধাঁধা কীভাবে কম্পিউটার বিজ্ঞানের অন্যতম গুরুত্বপূর্ণ সমস্যা হয়ে উঠল?

নেদারল্যান্ডসের কম্পিউটার বিজ্ঞানী Edsger W. Dijkstra ১৯৬০-এর দশকে একটি multiprogramming সিস্টেম (THE) তৈরি করতে গিয়ে বুঝলেন, একসাথে চলা প্রোগ্রামগুলোর সমন্বয় করার কোনো পরিষ্কার, প্রমাণযোগ্য উপায় নেই। ১৯৬৫ সালের দিকে তিনি প্রস্তাব করেন semaphore: একটি পূর্ণসংখ্যা, যার ওপর শুধু দুটি অবিভাজ্য (atomic) ক্রিয়া চলে — P (মান কমাও; শূন্য হলে অপেক্ষা করো) আর V (মান বাড়াও, অপেক্ষমাণ কাউকে জাগাও)। P আর V নাম দুটি এসেছে ডাচ শব্দ থেকে। semaphore-এর মান ১ রাখলে এটি mutex, আর বেশি রাখলে “একসাথে সর্বোচ্চ n জন” নিয়ন্ত্রণ করে। প্রায় সব আধুনিক OS আর প্রোগ্রামিং ভাষায় এর কোনো না কোনো রূপ আছে।

একই সময়ে Dijkstra ছাত্রদের জন্য একটি ব্যায়াম দেন — কয়েকটি কম্পিউটার কয়েকটি টেপ-ড্রাইভ ভাগ করে নিচ্ছে। পরে Tony Hoare এটিকে গল্পের রূপ দেন, যা আজ dining philosophers problem নামে পরিচিত: গোল টেবিলে পাঁচজন দার্শনিক, প্রত্যেকের মাঝে একটি করে কাঁটাচামচ, মোট পাঁচটি। খেতে হলে বাঁ আর ডান দুটো চামচই লাগে। সবাই যদি একই মুহূর্তে আগে বাঁ চামচটি তুলে নেন, তাহলে সবার হাতে একটি করে চামচ, আর সবাই ডানেরটির জন্য চিরকাল অপেক্ষা করবেন — এই পর্বের circular wait-ওয়ালা deadlock. আবার “না পেলে রেখে দিয়ে পরে চেষ্টা করো” নিয়ম দিলে দুর্ভাগ্যক্রমে কেউ কেউ বারবার ব্যর্থ হয়ে না খেয়ে থাকতে পারেন — starvation.

সমাধান একাধিক। চামচগুলোতে নম্বর দিয়ে নিয়ম করা যায় — সবাই আগে ছোট নম্বরের চামচ তুলবেন (resource ordering, ওপরের stepper-এর কৌশল); তাহলে চক্র ভাঙে। একজন “ওয়েটার” রাখা যায়, যিনি একসাথে সর্বোচ্চ চারজনকে টেবিলে বসতে দেন — semaphore দিয়ে সহজেই লেখা যায়।

এই খেলনা-সমস্যায় একসাথে চলা সিস্টেমের সব মৌলিক বিপদ — deadlock, starvation আর ন্যায্যতা — এক টেবিলে ধরা পড়ে। Dijkstra ১৯৭২ সালে Turing Award পান।

মূল উপলব্ধি: একসাথে চলা প্রোগ্রামের ভুল সবচেয়ে কঠিন ভুল, কারণ তা প্রতিবার ঘটে না — নির্দিষ্ট সময়-বিন্যাসে হঠাৎ ঘটে। তাই এখানে “পরীক্ষা করে দেখেছি, চলে” যথেষ্ট নয়; নকশাতেই যুক্তি দিয়ে প্রমাণ করতে হয় যে বিপদ ঘটতে পারবে না।

প্র ০৪মঙ্গল গ্রহে নামার কয়েক দিন পর একটি রোবট-যান বারবার নিজে নিজে রিস্টার্ট হচ্ছিল। পৃথিবীতে বসে প্রকৌশলীরা কীভাবে একটি scheduling ভুল ধরলেন?

NASA-র Mars Pathfinder ১৯৯৭ সালের ৪ জুলাই মঙ্গলে নামে, সাথে ছোট্ট রোভার Sojourner. যানটির কম্পিউটারে চলত VxWorks নামের একটি বাণিজ্যিক RTOS. কয়েক দিন পর থেকে কম্পিউটারটি মাঝে মাঝে পুরো সিস্টেম রিসেট করতে শুরু করে — প্রতিবার কিছু ডেটা হারায়, আর মিশনের কাজ পিছিয়ে যায়।

JPL-এর প্রকৌশলীরা পৃথিবীতে রাখা একটি হুবহু প্রতিরূপে সমস্যাটি আবার ঘটিয়ে কারণ খুঁজে পান: priority inversion. যানে তিন রকম কাজ ছিল। একটি কম-priority-র কাজ (আবহাওয়ার ডেটা সংগ্রহ) একটি সাধারণ ডেটা-চ্যানেলের mutex ধরে রেখেছিল। এদিকে উচ্চ-priority-র একটি কাজ (চ্যানেল ব্যবস্থাপনা) সেই mutex-এর জন্য অপেক্ষা করছিল। ঠিক তখন মাঝারি-priority-র একটি দীর্ঘ কাজ (যোগাযোগ) চলে আসে — যেহেতু তার priority কম-priority-র কাজটির চেয়ে বেশি, scheduler তাকেই CPU দেয়। ফলে কম-priority-র কাজটি mutex ছাড়ার সুযোগই পায় না, আর উচ্চ-priority-র কাজ আটকে থাকে মাঝারির পেছনে — priority উল্টে গেছে! একটি watchdog টাইমার দেখল জরুরি কাজটি সময়মতো চলেনি, আর “কিছু একটা ভয়ানক গোলমাল” ভেবে পুরো সিস্টেম রিসেট করে দিল।

সমাধান আগে থেকেই জানা ছিল: priority inheritance — কম-priority-র কেউ যদি এমন lock ধরে থাকে যার জন্য উচ্চ-priority-র কেউ অপেক্ষা করছে, তবে সাময়িকভাবে সে উচ্চ priority “ধার” পায়, দ্রুত কাজ সেরে lock ছেড়ে দেয়। VxWorks-এ এই সুবিধা ছিল, কিন্তু ওই mutex-এ চালু করা হয়নি। প্রকৌশলীরা পৃথিবী থেকে একটি ছোট সংশোধন পাঠিয়ে সেটি চালু করেন, আর রিসেট বন্ধ হয়।

পৃথিবীতেও গাড়ির ব্রেক, pacemaker, উড়োজাহাজ আর রেলের সিগন্যালে একই ঝুঁকি — সেখানে “দেরিতে ঠিক উত্তর” মানেও ভুল উত্তর, তাই কঠোর মানদণ্ড আর বহুস্তরের পরীক্ষা বাধ্যতামূলক।

মূল উপলব্ধি: scheduling, priority আর lock — প্রতিটি আলাদাভাবে সরল, কিন্তু একসাথে মিলে এমন আচরণ তৈরি করতে পারে যা কেউ পরিকল্পনা করেনি। জীবন-গুরুত্বপূর্ণ যন্ত্রে তাই শুধু কোড নয়, কোড দেখার আর দূর থেকে সারানোর ব্যবস্থাও নকশার অংশ।

প্র ০৫kernel কত বড় হওয়া উচিত — সব কিছু ভেতরে, না যতটা সম্ভব বাইরে? ১৯৯২ সালের একটি বিখ্যাত অনলাইন বিতর্ক কী শিখিয়েছিল?

kernel নকশার দুটি প্রধান ঘরানা। Monolithic kernel-এ file system, driver, নেটওয়ার্ক, scheduling — প্রায় সব OS-সেবা একটি বড় প্রোগ্রাম হিসেবে kernel mode-এ চলে। ভেতরের অংশগুলো সরাসরি একে অপরের ফাংশন ডাকে, তাই দ্রুত। কিন্তু যেকোনো অংশের একটি বাগ পুরো সিস্টেম ফেলে দিতে পারে। Microkernel-এ kernel-এ রাখা হয় শুধু ন্যূনতম জিনিস — process, মেমরির মানচিত্র আর IPC; file system বা driver চলে আলাদা user-mode process হিসেবে, আর তারা বার্তা পাঠিয়ে কথা বলে। একটি driver ক্র্যাশ করলে শুধু সেটিকে আবার চালু করলেই চলে — বেশি নিরাপদ, কিন্তু বার্তা আদান-প্রদানে কিছুটা ধীর।

আমস্টারডামের অধ্যাপক Andrew S. Tanenbaum শিক্ষার্থীদের পড়ানোর জন্য ১৯৮৭ সালে MINIX নামের একটি ছোট Unix-ধরনের microkernel OS লিখেছিলেন। Linus Torvalds MINIX ব্যবহার করেই Linux লেখা শুরু করেন — কিন্তু monolithic নকশায়। ১৯৯২ সালের জানুয়ারিতে Tanenbaum comp.os.minix নিউজগ্রুপে “LINUX is obsolete” শিরোনামে লেখেন: monolithic নকশা পুরোনো ধাঁচের, আর Linux একটি নির্দিষ্ট CPU-র (Intel 386) সাথে বেশি বাঁধা। Torvalds কড়া ভাষায় জবাব দেন: বাস্তবে Linux চলছে, দ্রুত, আর মানুষ ব্যবহার করছে; তত্ত্বের সৌন্দর্যের চেয়ে কাজের জিনিস জরুরি।

কে জিতল? উত্তরটি মিশ্র। Linux আজও মূলত monolithic, তবে loadable module দিয়ে driver আলাদা করে যোগ-বিয়োগ করা যায়, আর এটি বিশ্বের সবচেয়ে বেশি ব্যবহৃত kernel-গুলোর একটি। Windows NT আর macOS-এর XNU নিজেদের “hybrid” বলে — microkernel-এর ধারণা নিয়ে শুরু, কিন্তু গতির জন্য অনেক কিছু kernel-এর ভেতরে। অন্যদিকে নির্ভরযোগ্যতা যেখানে সবচেয়ে জরুরি, সেখানে microkernel সফল: QNX অনেক গাড়ি আর শিল্প-যন্ত্রে চলে, আর seL4 নামের একটি microkernel-এর সঠিকতা গাণিতিকভাবে প্রমাণ (formal verification) করা হয়েছে — kernel ছোট বলেই এটি সম্ভব হয়েছে।

মূল উপলব্ধি: নকশায় “সঠিক” উত্তর প্রায়ই নির্ভর করে কী বেশি দামি তার ওপর — গতি, নির্ভরযোগ্যতা, না তৈরি করার সহজতা। আর ইতিহাস দেখায়, যে নকশা আজ ব্যবহারযোগ্য আর যার চারপাশে একটি সক্রিয় সম্প্রদায় গড়ে ওঠে, সেটি প্রায়ই তাত্ত্বিকভাবে নিখুঁত নকশাকে ছাড়িয়ে যায়।

অনুশীলন

প্রথম দুটি খাতা-কলমের অঙ্ক — Gantt chart এঁকে করুন। তৃতীয়টিতে নিজের কম্পিউটারে দেখতে হবে, চতুর্থটিতে permission পড়তে হবে।

  1. FCFS বনাম SJF: তিনটি process সময় ০-তে একসাথে এসেছে, সারির ক্রম P1, P2, P3; burst যথাক্রমে ৮, ৪, ২. দুই algorithm-এ Gantt chart এঁকে গড় waiting time বের করুন। কোনটি ভালো, আর কেন?

    FCFS: P1 ০–৮, P2 ৮–১২, P3 ১২–১৪. waiting: ০, ৮, ১২ — গড় ২০ ÷ ৩ ≈ ৬.৬৭.

    SJF: P3 ০–২, P2 ২–৬, P1 ৬–১৪. waiting: P3 ০, P2 ২, P1 ৬ — গড় ৮ ÷ ৩ ≈ ২.৬৭. SJF অনেক ভালো, কারণ ছোট কাজগুলো আগে শেষ হয়ে সারি থেকে বেরিয়ে যায়; বড় কাজ আগে চললে তার পুরো সময়টা পেছনের সবার waiting-এ যোগ হয় (convoy effect). যাচাই: দুটি chart-ই মোট ১৪ একক = ৮ + ৪ + ২.

  2. Arrival time-সহ Round Robin: quantum ২. P1 আসে সময় ০-তে (burst ৪), P2 সময় ১-এ (burst ৩), P3 সময় ২-এ (burst ১). নিয়ম: একই মুহূর্তে নতুন process আসা আর quantum শেষ হলে নতুনটি আগে সারিতে ঢোকে। Gantt chart, প্রতিটির turnaround আর waiting, এবং গড় waiting বের করুন।

    সময় ০-তে শুধু P1, তাই P1 ০–২ (বাকি ২)। এর মধ্যে P2 (১) আর P3 (২) এসেছে; নিয়ম অনুযায়ী সারি: P2, P3, তারপর P1. P2 ২–৪ (বাকি ১) → সারি P3, P1, P2. P3 ৪–৫ (শেষ)। P1 ৫–৭ (শেষ)। P2 ৭–৮ (শেষ)। Gantt chart: P1, P2, P3, P1, P2.

    turnaround = শেষ − আসা: P1 ৭ − ০ = ৭, P2 ৮ − ১ = ৭, P3 ৫ − ২ = ৩. waiting = turnaround − burst: P1 ৩, P2 ৪, P3 ২ — গড় ৯ ÷ ৩ = ৩. লক্ষ করুন, নিয়ম উল্টো হলে (P1 আগে, P3 পরে) সারি বদলে যায় আর গড় হয় ১০ ÷ ৩ ≈ ৩.৩৩ — তাই এই নিয়মটি প্রশ্নে বা উত্তরে স্পষ্ট লেখা জরুরি।

  3. নিজের OS-এ উঁকি দিন: Task Manager খুলে (Ctrl+Shift+Esc) Performance → CPU-তে মোট process আর thread-এর সংখ্যা লিখুন। তারপর ব্রাউজারে আরও ৫টি ট্যাব খুলে আবার দেখুন। Processes ট্যাবে ব্রাউজারের পাশের তীর চাপলে কী দেখেন? সংখ্যাগুলো এই পর্বের কোন ধারণার সাথে মেলে?

    সাধারণত দেখবেন কয়েকশো process আর কয়েক হাজার thread — অথচ core হয়তো ৪ বা ৮টি। এটাই multitasking আর scheduling-এর প্রমাণ: প্রতিটি core-এ পালা করে অসংখ্য thread চলছে। ট্যাব খোলার পর process-এর সংখ্যা কয়েকটি বাড়বে, কারণ Chrome বা Edge আলাদা সাইটকে প্রায়ই আলাদা process-এ রাখে; thread বাড়বে আরও বেশি। ব্রাউজারের তীর চাপলে ভেতরের অনেকগুলো process দেখা যায় — ট্যাব, extension, GPU process ইত্যাদি।

  4. Permission পড়ুন: একটি Linux ফাইলের অনুমতি দেখাচ্ছে -rw-r--r--. (ক) মালিক, group আর বাকিরা কে কী করতে পারেন? (খ) সংখ্যায় এটি কত? (গ) chmod 754 দিলে অনুমতি কী হবে?

    (ক) মালিক: rw- — পড়া ও লেখা; group: r-- — শুধু পড়া; others: r-- — শুধু পড়া। কেউ চালাতে (execute) পারবেন না — সাধারণ লেখার ফাইলের জন্য এটাই স্বাভাবিক।

    (খ) rw- = ৪ + ২ = ৬, r-- = ৪, r-- = ৪ → 644. (গ) 754 মানে: ৭ = rwx (মালিক সব পারেন), ৫ = r-x (group পড়তে ও চালাতে পারেন), ৪ = r-- (বাকিরা শুধু পড়তে পারেন) → -rwxr-xr--.

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমএকটি অ্যাপ ফাইল খুললে অনুরোধ কোন পথে যায় — প্রথম থেকে শেষ সাজান (▲▼ চেপে সরান)

  1. 📝 অ্যাপ (user mode) ফাইল চায়
  2. 🚪 system call — CPU kernel mode-এ যায়
  3. 🧭 kernel অনুমতি যাচাই করে
  4. 🗂️ file system নাম থেকে block নম্বর বের করে
  5. 🔧 device driver ডিস্কের ভাষায় কমান্ড পাঠায়
  6. 💾 ডিস্ক block পড়ে interrupt দেয়

অপারেটিং সিস্টেমের পরিভাষায় “process” বলতে কী বোঝায়?

  • ডিস্কে সেভ করা একটি .exe ফাইল
  • মেমরিতে চলমান অবস্থায় থাকা একটি program
  • CPU-র ভেতরের একটি প্রসেসিং ইউনিট
  • একাধিক ফাইল রাখার একটি ফোল্ডার

একটি চলমান process ডিস্ক থেকে ডেটা পড়ার অনুরোধ করলে সাধারণত সে কোন অবস্থায় যায়?

  • Ready
  • Terminated
  • Waiting (Blocked)
  • New

চারটি process একসাথে সময় ০-তে এসেছে, ক্রম P1, P2, P3, P4; burst যথাক্রমে 6, 3, 1, 4. Round Robin (quantum 2)-এ গড় waiting time কত?

  • 6.25
  • 3.25
  • 6.75
  • 10.25

সব process একসাথে এলে কোন scheduling algorithm গড় waiting time সবচেয়ে কম দেয়?

  • SJF (Shortest Job First)
  • FCFS (First Come, First Served)
  • Round Robin
  • Priority

নিচের কোনটি deadlock-এর চারটি প্রয়োজনীয় (Coffman) শর্তের একটি নয়?

  • Mutual exclusion
  • Hold and wait
  • Circular wait
  • Context switching

FAT32 file system-এ format করা পেনড্রাইভে একটি ফাইলের সর্বোচ্চ আকার কত হতে পারে?

  • 2 GB
  • 4 GB
  • 32 GB
  • কোনো সীমা নেই

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. OS = ভাগাভাগির ম্যানেজার: CPU-র সময়, মেমরি আর ডিস্ক অনেক প্রোগ্রামের মধ্যে ভাগ করে; অ্যাপ user mode-এ, kernel চলে kernel mode-এ।
  2. অ্যাপ হার্ডওয়্যার চায় system call দিয়ে; হার্ডওয়্যার CPU-কে ডাকে interrupt দিয়ে — টাইমার interrupt-ই multitasking সম্ভব করে।
  3. Process = চলমান program (কোড, ডেটা, stack, PCB); অবস্থা New → Ready ⇄ Running → Waiting → Ready … → Terminated; thread একই process-এর মেমরি ভাগ করে।
  4. waiting = turnaround − burst. SJF-এ গড় waiting সবচেয়ে কম, Round Robin-এ response ভালো, priority-তে starvation-এর ঝুঁকি (সমাধান aging). AI-এর Gantt chart নিজে মিলিয়ে নিন।
  5. Deadlock-এর চার শর্ত একসাথে লাগে; একটি ভাঙলেই মুক্তি। File system block-কে ফাইল বানায়: FAT32-এ ৪ GB সীমা, NTFS/ext4-এ journaling আর permission.

পরের পর্বে: এই পর্বের kernel, driver আর file system তো চলছে — কিন্তু পাওয়ার বোতাম চাপার মুহূর্তে এরা আসে কোথা থেকে? BIOS/UEFI-এর প্রথম পরীক্ষা থেকে bootloader, kernel লোড হওয়া আর ডেস্কটপ আসা পর্যন্ত — কম্পিউটার চালু হওয়ার পুরো গল্প।

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

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান