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

অপারেটিং সিস্টেম কী আর কেন — কম্পিউটারের ব্যবস্থাপক

What an Operating System Is — The Manager Inside Every Computer

Taught in Bangla, this lesson opens the operating systems course: the OS as resource manager and extended machine, what happens between tapping an app icon and its screen appearing, seven core OS duties, kernel vs shell vs GUI, user and kernel mode, how an interrupt carries a keypress to the CPU, hands-on queries to a live Linux with bash and C, common operating systems and the 64-part roadmap.

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

  • অপারেটিং সিস্টেমকে দুইভাবে দেখা — resource manager আর extended machine
  • ফোনে একটি অ্যাপের আইকনে চাপ দেওয়া থেকে অ্যাপের পর্দা আসা পর্যন্ত প্রতিটি স্তরের ভূমিকা
  • Kernel, shell, GUI আর সাধারণ প্রোগ্রামের পার্থক্য; user mode আর kernel mode-এর মূল ধারণা
  • Interrupt কীভাবে একটি কি-চাপকে CPU পর্যন্ত পৌঁছে দেয়
  • নিজের হাতে চলমান Linux-কে প্রশ্ন করা — bash আর C দিয়ে
  • Windows, macOS, Linux, Android, iOS আর RTOS-এর পরিচয়, আর পুরো ৬৪ পর্বের রোডম্যাপ

১ · কম্পিউটারের ব্যবস্থাপক — অপারেটিং সিস্টেম আসলে কী

একটি সাধারণ সকালের কথা ভাবুন। আপনার ফোনে একসাথে গান বাজছে, পেছনে WhatsApp নতুন বার্তা নামাচ্ছে, আর আপনি bKash অ্যাপ খুলে বিদ্যুৎ বিল দিচ্ছেন। ফোনে CPU core আছে হাতে গোনা কয়েকটি, মেমরিও সীমিত, স্পিকার একটি, পর্দা একটি। তবু তিনটি কাজ এমনভাবে চলছে যেন প্রত্যেকে পুরো ফোনটিই নিজের হাতে পেয়েছে। গান আটকে যাচ্ছে না, বার্তা হারাচ্ছে না, আর bKash-এর পিন অন্য অ্যাপ পড়তে পারছে না।

এই শৃঙ্খলা নিজে থেকে আসে না। পর্দার আড়ালে একটি সফটওয়্যার প্রতি মুহূর্তে সিদ্ধান্ত নিচ্ছে — এখন কে CPU পাবে, কে কতটুকু মেমরি পাবে, কোন বার্তা কোন অ্যাপের, কে কোন ফাইল পড়ার অনুমতি পায়। সেই সফটওয়্যারের নাম অপারেটিং সিস্টেম (Operating System, সংক্ষেপে OS). এই পর্ব পুরো কোর্সের দরজা — এখানে আমরা দেখব OS কী, কেন দরকার, আর ভেতরে মোটামুটি কীভাবে কাজ করে।

একটি ব্যস্ত রেস্তোরাঁর কথা ভাবুন। রান্নাঘরে চুলা মাত্র চারটি, ফ্রিজ একটি, বাবুর্চি কয়েকজন — কিন্তু অর্ডার আসছে শত শত। ম্যানেজার ঠিক করেন কোন অর্ডার আগে রান্না হবে, কোন চুলা কে পাবে, কোন টেবিলের খাবার কোন ওয়েটার নেবেন, আর ক্যাশবাক্সে কে হাত দিতে পারবেন। ক্রেতা ম্যানেজারকে দেখেন না, দেখেন শুধু সময়মতো আসা খাবার। কম্পিউটারে চুলা হলো CPU, ফ্রিজ হলো মেমরি আর ডিস্ক, অর্ডার হলো প্রোগ্রাম — আর ম্যানেজার হলো অপারেটিং সিস্টেম।

প্রথম দৃষ্টিভঙ্গি: OS একজন resource manager

কম্পিউটারের প্রতিটি সম্পদ (resource) সীমিত — CPU-র সময়, মেমরির জায়গা, ডিস্কের জায়গা, নেটওয়ার্কের গতি, প্রিন্টার। অনেক প্রোগ্রাম একসাথে এগুলো চায়। OS-এর প্রথম পরিচয় তাই একজন resource manager: সে সম্পদ ভাগ করে দেয়, কে কতটুকু পেল তার হিসাব রাখে, আর কাজ শেষে সম্পদ ফেরত নেয়।

ভাগ দুই রকমের হয়। সময়ে ভাগ (time multiplexing): একটি CPU পালা করে কয়েক মিলিসেকেন্ড এক প্রোগ্রামকে, কয়েক মিলিসেকেন্ড আরেকটিকে দেয় — এত দ্রুত যে মনে হয় সবাই একসাথে চলছে। জায়গায় ভাগ (space multiplexing): মেমরি বা ডিস্কের আলাদা আলাদা অংশ আলাদা প্রোগ্রামকে দেওয়া হয়। একসাথে অনেক প্রোগ্রাম চালানোর এই ক্ষমতার নাম multitasking.

দ্বিতীয় দৃষ্টিভঙ্গি: OS একটি extended machine

হার্ডওয়্যার নিজে খুব রুক্ষ। একটি SSD জানে শুধু “এই নম্বরের ব্লকে এই বাইটগুলো লেখো”; সে “ফাইল”, “ফোল্ডার” বা “resume.pdf” নামে কিছু চেনে না। নেটওয়ার্ক কার্ড জানে শুধু বাইটের প্যাকেট পাঠাতে। OS এই রুক্ষ হার্ডওয়্যারের ওপর একটি সুন্দর, সহজ “নকল যন্ত্র” দাঁড় করায় — একে বলে extended machine বা abstract machine. প্রোগ্রাম দেখে:

  • ফাইল — নাম দেওয়া বাইটের সারি; ডিস্কের ব্লক, সেক্টর আর ফ্ল্যাশ চিপের ঝামেলা লুকানো।
  • প্রসেস — চলমান একটি প্রোগ্রাম, যে ভাবে CPU যেন শুধু তার।
  • নিজস্ব মেমরি — প্রতিটি প্রসেস ভাবে ঠিকানা 0 থেকে শুরু করে বিশাল একটি মেমরি শুধু তারই (পর্ব ৩৫-এ দেখবেন কীভাবে)।
  • Socket — অন্য কম্পিউটারের সাথে কথা বলার একটি পাইপ, প্যাকেট আর তারের খুঁটিনাটি ছাড়া।
মূল ধারণা

একই OS-কে দুই দিক থেকে দেখা যায়। ওপর থেকে (প্রোগ্রামের চোখে) OS হলো সহজ abstraction-এর একটি সেট — ফাইল, প্রসেস, মেমরি, socket. নিচ থেকে (হার্ডওয়্যারের চোখে) OS হলো একজন কড়া ব্যবস্থাপক, যে সীমিত সম্পদ ন্যায্যভাবে আর নিরাপদে ভাগ করে। একটি সংক্ষিপ্ত সংজ্ঞা: অপারেটিং সিস্টেম হলো সেই সফটওয়্যার, যা হার্ডওয়্যার নিয়ন্ত্রণ করে, প্রোগ্রামগুলোর মধ্যে সম্পদ ভাগ করে আর তাদের জন্য সহজ ও নিরাপদ সেবা দেয়।

কম্পিউটারের স্তরগুলো — নিচ থেকে ওপরে

Hardware → Kernel → System libraries & services → Applications

  1. হার্ডওয়্যারCPU · RAM · SSD · পর্দাযা হাতে ছোঁয়া যায়
  2. KernelLinux · NT · XNUOS-এর হৃদয়, পূর্ণ ক্ষমতা
  3. Library ও servicelibc · ntdll · system_serverkernel-কে ডাকার সহজ পথ
  4. অ্যাপChrome · bKash · bashআপনি যা দেখেন
ছবি ১.১ — প্রতিটি স্তর শুধু ঠিক নিচের স্তরের সেবা ব্যবহার করে; অ্যাপ কখনো সরাসরি হার্ডওয়্যারে হাত দেয় না।

খেয়াল করুন, “অপারেটিং সিস্টেম” শব্দটি দুই অর্থে ব্যবহার হয়। সংকীর্ণ অর্থে OS মানে শুধু kernel — যে অংশ সবসময় মেমরিতে থাকে আর পূর্ণ ক্ষমতায় চলে। প্রশস্ত অর্থে OS মানে kernel-এর সাথে system library, background service, shell, ফাইল ম্যানেজার, এমনকি হোম স্ক্রিন — অর্থাৎ ফোন বা ল্যাপটপ কেনার সময় যা “Windows 11” বা “Android 15” নামে আসে। এই কোর্সে মূল মনোযোগ kernel-এর ওপর, কারণ আসল ব্যবস্থাপনা সেখানেই হয়।

২ · অ্যাপের আইকনে চাপ দিলে কী ঘটে

সংজ্ঞা মুখস্থ করার চেয়ে একটি বাস্তব ঘটনা অনুসরণ করা অনেক কাজের। আপনি ফোনের হোম স্ক্রিনে একটি অ্যাপের আইকনে আঙুল ছোঁয়ালেন — এক সেকেন্ডের কম সময়ে অ্যাপের পর্দা এলো। এর মধ্যে তিনটি স্তর অন্তত সাতবার হাত বদল করেছে। নিচের ডায়াগ্রামে “পরে” চাপুন; প্রতিটি ধাপে যে অংশগুলো কাজ করছে, সেগুলো লাল দাগে উজ্জ্বল হবে, আর নিচের টেবিলে দেখবেন CPU তখন কোন mode-এ।

অ্যাপuser space
Launcher (হোম স্ক্রিন)user space
System library ও serviceuser space
Device driverkernel
Process ও schedulerkernel
Memory managerkernel
Touchscreenhardware
CPUhardware
RAM ও storagehardware
GPU ও পর্দাhardware
এই মুহূর্তে
CPU-র mode
কে কাজ করছে
  1. ধাপ ১ — হার্ডওয়্যার টের পেল। পর্দার নিচের touch সেন্সর আঙুলের স্পর্শে বৈদ্যুতিক পরিবর্তন ধরল, আর তার নিজস্ব ছোট controller চিপ হিসাব করল স্পর্শটি পর্দার কোন বিন্দুতে। CPU তখনো অন্য কাজে ব্যস্ত, user mode-এ।
  2. ধাপ ২ — Interrupt, kernel জেগে উঠল। Controller CPU-কে একটি interrupt সংকেত পাঠাল — “আমার কাছে নতুন খবর আছে”. CPU হাতের কাজ থামিয়ে kernel mode-এ ঢুকল, আর touch-এর device driver controller থেকে স্থানাঙ্ক (x, y) পড়ে নিল।
  3. ধাপ ৩ — খবর গেল user space-এ। Kernel স্পর্শটিকে একটি “input event” বানিয়ে user space-এর input service-এর কাছে পৌঁছে দিল; সেখান থেকে পর্দার সামনের অ্যাপ — এখানে Launcher — খবর পেল। Launcher হিসাব করল: এই বিন্দুতে অমুক অ্যাপের আইকন। কোন আইকন কোথায়, তা kernel জানে না — এটি অ্যাপের নিজের জ্ঞান।
  4. ধাপ ৪ — নতুন প্রসেস তৈরির অনুরোধ। Launcher নিজে অ্যাপ চালাতে পারে না; সে system service-এর মাধ্যমে OS-কে অনুরোধ করল। শেষ পর্যন্ত kernel-এর কাছে system call গেল, আর kernel একটি নতুন প্রসেস তৈরি করে তার হিসাবের খাতা খুলল। (Linux-এ এর পেছনে থাকে fork আর exec — পর্ব ১০-এ বিস্তারিত।)
  5. ধাপ ৫ — মেমরি আর কোড। Memory manager নতুন প্রসেসকে নিজস্ব মেমরি দিল, আর storage driver অ্যাপের কোড ও তার library ফ্ল্যাশ মেমরি থেকে RAM-এ আনার ব্যবস্থা করল — সব একবারে নয়, যে অংশ দরকার সেটুকু (demand paging, পর্ব ৩৫)।
  6. ধাপ ৬ — CPU-র পালা। Scheduler নতুন প্রসেসকে “প্রস্তুত” তালিকায় রাখল, তারপর একটি CPU core-এ চালিয়ে দিল। CPU এখন user mode-এ অ্যাপের নিজের কোড চালাচ্ছে — শুরু হলো অ্যাপের জীবন।
  7. ধাপ ৭ — প্রথম পর্দা আঁকা। অ্যাপ graphics library-কে বলল “এই বোতাম আর লেখাগুলো আঁকো”. Library আবার system call দিয়ে kernel-এর GPU driver-কে কাজ দিল, GPU ছবিটি বানিয়ে পর্দায় পাঠাল। এই আঁকাআঁকি চলতেই থাকে — অনেক ফোনে সেকেন্ডে ৬০ বা তার বেশিবার — আর CPU বারবার user আর kernel mode-এর মধ্যে আসা-যাওয়া করে।

সাত ধাপে একটি নিয়ম বারবার ফিরে এসেছে: অ্যাপ কখনো নিজে হার্ডওয়্যারে হাত দেয়নি। Touchscreen পড়েছে driver, মেমরি দিয়েছে memory manager, পর্দায় এঁকেছে GPU driver. অ্যাপ শুধু অনুরোধ করেছে। ল্যাপটপে কি-বোর্ডে চাপ দেওয়া, মাউসে ক্লিক বা Wi-Fi-তে একটি প্যাকেট আসা — সবকিছুই প্রায় একই পথে যায়: হার্ডওয়্যার → interrupt → driver → kernel → অ্যাপ.

আরও গভীরে: Android-এ ধাপ ৪ বেশ আকর্ষণীয়। Launcher Binder নামের একটি IPC ব্যবস্থায় system_server প্রসেসের ActivityManager-কে অনুরোধ পাঠায়; সে আবার Zygote নামের একটি আগে থেকে চালু প্রসেসকে বলে নিজের একটি কপি (fork) বানাতে। Zygote আগেই Android framework-এর সাধারণ class আর resource মেমরিতে এনে রেখেছে, তাই fork-এর পর নতুন অ্যাপ সেগুলো copy-on-write পদ্ধতিতে ভাগ করে নেয় — প্রতিটি অ্যাপ শূন্য থেকে শুরু করলে যা অনেক ধীর হতো। Windows-এ একই কাজ করে CreateProcess, যা fork-এর মতো কপি না বানিয়ে সরাসরি নতুন প্রোগ্রাম দিয়ে প্রসেস তৈরি করে।

৩ · OS-এর কাজের তালিকা — সাতটি বড় দায়িত্ব

রেস্তোরাঁর ম্যানেজারের যেমন কাজের একটি তালিকা থাকে — অর্ডার, চুলা, ভাঁড়ার, ক্যাশ, নিরাপত্তা — OS-এরও তেমনি কয়েকটি বড় দায়িত্ব আছে। এই কোর্সের প্রায় প্রতিটি মডিউল এর একটি দায়িত্ব নিয়ে।

১. Process management

প্রোগ্রাম চালু করা, থামানো, শেষ করা; কে কখন CPU পাবে তা ঠিক করা (scheduling); প্রসেসগুলোর মধ্যে বার্তা আদান-প্রদান আর সমন্বয়।

মডিউল ২, ৩, ৪

২. Memory management

কোন প্রসেস RAM-এর কোন অংশ পাবে; একজন যেন অন্যের মেমরিতে লিখতে না পারে; RAM কম পড়লে কী সরিয়ে রাখা হবে (virtual memory).

মডিউল ৫

৩. File management

ডিস্কের ব্লকগুলোকে ফাইল আর ফোল্ডারে সাজানো (file system), নাম দিয়ে খোঁজা, বিদ্যুৎ চলে গেলেও ডেটা যেন নষ্ট না হয়।

মডিউল ৬

৪. I/O management

কি-বোর্ড, পর্দা, USB, ক্যামেরা, ডিস্ক — হাজার রকম ডিভাইসকে driver দিয়ে নিয়ন্ত্রণ; ধীর ডিভাইসের জন্য CPU যেন বসে না থাকে।

মডিউল ৬

৫. Protection ও security

কোন ব্যবহারকারী বা প্রোগ্রাম কোন ফাইল ও ডিভাইস ছুঁতে পারবে; লগইন; একটি অ্যাপের ভুল বা দুষ্টুমি যেন পুরো সিস্টেম না ফেলে দেয়।

মডিউল ৭

৬. Networking

TCP/IP-এর মতো protocol kernel-এর ভেতরেই চলে; অ্যাপ শুধু socket খুলে লেখে-পড়ে, প্যাকেট ভাগ করা ও আবার পাঠানোর কাজ OS-এর।

পর্ব ১২, ৫৩

৭. User interface

মানুষ কীভাবে OS-কে নির্দেশ দেবে — লেখা কমান্ডের shell, নাকি জানালা-আইকনের GUI, নাকি স্পর্শ আর কণ্ঠস্বর।

পর্ব ৩, ১১

এবার “resource manager” কথাটিকে চোখে দেখা যাক। ধরুন একটি ল্যাপটপে ৮ GB RAM আর একটিমাত্র CPU core (হিসাব সহজ রাখতে)। আপনি একে একে তিনটি প্রোগ্রাম খুললেন — গান শোনার প্লেয়ার, ওয়েব ব্রাউজার আর একটি বড় প্রজেক্ট compile করার compiler. প্রতিটি ধাপে OS কীভাবে মেমরি আর CPU-র সময় ভাগ করছে, দেখুন:

RAM-এর হিসাব (মোট 8.0 GB) আর CPU-র পালা
Kernel ও OS service
🎵 Music player
🌐 Browser
⚙️ Compiler
ফাঁকা RAM
Swap (ডিস্কে সরানো)
CPU-র পালা
  1. শুরুতে শুধু OS. Kernel আর OS-এর নিজের service মিলে ধরা যাক 1.0 GB নিয়েছে; বাকি 7.0 GB ফাঁকা। কোনো প্রোগ্রাম চলছে না, তাই CPU “idle” — OS তাকে কম বিদ্যুৎ খরচের অবস্থায় রাখে।
  2. Music player খুললেন। OS তাকে 0.5 GB দিল; ফাঁকা থাকল 7.0 − 0.5 = 6.5 GB. CPU-তে এখন একজনই (M), তাই সে যখন চায় তখনই পায়।
  3. Browser খুললেন। Browser পেল 2.5 GB; ফাঁকা 6.5 − 2.5 = 4.0 GB. এবার CPU একটি, দাবিদার দুজন। Scheduler পালা করে কয়েক মিলিসেকেন্ড M, কয়েক মিলিসেকেন্ড B চালাচ্ছে — এত দ্রুত যে গানও থামে না, পাতাও লোড হয়।
  4. Compiler চালালেন। Compiler পেল 3.0 GB; ফাঁকা 4.0 − 3.0 = 1.0 GB. CPU-র পালা এখন তিনজনের মধ্যে ঘুরছে: M → B → C → M … প্রত্যেকে ভাবছে CPU যেন তারই, শুধু একটু ধীর। একটি প্রসেস থেকে আরেকটিতে যাওয়ার এই বদলের নাম context switch (পর্ব ৯)।
  5. Browser আরও 1.5 GB চাইল (অনেক ট্যাব খুলেছেন)। ফাঁকা আছে মাত্র 1.0 GB. OS Compiler-এর যে মেমরি কিছুক্ষণ ব্যবহার হয়নি, তার 1.0 GB ডিস্কের swap অংশে সরিয়ে রাখল; Compiler-এর RAM-এ থাকল 2.0 GB. এখন Browser 4.0 GB, আর ফাঁকা 8.0 − 1.0 − 0.5 − 4.0 − 2.0 = 0.5 GB — জরুরি কাজের জন্য সামান্য মজুত। ব্যস্ত Browser এখন CPU-ও বেশি পাচ্ছে।
  6. Compiler-এর কাজ শেষ। OS তার RAM-এর 2.0 GB আর swap-এর 1.0 GB — দুটোই ফেরত নিল। ফাঁকা হলো 0.5 + 2.0 = 2.5 GB, আর CPU-র পালা আবার দুজনের মধ্যে। খেয়াল করুন, প্রোগ্রাম কখনো নিজে “আমার মেমরি ফেরত দিলাম” বলেনি — হিসাব রেখেছে আর ফেরত নিয়েছে OS.

সংখ্যাগুলো বোঝানোর জন্য সরল করা। বাস্তবে OS প্রায় পুরো ফাঁকা RAM-কে ফাইলের cache হিসেবে কাজে লাগায়, প্রোগ্রাম চাইলেই সব মেমরি সাথে সাথে বসিয়ে দেয় না, আর মোবাইলে (যেমন Android) ডিস্কে swap করার বদলে প্রায়ই মেমরি সংকুচিত (compress) করে বা পেছনের অ্যাপ বন্ধ করে দেয়। এসবের বিস্তারিত পর্ব ৩৫–৩৮-এ।

৪ · Kernel, shell, GUI আর সাধারণ প্রোগ্রাম — কে কোথায় থাকে

নতুনরা প্রায়ই গুলিয়ে ফেলেন — “Terminal-ই তো OS”, বা “Windows মানে ওই নীল-সাদা পর্দা আর Start বোতাম”. আসলে কয়েকটি আলাদা জিনিস একসাথে কাজ করে। একটি বড় অফিস ভবনের কথা ভাবুন।

🧠 Kernel

ভবনের ভেতরের নিয়ন্ত্রণকক্ষ — বিদ্যুৎ, লিফট, তালা-চাবি সব এখান থেকে। সাধারণ মানুষ ঢুকতে পারে না। কম্পিউটার চালু হওয়া থেকে বন্ধ হওয়া পর্যন্ত kernel মেমরিতে থাকে, পূর্ণ ক্ষমতায়।

Linux, Windows NT kernel, XNU

⌨️ Shell

অভ্যর্থনা ডেস্ক, যেখানে আপনি লিখে অনুরোধ জানান। Shell নিজেও একটি সাধারণ প্রোগ্রাম — আপনার লেখা কমান্ড পড়ে, তারপর kernel-কে বলে সেই প্রোগ্রাম চালাতে।

bash, zsh, PowerShell, cmd

🖱️ GUI

ছবি আর বোতামওয়ালা সুন্দর রিসেপশন — একই অনুরোধ আঙুল বা মাউস দিয়ে। GUI-ও user space-এ চলা প্রোগ্রামের একটি দল (desktop shell, window manager).

Windows Explorer, macOS Finder, GNOME

📱 সাধারণ প্রোগ্রাম

ভবনের ভাড়াটে অফিসগুলো — নিজের কামরায় স্বাধীন, কিন্তু বিদ্যুৎ বা লিফট লাগলে নিয়ন্ত্রণকক্ষকে বলতে হয়। এটাই program চলার নিয়ম।

Chrome, VS Code, আপনার C প্রোগ্রাম

সবচেয়ে গুরুত্বপূর্ণ কথা: shell আর GUI kernel-এর অংশ নয়। Linux-এ আপনি bash বদলে zsh বা fish বসাতে পারেন, GNOME বদলে KDE — kernel একই থাকে। Android আর একটি সাধারণ Linux সার্ভারের kernel একই পরিবারের, অথচ দেখতে সম্পূর্ণ আলাদা, কারণ ওপরের স্তরগুলো আলাদা।

User mode আর kernel mode — দুই রকম অনুমতি

অ্যাপ কেন নিজে হার্ডওয়্যারে হাত দিতে পারে না? কারণ CPU নিজেই এটি আটকায়। আধুনিক প্রায় সব CPU অন্তত দুটি অবস্থায় চলতে পারে। User mode-এ সাধারণ হিসাব-নিকাশ চলে, কিন্তু ডিভাইসে সরাসরি লেখা, অন্যের মেমরি ছোঁয়া বা interrupt বন্ধ করার মতো “বিশেষ নির্দেশ” (privileged instruction) চালানো নিষেধ — চেষ্টা করলে CPU নিজেই থেমে kernel-কে খবর দেয়। Kernel mode-এ সব নির্দেশ চলে; শুধু kernel-এর কোড এই অবস্থায় চলে।

বাড়ির দারোয়ানের কথা ভাবুন। ভাড়াটেরা নিজের ফ্ল্যাটে যা খুশি করতে পারেন, কিন্তু ছাদের পানির ট্যাংক বা মিটার রুমের চাবি তাঁদের কাছে নেই। দরকার হলে দারোয়ানকে বলতে হয়; দারোয়ান যাচাই করেন অনুরোধটি বৈধ কি না, তারপর নিজে গিয়ে কাজটি করে দেন। ভাড়াটে = user mode-এর অ্যাপ, দারোয়ান = kernel, আর “দারোয়ানকে বলা” = system call.

এই ভাগের ফলেই একটি অ্যাপ crash করলে সাধারণত শুধু সেই অ্যাপটিই বন্ধ হয়, পুরো ফোন নয়। অনুরোধ করার নির্দিষ্ট দরজাটির নাম system call — যেমন “এই ফাইলটি খোলো”, “এই বাইটগুলো পর্দায় লেখো”, “আমাকে আরও মেমরি দাও”. প্রতিটি system call-এ CPU একটি বিশেষ নির্দেশে kernel mode-এ ঢোকে, কাজ শেষে আবার user mode-এ ফেরে। এর পুরো কারিগরি — কোন নির্দেশ, কোন register, কত খরচ — পর্ব ৫-এ।

ব্যাপারটা নিজে মেপে দেখা যায়। প্রতিটি প্রসেসের CPU-সময় OS দুই ভাগে হিসাব রাখে: user (নিজের কোডে কাটানো সময়) আর sys (তার হয়ে kernel-এর খাটুনি)। নিচের bash স্ক্রিপ্ট দুটি কাজ মাপে — প্রথমটি শুধু যোগ-বিয়োগ, দ্বিতীয়টি এক বাইট করে পড়ে-লেখে, অর্থাৎ বিপুল সংখ্যক system call করে। চালিয়ে দেখুন:

TIMEFORMAT='   real %R s | user %U s | sys %S s'

echo "1) pure arithmetic in bash (no system calls in the loop):"
{ time { s=0; for ((i=0; i<200000; i++)); do s=$((s+i)); done; }; } 2>&1
echo "   sum = $s"

echo "2) dd copies 200000 bytes, ONE byte per read()/write():"
{ time dd if=/dev/zero of=/dev/null bs=1 count=200000 status=none; } 2>&1

echo "3) same 200000 bytes in ONE big read()/write():"
{ time dd if=/dev/zero of=/dev/null bs=200000 count=1 status=none; } 2>&1

একটি বাস্তব চালানোয় পাওয়া গেছে:

1) pure arithmetic in bash (no system calls in the loop):
   real 0.848 s | user 0.848 s | sys 0.000 s
   sum = 19999900000
2) dd copies 200000 bytes, ONE byte per read()/write():
   real 0.325 s | user 0.071 s | sys 0.252 s
3) same 200000 bytes in ONE big read()/write():
   real 0.003 s | user 0.000 s | sys 0.002 s

প্রথম লুপের সময় পুরোটাই user-এ (0.848 সেকেন্ড, আর sys শূন্য) — bash নিজেই যোগ করছে, kernel-এর দরকার নেই। দ্বিতীয় ক্ষেত্রে dd প্রায় চার লাখ বার (২ লাখ read আর ২ লাখ write) kernel-এর দরজায় কড়া নেড়েছে, তাই সময়ের বড় অংশ sys-এ (0.252 সেকেন্ড, যেখানে user মাত্র 0.071 সেকেন্ড)। তৃতীয়টিতে একই পরিমাণ ডেটা একবারে, ফলে প্রায় শূন্য সময়। শিক্ষা: system call সস্তা, কিন্তু বিনামূল্যে নয় — অসংখ্য ছোট ছোট অনুরোধের চেয়ে কম সংখ্যক বড় অনুরোধ অনেক দ্রুত। এজন্যই printf লেখাকে আগে buffer-এ জমায়। আপনার চালানোয় সংখ্যাগুলো আলাদা হবে (CPU, kernel version আর container-এর ভার অনুযায়ী), কিন্তু এই সম্পর্ক একই থাকবে।

৫ · Interrupt — একটি কি-চাপ কীভাবে CPU পর্যন্ত পৌঁছায়

OS তো একটি প্রোগ্রাম; CPU যখন আপনার ভিডিও প্লেয়ার চালাচ্ছে, তখন kernel আসলে চলছে না। তাহলে আপনি কি-বোর্ডে চাপ দিলে kernel টের পায় কীভাবে? CPU কি প্রতি মুহূর্তে কি-বোর্ডকে জিজ্ঞেস করে “কিছু চাপা হলো?” — এভাবে বারবার জিজ্ঞেস করাকে বলে polling, আর এতে CPU-র সময় নষ্ট হয়। প্রধান সমাধান হলো interrupt: ডিভাইস নিজেই CPU-কে একটি সংকেত দিয়ে থামায়।

ব্যাংকের টোকেন-কাউন্টারের কথা ভাবুন। ক্যাশিয়ার একজন গ্রাহকের টাকা গুনছেন। হঠাৎ ম্যানেজারের ঘর থেকে বেল বাজল। ক্যাশিয়ার হাতের নোটটি গোনা শেষ করে খাতায় লিখে রাখলেন “এই গ্রাহকের ৪৭০০ টাকা পর্যন্ত গোনা হয়েছে”, ম্যানেজারের জরুরি কাজটি সারলেন, তারপর খাতা দেখে ঠিক সেখান থেকে আবার গোনা শুরু করলেন। গ্রাহক টেরও পেলেন না। বেল = interrupt, খাতায় লেখা = state সংরক্ষণ, জরুরি কাজ = interrupt handler.

  1. ভিডিও প্লেয়ারuser modeCPU এখানে ব্যস্ত
  2. কি-বোর্ডIRQ“আমার খবর আছে”
  3. CPU থামলkernel modestate সংরক্ষণ
  4. Driverscan code → 'A'buffer-এ রাখা
  5. Editoruser modeঅক্ষর আঁকা
CPU আর kernel-এর খাতা
CPU-র mode
CPU এখন চালাচ্ছে
সংরক্ষিত state
কি-বোর্ড buffer
Editor-এর অবস্থা
  1. CPU ব্যস্ত অন্য কাজে। আপনি পাশে একটি ভিডিও চালিয়ে রেখেছেন; CPU user mode-এ প্লেয়ারের কোড চালাচ্ছে। Text editor একটি কি-চাপের অপেক্ষায় ঘুমিয়ে (blocked) আছে — অপেক্ষার সময় সে CPU-র এক বিন্দুও খরচ করে না। Buffer খালি।
  2. আপনি “A” চাপলেন। কি-বোর্ড (বা USB কন্ট্রোলার) CPU-কে একটি interrupt request — IRQ — পাঠাল। CPU সঙ্গে সঙ্গে লাফ দেয় না; হাতের নির্দেশটি শেষ করে, তারপর interrupt দেখে। CPU তখনো user mode-এ।
  3. CPU থেমে kernel-এ ঢুকল। CPU প্লেয়ারের অবস্থা — কোন নির্দেশে ছিল (program counter, PC) আর কিছু register — নিরাপদে সংরক্ষণ করল, kernel mode-এ গেল, আর interrupt vector table দেখে এই ধরনের interrupt-এর জন্য নির্দিষ্ট kernel ফাংশনে (interrupt handler) লাফ দিল। ঠিক যেন ক্যাশিয়ার খাতায় হিসাব লিখে রেখে উঠলেন।
  4. Driver কাজ সারল। Keyboard driver ডিভাইস থেকে একটি সংখ্যা (scan code) পড়ল, তাকে কি-বোর্ড লেআউট অনুযায়ী অক্ষর “A”-তে রূপান্তরের ব্যবস্থা করল, আর input buffer-এ রাখল। যে Editor এই অক্ষরের অপেক্ষায় ছিল, kernel তাকে “প্রস্তুত” (ready) তালিকায় তুলল। কাজ ছোট রাখা হয়, যাতে CPU দ্রুত ফিরতে পারে।
  5. Kernel ফিরে গেল user mode-এ। এবার scheduler ঠিক করল কে চলবে। কি-চাপের মতো interactive কাজকে OS সাধারণত দ্রুত সাড়া দিতে চায়, তাই এখানে Editor চলল; প্লেয়ারের সংরক্ষিত state ready তালিকায় অপেক্ষা করছে। CPU আবার user mode-এ।
  6. পর্দায় “A”. Editor একটি system call (যেমন read) দিয়ে buffer থেকে অক্ষরটি নিল — আবার কিছুক্ষণ kernel mode — তারপর অক্ষরটি পর্দায় আঁকল। পরের পালায় প্লেয়ার ঠিক যেখানে থেমেছিল সেখান থেকে চলল; ভিডিও এক ফ্রেমও হারায়নি। পুরো যাত্রাটি সাধারণত মাইক্রোসেকেন্ড থেকে মিলিসেকেন্ডের মধ্যে শেষ হয়।

Interrupt-ই OS-এর হৃদস্পন্দন। কি-বোর্ড, নেটওয়ার্ক কার্ড, ডিস্ক — সবাই interrupt পাঠায়। সবচেয়ে গুরুত্বপূর্ণটি আসে একটি timer থেকে: OS নিয়মিত বিরতিতে timer interrupt-এর ব্যবস্থা করে রাখে, তাই কোনো প্রোগ্রাম CPU আঁকড়ে থাকতে চাইলেও (যেমন অসীম লুপে আটকে) kernel নিয়ম করে নিয়ন্ত্রণ ফিরে পায় আর অন্যকে পালা দিতে পারে। Interrupt, timer আর DMA-র হার্ডওয়্যার-দিক পর্ব ৪-এ, আর ডিভাইসের দিক পর্ব ৩৯-এ।

তিন দরজা

CPU তিনভাবে user mode থেকে kernel-এ ঢোকে: (১) interrupt — বাইরের ডিভাইস বা timer-এর সংকেত, চলতি প্রোগ্রামের সাথে যার সম্পর্ক নেই; (২) system call — প্রোগ্রামের নিজের ইচ্ছাকৃত অনুরোধ; (৩) exception — প্রোগ্রামের কোনো ঘটনা, যেমন শূন্য দিয়ে ভাগ, নিষিদ্ধ মেমরিতে হাত দেওয়া বা page fault. তিনটির পরেই নিয়ন্ত্রণ যায় kernel-এর নির্দিষ্ট handler-এ।

৬ · হাতে-কলমে: চলমান OS-কে প্রশ্ন করুন

এতক্ষণ ধারণা। এবার একটি আসল চলমান Linux-কে প্রশ্ন করি। নিচের কোড চলবে একটি দূরের সার্ভারের container-এ (একটি আলাদা করা ছোট পরিবেশ — পর্ব ৫১-এ এর ভেতরটা দেখবেন)। তাই আপনার নিজের ফোন বা ল্যাপটপের নয়, সেই সার্ভারের তথ্য আসবে।

echo "== kernel name and release =="
uname -sr

echo "== CPU cores this process may use =="
nproc

echo "== memory, as the kernel reports it =="
head -n 3 /proc/meminfo

echo "== a few running processes =="
ps -e -o pid,ppid,comm | head -n 6
echo "processes visible here: $(ps -e --no-headers | wc -l)"

echo "== this shell itself =="
echo "my pid = $$, my parent's pid = $PPID"

একটি বাস্তব চালানোয় পাওয়া গেছে:

== kernel name and release ==
Linux 6.8.0-137-generic
== CPU cores this process may use ==
2
== memory, as the kernel reports it ==
MemTotal:        2008912 kB
MemFree:          189652 kB
MemAvailable:    1345164 kB
== a few running processes ==
    PID    PPID COMMAND
      1       0 podman-init
      2       1 bash
      6       2 ps
      7       2 head
processes visible here: 5
== this shell itself ==
my pid = 2, my parent's pid = 1

uname -sr kernel-এর নাম আর version দেখায় — এটি OS-এর kernel-এর version, পুরো distribution-এর নয়। nproc বলে এই প্রসেস কয়টি CPU core ব্যবহার করতে পারবে; container-এ এটি পুরো সার্ভারের core-সংখ্যার চেয়ে কম হতে পারে। /proc/meminfo আসলে ডিস্কের কোনো ফাইল নয় — /proc একটি “নকল” file system, যেখানে পড়লেই kernel তখনকার হিসাব বানিয়ে দেয় (extended machine-এর চমৎকার উদাহরণ)। ps-এর তালিকায় প্রতিটি প্রসেসের নিজস্ব নম্বর (PID) আর তার জন্মদাতার নম্বর (PPID) আছে; এখানে মাত্র কয়েকটি প্রসেস দেখা যাচ্ছে, কারণ container শুধু নিজের “ঘরের” প্রসেসই দেখে। তার ভেতরের প্রথম প্রসেসটির (PID 1) নাম podman-init — container-এর নিজস্ব শুরুর প্রসেস; তারপর আমাদের bash, আর মজার ব্যাপার, ps আর head নিজেরাও তালিকায় আছে, কারণ প্রতিটি কমান্ড চলার সময় নিজেই একটি প্রসেস। MemFree কম দেখালেও MemAvailable অনেক বেশি — OS ফাঁকা মেমরিকে ফাইলের cache হিসেবে খাটায়, দরকার হলে ছেড়ে দেয় (উপরের সতর্কবার্তাটি মনে করুন)। আপনার নিজের ল্যাপটপে চালালে শত শত প্রসেস পাবেন।

এবার একই প্রশ্ন C ভাষা থেকে — যে ভাষায় Linux, Windows আর macOS-এর kernel-এর বড় অংশ লেখা। getpid() একটি আসল system call; sysconf() glibc-এর ফাংশন, যা kernel-এর দেওয়া তথ্য থেকে উত্তর বানায়। ঠিক কোন সংখ্যা আসবে তা মেশিনভেদে বদলায়, তাই প্রোগ্রামটি সংখ্যার বদলে সম্পর্ক ছাপে:

#include <stdio.h>
#include <unistd.h>

int main(void) {
    pid_t me     = getpid();                 /* system call: who am I?  */
    pid_t parent = getppid();                /* who started me?         */
    long page    = sysconf(_SC_PAGESIZE);    /* memory is handed out in pages */
    long cpus    = sysconf(_SC_NPROCESSORS_ONLN);
    long pages   = sysconf(_SC_PHYS_PAGES);

    printf("my pid > 0 ............. %s\n", me > 0 ? "yes" : "no");
    printf("parent pid != my pid ... %s\n", parent != me ? "yes" : "no");
    printf("page size (bytes) ...... %ld\n", page);
    printf("page size power of 2 ... %s\n", (page & (page - 1)) == 0 ? "yes" : "no");
    printf("online CPUs >= 1 ....... %s\n", cpus >= 1 ? "yes" : "no");
    printf("RAM >= 256 MB .......... %s\n",
           pages * page >= 256L * 1024 * 1024 ? "yes" : "no");

    /* write() is the system call that printf itself uses underneath */
    const char msg[] = "this line came from write(), not printf\n";
    fflush(stdout);                 /* empty printf's buffer first */
    if (write(1, msg, sizeof msg - 1) < 0)
        return 1;
    return 0;
}

একটি বাস্তব চালানোয় পাওয়া গেছে:

my pid > 0 ............. yes
parent pid != my pid ... yes
page size (bytes) ...... 4096
page size power of 2 ... yes
online CPUs >= 1 ....... yes
RAM >= 256 MB .......... yes
this line came from write(), not printf

প্রতিটি প্রসেসের একটি ধনাত্মক PID আছে, আর তার জন্মদাতা প্রসেসের PID আলাদা — প্রসেসেরা একটি পারিবারিক গাছে সাজানো (পর্ব ৮ আর ১০)। Page size 4096 বাইট, অর্থাৎ 4 KB — x86-64 Linux-এ সাধারণ মাপ; OS মেমরি বাইট ধরে নয়, এই মাপের “পাতা” ধরে ভাগ করে (পর্ব ৩২)। কিছু ARM সিস্টেমে, যেমন Apple Silicon-এর macOS-এ, page 16 KB — তাই সংখ্যাটি নিজে কোডে বসিয়ে না দিয়ে sysconf দিয়ে জিজ্ঞেস করাই নিরাপদ। শেষ লাইনটি এসেছে সরাসরি write() system call থেকে। fflush(stdout) না দিলে আউটপুট pipe-এ যাওয়ার সময় printf-এর লেখাগুলো buffer-এ আটকে থাকত, ফলে write()-এর লাইনটি সবার আগে ছাপা হতো — library-র buffer আর kernel-এর system call যে দুটি আলাদা স্তর, এটি তার প্রমাণ।

এই প্রোগ্রাম Linux আর macOS-এ চলবে (দুটোই POSIX মান মেনে চলে), কিন্তু Windows-এর সাধারণ compiler-এ unistd.h নেই — Windows-এর নিজস্ব API (Win32) আলাদা: GetCurrentProcessId(), GetSystemInfo(). অন্য OS-এ একই তথ্য দেখার কমান্ড:

Get-CimInstance Win32_OperatingSystem | Select-Object Caption, Version
(Get-CimInstance Win32_ComputerSystem).NumberOfLogicalProcessors
Get-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 5 Name, Id

উদাহরণ হিসেবে আউটপুটে আসবে OS-এর নাম ও build নম্বর, logical processor-এর সংখ্যা, আর সবচেয়ে বেশি মেমরি নেওয়া পাঁচটি প্রসেস। Task Manager-এর (Ctrl+Shift+Esc) “Details” ট্যাবেও প্রতিটি প্রসেসের PID দেখা যায়।

sw_vers                 # macOS-এর version
uname -sr               # kernel: Darwin (XNU)
sysctl -n hw.ncpu       # CPU core
ps -e -o pid,ppid,comm | head -n 6

খেয়াল করুন, macOS-এ uname -s লিখে “Darwin” পাবেন — macOS-এর kernel আর মূল অংশের নাম। /proc macOS-এ নেই; সেখানে sysctl দিয়ে kernel-কে প্রশ্ন করা হয়।

cat /etc/os-release | head -n 2   # distribution-এর নাম
uname -sr                         # kernel version
free -h                           # RAM আর swap, মানুষের পড়ার মতো এককে

Android ফোনেও kernel Linux; Settings → About phone-এ “Kernel version” লেখা থাকে। Distribution (Ubuntu, Fedora, Debian) আর kernel version যে আলাদা জিনিস, সেটি এখান থেকেই বোঝা যায়।

৭ · যে অপারেটিং সিস্টেমগুলোর সাথে আপনার দেখা হয়

পৃথিবীতে অসংখ্য OS আছে, কিন্তু দৈনন্দিন জীবনে আপনি মূলত কয়েকটি পরিবারের দেখা পান। নিচের টেবিলে বাজারের অংশ নিয়ে কোনো নির্দিষ্ট শতাংশ দেওয়া হয়নি, কারণ জরিপভেদে আর বছরভেদে সংখ্যা বদলায়; শুধু সাধারণভাবে স্বীকৃত প্রবণতা লেখা হলো।

পরিবারKernelকোথায় দেখবেনমনে রাখার মতো
WindowsWindows NT kernel (hybrid)বেশিরভাগ ডেস্কটপ-ল্যাপটপ, অফিস, ব্যাংকের কাউন্টার, গেমিংডেস্কটপে সবচেয়ে প্রচলিত; Windows NT-এর ধারা ১৯৯৩ থেকে, আজকের Windows 10/11 তারই উত্তরসূরি
macOSXNU (Mach + BSD মিশ্রণ)MacBook, iMacUnix-এর ধারার, POSIX মান মেনে চলে; ২০০১ সালের Mac OS X থেকে এই ভিত্তি
LinuxLinux (monolithic, module-সহ)সার্ভার, cloud, সুপারকম্পিউটার, রাউটার, স্মার্ট টিভি, প্রোগ্রামারদের ল্যাপটপসার্ভার আর cloud-এ প্রধান; ২০১৭ সাল থেকে TOP500 তালিকার সব সুপারকম্পিউটারই Linux চালায়
AndroidLinux (Google-এর পরিবর্তনসহ)বেশিরভাগ স্মার্টফোন, ট্যাবলেট, অনেক টিভিবিশ্বে আর বাংলাদেশে স্মার্টফোনের বড় অংশ Android চালায় বলে বিভিন্ন জরিপে দেখা যায়
iOS / iPadOSXNU (macOS-এর মতোই)iPhone, iPadকড়া sandbox আর App Store নিয়ন্ত্রণ; কিছু দেশে স্মার্টফোনে বড় অংশ, বাংলাদেশে তুলনামূলক কম
Embedded ও RTOSFreeRTOS, Zephyr, VxWorks, embedded Linux…ওয়াশিং মেশিন, গাড়ির ECU, মেডিকেল যন্ত্র, স্মার্ট মিটার, IoT সেন্সরসংখ্যায় হয়তো সবচেয়ে বেশি, কিন্তু চোখে পড়ে না; লক্ষ্য গতি নয়, নিশ্চিত সময়সীমা

শেষ সারিটি আলাদা মনোযোগ দাবি করে। একটি RTOS (real-time operating system)-এর মূল প্রতিশ্রুতি “দ্রুত” নয়, “সময়মতো”. গাড়ির airbag-এর কন্ট্রোলার যদি বেশিরভাগ সময় ১ মিলিসেকেন্ডে সাড়া দেয় কিন্তু কখনো কখনো ২০০ মিলিসেকেন্ড নেয়, সেটি অচল। RTOS এমনভাবে নকশা করা যে সবচেয়ে খারাপ অবস্থাতেও সাড়া দেওয়ার একটি নির্দিষ্ট সীমা মানা হয়। এমন যন্ত্রকে বলে embedded system — যেখানে কম্পিউটারটি একটি বড় যন্ত্রের ভেতরে লুকানো। পর্ব ২০ আর ৫৪-এ এ নিয়ে বিস্তারিত।

Unix-এর জন্ম ১৯৬৯ সালে, AT&T-এর Bell Labs-এ, Ken Thompson আর Dennis Ritchie-এর হাতে; ১৯৭৩ সালে এটি C ভাষায় নতুন করে লেখা হয়, ফলে অন্য কম্পিউটারে নেওয়া সহজ হয়ে যায়। আজকের macOS, iOS সরাসরি Unix-এর ধারার (BSD হয়ে), আর Linux (১৯৯১, Linus Torvalds) Unix-এর নকশা অনুসরণ করে নতুন করে লেখা। অর্থাৎ আপনার পকেটের ফোন — Android হোক বা iPhone — দুটোই পঞ্চাশ বছরেরও বেশি পুরোনো একটি নকশার উত্তরসূরি। Windows NT-এর ধারা আলাদা; তার প্রধান স্থপতি ছিলেন Dave Cutler, যিনি আগে DEC-এর VMS OS-এ কাজ করেছিলেন।

৮ · AI-এর যুগে OS জানা কেন আরও জরুরি

“AI তো কোড লিখে দেয়, সার্ভারও নিজেই বানিয়ে দেয় — OS শিখে কী হবে?” প্রশ্নটি যৌক্তিক। কিন্তু AI-এর লেখা কোড শেষ পর্যন্ত চলে একটি OS-এর ওপর, আর সমস্যা হলে লক্ষণগুলো আসে OS-এর ভাষায়: Killed, Too many open files, Permission denied, Segmentation fault, CPU ১০০%, ডিস্ক ভরে যাওয়া। চারটি জায়গায় OS-জ্ঞান সরাসরি কাজে লাগে:

  • পারফরম্যান্স: প্রোগ্রাম ধীর কেন — CPU-র কাজ বেশি (user সময়), নাকি system call-এর ভিড় (sys), নাকি ডিস্ক বা নেটওয়ার্কের অপেক্ষা, নাকি RAM কম পড়ে swap হচ্ছে? উপরের ছোট পরীক্ষাতেই দেখলেন, এক বাইট করে পড়া কত ব্যয়বহুল। AI মডেল চালানোর সার্ভারেও GPU, মেমরি আর ডেটা লোডিংয়ের ভারসাম্য OS-এর বিষয়। (পর্ব ৫৭)
  • Debugging: Segmentation fault মানে kernel আপনার প্রসেসকে নিষিদ্ধ মেমরিতে হাত দেওয়ার জন্য থামিয়েছে; Killed লেখা দেখলে প্রায়ই মেমরি ফুরিয়ে OOM killer কাজ করেছে। লক্ষণ চিনলে আধা কাজ শেষ। (পর্ব ১৩, ৩৮)
  • Container আর cloud: Docker container কোনো জাদু নয় — Linux kernel-এর namespace আর cgroup সুবিধা দিয়ে একটি প্রসেসকে আলাদা করে রাখা। তাই container-এর ভেতরে nproc বা মেমরির সীমা বাইরের থেকে আলাদা হতে পারে, যা উপরের পরীক্ষায় দেখলেন। (পর্ব ৫০–৫২)
  • নিরাপত্তা: কোন প্রোগ্রাম কোন ফাইল পড়তে পারে, কেন chmod 777 বিপজ্জনক, কেন সব কিছু sudo দিয়ে চালানো ঠিক নয় — এগুলো OS-এর protection ব্যবস্থা বোঝার প্রশ্ন। (মডিউল ৭)

OS-এর প্রশ্নে AI সাধারণত যেসব ভুল করে

AI-এর ভুলউদাহরণকীভাবে ধরবেন
ভুল OS বা distribution-এর কমান্ডআপনি Windows-এ, AI দিল apt install; Fedora-তে দিল Ubuntu-র কমান্ডপ্রশ্নের শুরুতেই OS, version আর shell লিখে দিন; কমান্ড চালানোর আগে man বা --help দেখুন
পুরোনো তথ্যপুরোনো kernel-এর scheduler বা পুরোনো টুলের কথা বর্তমান হিসেবে বলাuname -r দেখে নিজের kernel-এর ডকুমেন্টেশন মিলিয়ে নিন
অনিরাপদ “সমাধান”Permission denied এলেই chmod 777 বা সব কিছু sudo দিয়েজিজ্ঞেস করুন “সবচেয়ে কম অনুমতিতে কীভাবে হয়?” — কে মালিক, কার কী দরকার বুঝে নিন
“আমার মেশিনে চলে” ধরনের concurrent কোডথ্রেডের কোড একবার চালিয়ে ঠিক দেখায়, ভারে ভুল ফল দেয়বহুবার, বেশি থ্রেডে, ভারী ভারে চালান (মডিউল ৪)
ভুল সংখ্যা-হিসাবscheduling-এর waiting time বা page fault-এর সংখ্যা ভুলহাতে Gantt chart বা frame-এর টেবিল এঁকে মিলিয়ে নিন

সিস্টেমের সমস্যা নিয়ে AI-কে প্রশ্ন করার সময় পরিবেশ আর লক্ষণ — দুটোই নির্দিষ্ট করে দিন, আর যাচাইয়ের উপায় চেয়ে নিন:

আমার সার্ভার Ubuntu 24.04, kernel 6.8 (uname -r দেখে নিয়েছি), 2 CPU core, 4 GB RAM. একটি Python ওয়েব অ্যাপ মাঝে মাঝে হঠাৎ বন্ধ হয়ে যায়, লগে শুধু "Killed" লেখা আসে। ১. সম্ভাব্য কারণগুলো সম্ভাবনার ক্রমে বলো, আর প্রতিটির পেছনে OS-এর কোন ব্যবস্থা কাজ করছে তা সহজ বাংলায় বোঝাও। ২. প্রতিটি কারণ যাচাই করার জন্য শুধু পড়ার (read-only) কমান্ড দাও — কোনো কিছু বদলাবে না, আর কোনো কমান্ডে sudo লাগলে আলাদা করে জানাবে। ৩. প্রতিটি কমান্ডের আউটপুটে ঠিক কী দেখলে কারণটি নিশ্চিত হবে, সেটা বলো। ৪. chmod 777 বা নিরাপত্তা কমায় এমন কোনো সমাধান দেবে না।

AI-এর দেওয়া সিস্টেম-কমান্ড চালানোর আগে — চেকলিস্ট

পরীক্ষা ও ইন্টারভিউতে এই বিষয়ে প্রায়ই যা জিজ্ঞেস করা হয়:

  • অপারেটিং সিস্টেম কী? প্রধান কাজগুলো লিখুন। — হার্ডওয়্যার আর ব্যবহারকারীর মাঝের সফটওয়্যার, যা সম্পদ ভাগ করে আর সহজ সেবা দেয়; কাজ: process, memory, file, I/O, protection, networking, UI.
  • Kernel আর shell-এর পার্থক্য? — kernel পূর্ণ ক্ষমতায় চলা OS-এর কেন্দ্র; shell হলো user mode-এর একটি প্রোগ্রাম, যা কমান্ড পড়ে kernel-কে system call দিয়ে কাজ করায়।
  • User mode আর kernel mode কেন দরকার? — যাতে সাধারণ প্রোগ্রাম হার্ডওয়্যার বা অন্যের মেমরিতে সরাসরি হাত দিতে না পারে; ভুল বা ক্ষতিকর অ্যাপ একাই পুরো সিস্টেম ফেলতে না পারে।
  • Interrupt কী, polling থেকে কেন ভালো? — ডিভাইস নিজে CPU-কে সংকেত দেয়, তাই CPU বারবার জিজ্ঞেস করে সময় নষ্ট করে না।
  • Resource manager আর extended machine — দুই দৃষ্টিভঙ্গি ব্যাখ্যা করুন। — নিচ থেকে OS সম্পদ ভাগ করে; ওপর থেকে OS জটিল হার্ডওয়্যারকে ফাইল-প্রসেসের মতো সহজ abstraction-এ লুকায়।

৯ · সামনের পথ — ৬৪ পর্ব, ১০টি মডিউল

এই কোর্স সাজানো হয়েছে ঠিক এই পর্বের কাজের তালিকা ধরে। শুরু হবে ভিত্তি দিয়ে, তারপর OS-এর প্রতিটি বড় দায়িত্ব আলাদা মডিউলে, আর শেষে বাস্তব OS আর পরীক্ষা-ইন্টারভিউর প্রস্তুতি।

মডিউলপর্বযা শিখবেন
১ · অপারেটিং সিস্টেমের ভিত্তি০১–০৭OS কী, ইতিহাস ও ধরন, Linux টার্মিনাল, OS-এর চোখে হার্ডওয়্যার, system call, OS-এর গঠন, বুট প্রক্রিয়া
২ · প্রসেস ও থ্রেড০৮–১৫প্রসেসের state আর PCB, context switch, fork/exec/wait, shell আর job control, IPC, signal, থ্রেড, POSIX thread
৩ · CPU শিডিউলিং১৬–২১FCFS, SJF, SRTF, priority, Round Robin, MLFQ, multiprocessor ও real-time, Linux-এর scheduler
৪ · কনকারেন্সি ও সিনক্রোনাইজেশন২২–২৯race condition, Peterson, atomic আর spinlock, mutex, semaphore, monitor, ক্লাসিক সমস্যা, deadlock, Banker's algorithm
৫ · মেমরি ম্যানেজমেন্ট৩০–৩৮address binding, fragmentation, paging, TLB, segmentation, virtual memory, page replacement, thrashing, Linux-এর মেমরি
৬ · I/O, স্টোরেজ ও ফাইল সিস্টেম৩৯–৪৫DMA আর driver, disk scheduling, file descriptor, directory আর VFS, inode, journaling, RAID
৭ · সুরক্ষা ও নিরাপত্তা৪৬–৪৯access matrix, ACL, Linux permission, privilege ring, sandbox, SELinux, secure boot
৮ · ভার্চুয়ালাইজেশন, কনটেইনার ও আধুনিক OS৫০–৫৪hypervisor, namespace আর cgroup, serverless, distributed system, মোবাইল আর RTOS
৯ · বাস্তব OS ও ক্যাপস্টোন৫৫–৫৯Linux kernel আর eBPF, Windows-এর ভেতর, পারফরম্যান্স তদন্ত, xv6, নিজের shell-scheduler-allocator
১০ · পরীক্ষা ও ইন্টারভিউ প্রস্তুতি৬০–৬৪numerical সমস্যা, MCQ, লিখিত ও ভাইভা, OS ইন্টারভিউ, systems কোডিং

কীভাবে পড়বেন? একেবারে নতুন হলে ক্রম ধরে এগোন, প্রতিটি পর্বের ডায়াগ্রামগুলো নিজে চালিয়ে দেখুন — তত্ত্বের অংশ প্রথমবার পুরো না বুঝলেও ক্ষতি নেই। বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষার প্রস্তুতি নিলে মডিউল ৩, ৪, ৫-এর numerical আর প্রমাণগুলো খাতায় হাতে করুন, আর মডিউল ১০ দিয়ে যাচাই করুন। পেশাদার ডেভেলপার বা DevOps প্রকৌশলী হলে “আরও গভীরে” বাক্সগুলো আর মডিউল ৮–৯ আপনার জন্য বিশেষভাবে কাজের।

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

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন। প্রতিটির পেছনে আছে OS-এর ইতিহাসের একটি সত্যিকারের মোড়।

প্র ০১প্রথম দিকের কম্পিউটারে কোনো OS ছিল না। তাহলে প্রথম OS তৈরির তাগিদ এলো কোথা থেকে?

১৯৫০-এর দশকের শুরুতে একটি কম্পিউটার মানে একটি পুরো ঘর ভরা যন্ত্র, আর তার দাম ছিল বিপুল। প্রোগ্রামার নিজের পালায় যন্ত্রটি “বুক” করতেন, পাঞ্চ কার্ডে প্রোগ্রাম ঢোকাতেন, সুইচ টিপে চালাতেন, ফল নিতেন, তারপর পরের জন এসে আবার সব শুরু থেকে প্রস্তুত করতেন। এক কাজ থেকে আরেক কাজে যাওয়ার এই প্রস্তুতিতে দামি যন্ত্রটি অনেক সময় কিছুই না করে বসে থাকত।

এই অপচয় কমানোর চেষ্টা থেকেই প্রথম দিকের OS-গুলোর জন্ম। সাধারণভাবে প্রথম দিকের OS হিসেবে যাকে ধরা হয়, সেই GM-NAA I/O তৈরি হয় ১৯৫৬ সালের দিকে, General Motors-এর গবেষণা বিভাগ আর North American Aviation-এর যৌথ উদ্যোগে, IBM 704 কম্পিউটারের জন্য। এর মূল কাজ ছিল batch processing: অনেকগুলো কাজ একসাথে সারি করে রাখা, একটি শেষ হলেই মানুষের হাত ছাড়াই পরেরটি চালানো, আর ইনপুট-আউটপুটের সাধারণ রুটিনগুলো সবার জন্য একবার লিখে রাখা।

এখানে এই পর্বের দুই দৃষ্টিভঙ্গিই দেখা যায়। প্রথমত, resource manager — দামি CPU-র অলস সময় কমানো। দ্বিতীয়ত, extended machine — প্রতিটি প্রোগ্রামারকে টেপ বা কার্ড-রিডারের খুঁটিনাটি নিজে না লিখে একটি সাধারণ I/O রুটিন ডাকার সুযোগ। পরে দেখা গেল, একটি কাজ টেপের অপেক্ষায় থাকলে CPU তখনো বসে থাকে; এর সমাধান হলো একসাথে কয়েকটি কাজ মেমরিতে রাখা — multiprogramming — যাতে একজন অপেক্ষা করলে আরেকজন CPU পায়। সেখান থেকে এলো time-sharing, যেখানে অনেক মানুষ টার্মিনালে বসে একই কম্পিউটার ভাগ করে ব্যবহার করতেন। আজকের ফোনের multitasking সেই ধারারই উত্তরসূরি।

আরেকটি বিষয় লক্ষ করার মতো: প্রথম OS কোনো কম্পিউটার কোম্পানি নয়, কম্পিউটারের ব্যবহারকারীরা বানিয়েছিলেন — কারণ অপচয়ের কষ্টটা তাঁরাই সবচেয়ে বেশি টের পেতেন। (এই ইতিহাসের বিস্তারিত পর্ব ২-এ।)

মূল উপলব্ধি: OS-এর জন্ম হয়েছিল একটি অর্থনৈতিক প্রশ্ন থেকে — দামি সম্পদ যেন অলস না থাকে। আজও OS-এর প্রায় প্রতিটি নকশা-সিদ্ধান্তের পেছনে সেই একই প্রশ্ন: সীমিত সম্পদ থেকে সবচেয়ে বেশি কাজ কীভাবে আদায় করা যায়, ন্যায্যভাবে।

প্র ০২IBM-এর OS/360 এক OS দিয়ে পুরো একটি কম্পিউটার পরিবার চালাতে চেয়েছিল। এই প্রকল্প থেকে সফটওয়্যার প্রকৌশল কী শিখল?

১৯৬৪ সালে IBM ঘোষণা করে System/360 — ছোট থেকে বড়, অনেকগুলো মডেলের একটি কম্পিউটার পরিবার, যাদের নির্দেশের ভাষা একই। এর আগে প্রায় প্রতিটি নতুন কম্পিউটারের জন্য সফটওয়্যার নতুন করে লিখতে হতো। IBM-এর স্বপ্ন ছিল একটি OS — OS/360 — যা পরিবারের সব মডেলে চলবে; গ্রাহক ছোট মডেল কিনে পরে বড় মডেলে গেলেও তাঁর প্রোগ্রাম চলবে।

ধারণাটি যুগান্তকারী ছিল, কিন্তু বাস্তবায়ন হয়ে উঠল তখনকার সবচেয়ে বড় সফটওয়্যার প্রকল্পগুলোর একটি। OS/360 দেরিতে আসে, বাজেট ছাড়িয়ে যায়, আর প্রথম দিকের সংস্করণে বাগ ছিল প্রচুর। এর ব্যবস্থাপক Fred Brooks পরে এই অভিজ্ঞতা নিয়ে লেখেন বিখ্যাত বই The Mythical Man-Month (১৯৭৫)। সেখানকার সবচেয়ে পরিচিত কথাটি “Brooks's law” নামে পরিচিত: দেরিতে চলা সফটওয়্যার প্রকল্পে বাড়তি লোক যোগ করলে প্রকল্প আরও দেরি হয় — কারণ নতুনদের শেখাতে সময় লাগে, আর মানুষ বাড়লে নিজেদের মধ্যে সমন্বয়ের পথ দ্রুত বাড়ে।

OS-এর দিক থেকে শিক্ষাটি গভীর। OS/360-কে একসাথে ছোট আর বড় মেশিন, batch আর নানা ধরনের কাজ — সবার চাহিদা মেটাতে হচ্ছিল। যত বেশি বৈশিষ্ট্য, তত বেশি জিনিস একে অপরের সাথে জড়িয়ে যায়; একটি অংশ বদলালে অন্য কোথাও ভাঙে। তবু সাফল্যও কম নয়: “একই interface, ভিন্ন হার্ডওয়্যার” ধারণাটি — যা আসলে extended machine দৃষ্টিভঙ্গির বাণিজ্যিক রূপ — পরের সব OS-এর ভিত্তি হয়ে যায়, আর System/360-এর উত্তরসূরি mainframe আজও বিভিন্ন বড় প্রতিষ্ঠানের কাজে চলে।

পরের প্রজন্ম এই জটিলতার প্রতিক্রিয়ায় ভিন্ন পথ ধরল — Unix-এর নির্মাতারা ইচ্ছে করে ছোট, সরল নকশা বেছে নিলেন (পরের প্রশ্ন)। OS-এর গঠন নিয়ে monolithic বনাম microkernel বিতর্কও (পর্ব ৬) আসলে এই একই প্রশ্নের ধারাবাহিকতা: জটিলতাকে কীভাবে ভাগ করে বশে রাখা যায়।

মূল উপলব্ধি: OS হলো মানুষের লেখা সবচেয়ে জটিল সফটওয়্যারগুলোর একটি। এর নকশায় প্রযুক্তির মতোই গুরুত্বপূর্ণ জটিলতা নিয়ন্ত্রণ — স্পষ্ট স্তর, ছোট interface আর কম জড়াজড়ি।

প্র ০৩১৯৬৯ সালের Unix-এর কোন ধারণাগুলো এত শক্তিশালী যে আজকের Linux, macOS আর Android-এও সেগুলো টিকে আছে?

১৯৬০-এর দশকে MIT, General Electric আর Bell Labs মিলে Multics নামে একটি উচ্চাভিলাষী time-sharing OS বানাচ্ছিল। প্রকল্পটি বড় আর ধীরগতির হয়ে ওঠায় ১৯৬৯ সালে Bell Labs সরে আসে। সেখানকার Ken Thompson একটি অব্যবহৃত PDP-7 কম্পিউটারে অনেক ছোট একটি OS লিখতে শুরু করেন, সাথে ছিলেন Dennis Ritchie; এটিই Unix. ১৯৭৩ সালে Unix প্রায় পুরোটাই C ভাষায় নতুন করে লেখা হয়, যা তখনকার জন্য সাহসী সিদ্ধান্ত — OS সাধারণত লেখা হতো assembly-তে।

কয়েকটি ধারণা Unix-কে দীর্ঘজীবী করেছে:

  • প্রায় সবকিছুই ফাইল: সাধারণ ফাইল, ডিভাইস, pipe — সবই একই open/read/write/close দিয়ে চলে। উপরের /proc/meminfo সেই ধারণারই আধুনিক রূপ।
  • ছোট টুল, pipe দিয়ে জোড়া: প্রতিটি প্রোগ্রাম একটি কাজ ভালোভাবে করে; ps | wc -l-এর মতো জোড়া দিয়ে বড় কাজ।
  • Shell একটি সাধারণ প্রোগ্রাম: kernel-এর অংশ নয়, তাই বদলানো যায়।
  • fork আর exec: প্রসেস তৈরির সরল দুই-ধাপ মডেল (পর্ব ১০)।
  • বহনযোগ্যতা: C-তে লেখা বলে নতুন হার্ডওয়্যারে নেওয়া সহজ।

Unix-এর সোর্স কোড তখন বিশ্ববিদ্যালয়গুলোতে বিতরণ করা হতো; University of California, Berkeley সেখান থেকে বানায় BSD, যার উত্তরসূরি আজকের FreeBSD আর macOS-এর একটি বড় অংশ। এর বাইরে Unix-এর interface মানসম্মত হয় POSIX নামে, যাতে বিভিন্ন Unix-ধাঁচের OS-এ একই প্রোগ্রাম চলে — উপরের C প্রোগ্রামটি এজন্যই Linux আর macOS দুটোতেই চলে। Linux কোনো Unix কোড থেকে আসেনি, কিন্তু একই নকশা আর POSIX অনুসরণ করে।

মূল উপলব্ধি: Unix টিকে আছে বৈশিষ্ট্যের প্রাচুর্যে নয়, কয়েকটি সরল ও সাধারণ abstraction-এর জোরে। ভালো abstraction পঞ্চাশ বছর পরেও কাজে লাগে; জটিল বৈশিষ্ট্য দ্রুত পুরোনো হয়।

প্র ০৪MS-DOS-এ যেকোনো প্রোগ্রাম পুরো কম্পিউটার “হ্যাং” করে দিতে পারত। আধুনিক Windows-এ সাধারণত তা হয় না কেন?

১৯৮১ সালে IBM PC বাজারে আসে, সাথে Microsoft-এর MS-DOS (IBM-এর সংস্করণের নাম PC DOS). Microsoft এর ভিত্তি কিনেছিল Seattle Computer Products-এর 86-DOS থেকে। MS-DOS ছিল খুব সরল: একসাথে মূলত একটি প্রোগ্রাম চলত, আর তখনকার Intel 8086/8088 CPU-তে user mode আর kernel mode-এর মতো কোনো সুরক্ষা ছিল না।

ফলাফল? যেকোনো প্রোগ্রাম মেমরির যেকোনো জায়গায় লিখতে পারত — OS-এর নিজের অংশেও। সরাসরি হার্ডওয়্যারে হাত দিত; গেমগুলো গতির জন্য সরাসরি ভিডিও মেমরিতে লিখত। একটি বাগওয়ালা প্রোগ্রাম পুরো কম্পিউটার আটকে দিতে পারত, আর ভাইরাস সহজেই OS-এর অংশ বদলে দিতে পারত। কম্পিউটার ছিল এক ব্যবহারকারীর ব্যক্তিগত যন্ত্র, তাই নকশাকারীরা গতি আর সরলতাকে বেশি গুরুত্ব দিয়েছিলেন।

পরিবর্তন এলো দুই দিক থেকে। হার্ডওয়্যারে Intel 80286 আর বিশেষ করে 80386 CPU-তে “protected mode” এলো — privilege level আর মেমরি সুরক্ষার হার্ডওয়্যার সমর্থন। সফটওয়্যারে Microsoft Dave Cutler-এর নেতৃত্বে শূন্য থেকে বানাল Windows NT (প্রথম সংস্করণ ১৯৯৩), যেখানে প্রতিটি প্রসেসের নিজস্ব মেমরি, kernel mode আর user mode-এর কড়া ভাগ। Windows 95/98 তখনো DOS-এর উত্তরাধিকার বহন করত, তাই সেগুলো তুলনামূলকভাবে অস্থির ছিল; Windows XP (২০০১) থেকে সাধারণ ব্যবহারকারীর Windows-ও NT ভিত্তিতে চলে আসে।

আজ একটি অ্যাপ ভুল মেমরিতে হাত দিলে CPU exception তোলে, kernel শুধু সেই প্রসেসটি বন্ধ করে — “এই অ্যাপটি কাজ করা বন্ধ করেছে”. তবে kernel mode-এর কোডে, যেমন একটি ত্রুটিপূর্ণ driver-এ, ভুল হলে এখনো পুরো সিস্টেম পড়ে যেতে পারে — Windows-এ যাকে বলে Blue Screen. সুরক্ষার সীমারেখা তাই ঠিক user আর kernel-এর মাঝখানে।

মূল উপলব্ধি: নির্ভরযোগ্যতা আর নিরাপত্তা শুধু সফটওয়্যারের গুণ নয় — এর জন্য হার্ডওয়্যারের সাহায্য (privilege mode, মেমরি সুরক্ষা) আর OS-এর সঠিক ব্যবহার, দুটোই লাগে। পর্ব ৫ আর ৪৮-এ এর কারিগরি দেখবেন।

প্র ০৫“Linux একটি OS” — কথাটি কতটা ঠিক? একই Linux kernel কীভাবে একটি সুপারকম্পিউটার আর একটি Android ফোন দুটোই চালায়?

১৯৯১ সালের আগস্টে ফিনল্যান্ডের ছাত্র Linus Torvalds comp.os.minix নিউজগ্রুপে লেখেন যে তিনি 386 কম্পিউটারের জন্য একটি ফ্রি OS বানাচ্ছেন — “শুধু শখের বশে, GNU-র মতো বড় আর পেশাদার কিছু হবে না”. সেই বছরের সেপ্টেম্বরে প্রথম সংস্করণ (0.01) প্রকাশিত হয়। পরে এটি GPL লাইসেন্সে আসে, আর সারা বিশ্বের প্রোগ্রামার ও কোম্পানি এতে কোড যোগ করতে থাকে।

কিন্তু Torvalds যা লিখেছিলেন তা ছিল kernel. একটি ব্যবহারযোগ্য সিস্টেমে লাগে compiler, shell, C library, টুল — যার বড় অংশ এসেছিল Richard Stallman-এর GNU প্রকল্প থেকে। এজন্য অনেকে ডেস্কটপ-সার্ভারের সিস্টেমকে “GNU/Linux” বলার পক্ষে। এই নামের বিতর্ক আসলে এই পর্বের সংকীর্ণ বনাম প্রশস্ত অর্থের OS-এর পার্থক্যেরই উদাহরণ।

Android দেখায় একই kernel-এর ওপর কত ভিন্ন জিনিস দাঁড়াতে পারে। Android Inc. প্রতিষ্ঠিত হয় ২০০৩ সালে, Google কিনে নেয় ২০০৫ সালে, আর প্রথম বাণিজ্যিক Android ফোন (HTC Dream, অনেক দেশে T-Mobile G1 নামে) আসে ২০০৮ সালে। এর kernel Linux, কিন্তু ওপরে GNU টুল বা সাধারণ ডেস্কটপ নেই; আছে Google-এর নিজস্ব C library (Bionic), ART runtime, Binder IPC আর Zygote. একই kernel একটি সুপারকম্পিউটারে হাজার হাজার core আর টেরাবাইট মেমরি সামলায়, আবার ফোনে ব্যাটারি বাঁচাতে ব্যস্ত। এটি সম্ভব কারণ kernel হার্ডওয়্যার-নির্ভর অংশ (driver, architecture কোড) আর সাধারণ অংশ (scheduler, memory manager) আলাদা রাখে, আর build-এর সময় কোন অংশ লাগবে তা বেছে নেওয়া যায়।

মূল উপলব্ধি: “OS” একটি স্তরবিন্যাস — kernel নিচে, ওপরে library, service আর UI. Kernel একই রেখে ওপরের স্তর বদলালে সম্পূর্ণ ভিন্ন অভিজ্ঞতা তৈরি হয়। তাই কাউকে “আমার OS কোনটা” জিজ্ঞেস করলে আসলে দুটি প্রশ্ন: kernel কী, আর তার ওপরে কী।

অনুশীলন

খাতা-কলম নিন — একটি হিসাব, একটি অনুমান, একটি কমান্ড আর একটি পর্যবেক্ষণ।

  1. হিসাব করুন (resource manager): (ক) একটি ফোনে RAM 4 GB. OS আর তার service নিয়েছে 1.2 GB; চালু আছে Facebook (1.0 GB), bKash (0.4 GB) আর Camera (0.9 GB). এখন একটি গেম 1.0 GB চাইছে। ফাঁকা RAM কত, আর OS-কে অন্তত কত মেমরি খালি করতে হবে? (খ) একটি CPU core-এ তিনটি প্রোগ্রাম সবসময় চলতে প্রস্তুত। OS প্রত্যেককে 10 ms করে পালা দেয়, আর প্রতিটি context switch-এ 0.5 ms খরচ হয়। এক সেকেন্ডে CPU-র কত শতাংশ সময় আসল কাজে যায়, আর প্রতিটি প্রোগ্রাম মোটামুটি কত ms পায়?

    (ক) ব্যবহৃত = 1.2 + 1.0 + 0.4 + 0.9 = 3.5 GB; ফাঁকা = 4.0 − 3.5 = 0.5 GB. গেমের চাই 1.0 GB, তাই ঘাটতি 1.0 − 0.5 = অন্তত 0.5 GB. কীভাবে খালি হবে, তা OS-ভেদে আলাদা: ডেস্কটপ Linux বা Windows সাধারণত কম ব্যবহৃত মেমরি ডিস্কের swap বা pagefile-এ সরায়; Android সাধারণত মেমরি সংকুচিত করে, আর তাতেও না হলে পেছনের কোনো অ্যাপ (যেমন Camera) বন্ধ করে দেয় — পরে খুললে সেটি আবার শুরু থেকে আসে।

    (খ) প্রতিটি চক্রে 10 ms কাজ + 0.5 ms switch = 10.5 ms. কাজের ভাগ = 10 ÷ 10.5 ≈ 95.2%. এক সেকেন্ডে কাজের সময় ≈ 1000 × 10 ÷ 10.5 ≈ 952.4 ms, তিনজনে ভাগ করে প্রত্যেকে ≈ 317 ms. Slice ছোট করলে (ধরুন 1 ms) প্রোগ্রামগুলো দ্রুত সাড়া দেয়, কিন্তু কাজের ভাগ নেমে আসে 1 ÷ 1.5 ≈ 66.7%-এ — এই টানাপোড়েন পর্ব ১৮-এর Round Robin-এর মূল প্রশ্ন।

  2. অনুমান করুন — kernel লাগবে কি না: একটি C প্রোগ্রামের নিচের কাজগুলোর কোনটিতে kernel mode-এ যেতে হয় (system call), কোনটিতে হয় না? (ক) x = a * b + c; (খ) sqrt(2.0) (গ) getpid() (ঘ) fopen("marks.txt", "r") (ঙ) malloc(16) (চ) printf("hi\n")
    • (ক) না — শুধু CPU-র হিসাব, user mode-এই হয়।
    • (খ) না — গাণিতিক library ফাংশন; CPU-র নির্দেশেই হিসাব।
    • (গ) হ্যাঁ — প্রসেসের পরিচয় kernel-এর খাতায় থাকে।
    • (ঘ) হ্যাঁ — ফাইল খুলতে open system call লাগে; অনুমতিও তখনই যাচাই হয়।
    • (ঙ) সাধারণত না — malloc আগে থেকে নেওয়া মেমরির ভাণ্ডার থেকে দেয়; ভাণ্ডার ফুরালে তবেই brk বা mmap system call (পর্ব ৩৮)।
    • (চ) সবসময় সাথে সাথে নয় — printf লেখা buffer-এ জমায়; buffer ভরলে, নতুন লাইন এলে (টার্মিনালে) বা প্রোগ্রাম শেষে একবারে write system call হয়। উপরের ask_os.c-এ ঠিক এটিই দেখেছেন।

    শিক্ষা: “library ফাংশন” আর “system call” এক জিনিস নয়। কিছু library ফাংশন কখনো kernel-এ যায় না, কিছু সবসময় যায়, কিছু মাঝে মাঝে।

  3. কমান্ড লিখুন: একটি Linux সার্ভারে (ক) kernel version, (খ) CPU core-এর সংখ্যা আর (গ) সবচেয়ে বেশি RAM নেওয়া ৫টি প্রসেস দেখার কমান্ড লিখুন। তারপর (গ)-এর সমতুল্য Windows PowerShell কমান্ড লিখুন।
    uname -r
    nproc
    ps -eo pid,comm,rss --sort=-rss | head -n 6    # প্রথম লাইনটি শিরোনাম

    rss মানে প্রসেসটির এই মুহূর্তে RAM-এ থাকা অংশ (KB এককে)। --sort=-rss-এর বিয়োগচিহ্ন মানে বড় থেকে ছোট। Windows PowerShell-এ:

    Get-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 5 Name, Id, WorkingSet64

    দুটি কমান্ডই শুধু পড়ে, কিছু বদলায় না — নিরাপদ। খেয়াল করুন, একই প্রশ্নের উত্তর দুই OS-এ সম্পূর্ণ ভিন্ন কমান্ডে; AI-কে OS না বললে ভুলটা এখানেই হয়।

  4. পর্যবেক্ষণ করুন: নিজের কম্পিউটারে সব অ্যাপ বন্ধ করে Task Manager (Windows: Ctrl+Shift+Esc), Activity Monitor (macOS) বা টার্মিনালে ps -e | wc -l (Linux) খুলুন। কিছু না খুলেও কতগুলো প্রসেস চলছে? যেকোনো দুটির নাম খুঁজে বের করুন তারা কী করে।

    সাধারণত কয়েক ডজন থেকে কয়েকশো প্রসেস পাবেন — সংখ্যাটি OS, version আর ইনস্টল করা সফটওয়্যারভেদে অনেক আলাদা। এগুলো OS-এর প্রশস্ত অংশ: পেছনের service. কয়েকটি পরিচিত নাম: Windows-এ explorer.exe (ডেস্কটপ আর taskbar — অর্থাৎ GUI shell), svchost.exe (অনেক Windows service-এর আশ্রয়), System (kernel-এর কাজের প্রতিনিধি); macOS-এ launchd (প্রথম প্রসেস, বাকিদের চালু করে), WindowServer (পর্দা আঁকা); Linux-এ systemd (PID 1), sshd (দূর থেকে লগইন)। শিক্ষা: “কিছু চলছে না” অবস্থাতেও OS অনেক কাজ করছে, আর প্রতিটি কাজ একটি আলাদা প্রসেস — যাতে একটির ত্রুটি অন্যটিকে না ফেলে।

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

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

ক্রমকি-বোর্ডে একটি অক্ষর চাপা থেকে প্রোগ্রামের অক্ষর পাওয়া পর্যন্ত ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. ⌨️ ব্যবহারকারী কি চাপলেন, কি-বোর্ড interrupt সংকেত পাঠাল
  2. ⚡ CPU চলতি নির্দেশ শেষ করে চলমান প্রোগ্রামের state সংরক্ষণ করল
  3. 🧠 CPU kernel mode-এ গিয়ে interrupt handler-এ লাফ দিল
  4. 🛠️ Driver অক্ষরটি পড়ে buffer-এ রাখল, অপেক্ষারত প্রোগ্রামকে ready করল
  5. 📝 Kernel user mode-এ ফিরল, প্রোগ্রাম অক্ষরটি পেল

অপারেটিং সিস্টেমকে “extended machine” বলা হয় কেন?

  • কারণ OS সীমিত CPU আর মেমরি অনেক প্রোগ্রামের মধ্যে ভাগ করে
  • কারণ OS জটিল হার্ডওয়্যারের ওপর ফাইল, প্রসেস আর socket-এর মতো সহজ abstraction দেয়
  • কারণ OS কম্পিউটারের CPU-র গতি বাড়িয়ে দেয়
  • কারণ OS কম্পিউটারে বাড়তি RAM যোগ করে

একটি সাধারণ Linux ডেস্কটপে নিচের কোনটি সাধারণত kernel mode-এ চলে?

  • Chrome browser
  • bash shell
  • Wi-Fi কার্ডের device driver
  • ফাইল ম্যানেজার (যেমন Nautilus)

Interrupt-এর সবচেয়ে সঠিক বর্ণনা কোনটি?

  • একটি হার্ডওয়্যার সংকেত, যা CPU-কে চলতি কাজ থামিয়ে kernel-এর নির্দিষ্ট handler চালাতে বাধ্য করে
  • CPU বারবার ডিভাইসকে জিজ্ঞেস করা, “নতুন কিছু আছে?”
  • একটি প্রোগ্রামের ইচ্ছাকৃত অনুরোধ, “এই ফাইলটি খোলো”
  • ব্যবহারকারী জোর করে কোনো প্রোগ্রাম বন্ধ করা

Shell (যেমন bash বা PowerShell) সম্পর্কে কোন কথাটি সঠিক?

  • Shell হলো kernel-এর সবচেয়ে গুরুত্বপূর্ণ অংশ
  • Shell kernel mode-এ চলে বলে সরাসরি হার্ডওয়্যার নিয়ন্ত্রণ করে
  • Shell শুধু Linux-এ থাকে, Windows-এ নেই
  • Shell একটি user-mode প্রোগ্রাম, যা কমান্ড পড়ে system call দিয়ে kernel-কে কাজ করায়

একটি CPU core-এ OS প্রতিটি প্রোগ্রামকে 10 ms করে পালা দেয়, আর প্রতিটি context switch-এ 2 ms খরচ হয়। CPU-র সময়ের কত অংশ আসল কাজে যায়?

  • 100%
  • প্রায় 83.3%
  • 80%
  • 20%

Android ফোনের kernel কোনটি?

  • XNU
  • Windows NT kernel
  • Linux kernel (Google-এর পরিবর্তনসহ)
  • FreeRTOS

শব্দকোষ

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

মনে রাখুন

  1. OS-কে দুইভাবে দেখুন: নিচ থেকে resource manager (CPU, মেমরি, ডিভাইস ভাগ করে), ওপর থেকে extended machine (ফাইল, প্রসেস, socket-এর মতো সহজ abstraction).
  2. স্তরগুলো: হার্ডওয়্যার → kernel → library ও service → অ্যাপ; অ্যাপ কখনো সরাসরি হার্ডওয়্যারে হাত দেয় না।
  3. অ্যাপ চলে user mode-এ, kernel চলে kernel mode-এ; মাঝের দরজা system call, আর kernel-এ ঢোকার বাকি দুই পথ interrupt ও exception.
  4. Shell আর GUI kernel নয় — এগুলো user mode-এর প্রোগ্রাম; একই kernel-এর ওপর ভিন্ন shell, ভিন্ন GUI, এমনকি Android আর সুপারকম্পিউটার দাঁড়াতে পারে।
  5. OS-এর সাত দায়িত্ব: process, memory, file, I/O, protection, networking, UI — আর AI-এর দেওয়া সিস্টেম-কমান্ড সবসময় নিজের OS আর version-এর সাথে মিলিয়ে যাচাই করুন।

পরের পর্বে: ঘরভর্তি যন্ত্রের batch কাজ থেকে time-sharing, ব্যক্তিগত কম্পিউটার, মোবাইল আর ক্লাউড — OS কীভাবে এই পথ পাড়ি দিল, আর আজ কত রকম OS আছে।

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

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