সিরিজ: কম্পিউটার এক্সিকিউশন মডেল (Thread)

“Thread: একই প্রসেসে বহু হাত, একসাথে অনেক কাজ”
আপনি যখন আপনার কম্পিউটারে কোনো সফটওয়্যার চালান—ধরুন একটি ব্রাউজার, তখন আপনি লক্ষ্য করবেন সেখানে একাধিক ট্যাব খোলা, একটি পেজ লোড হচ্ছে, অন্যদিকে ভিডিও চালছে, আবার অন্য ট্যাবে টাইপ করছেন। এখন প্রশ্ন হচ্ছে—এই সমস্ত কাজ কীভাবে একসাথে চলছে, যখন এটি একটি মাত্র সফটওয়্যার?
এর উত্তর লুকিয়ে আছে Thread নামক একটি শক্তিশালী ধারণার মধ্যে।
Thread কী?
একটি Thread হলো একটি প্রসেসের ভেতরের সবচেয়ে ছোট এক্সিকিউশন ইউনিট।
যেমন:
একটি Process হচ্ছে একটি অফিস—পুরো অফিস একটি স্বাধীন প্রতিষ্ঠান (যেমন একটি সফটওয়্যার)। আর Thread হচ্ছে সেই অফিসের ভিতরে কাজ করা বিভিন্ন কর্মচারী, যারা একসাথে আলাদা আলাদা কাজ করছে—কিন্তু সবার লক্ষ্য একটাই: অফিসের উদ্দেশ্য পূরণ।
প্রসেসের মতো Thread নিজে থেকে সম্পূর্ণ স্বাধীন নয়, তবে সে প্রসেসের মেমোরি, কোড ও রিসোর্স শেয়ার করে এবং আলাদা রেজিস্টার, স্ট্যাক ইত্যাদি ব্যবহার করে কাজ চালিয়ে যায়।
কেন Thread প্রয়োজন?
ধরুন আপনি একটি ভিডিও প্লেয়ার অ্যাপ বানাচ্ছেন। সেই অ্যাপে তিনটি কাজ রয়েছে:
ভিডিও ডিকোড হচ্ছে
ইউজার প্লে/পজ বাটন চাপছে
সাউন্ড আউটপুট হচ্ছে
এই তিনটি কাজ যদি একটার পর একটা করা হয়, তাহলে ভিডিও আটকে যাবে, সাউন্ড দেরি করবে, আর ইউজার ক্লিক করলে অ্যাপ হ্যাং করে থাকবে।
এখন যদি আপনি প্রতিটি কাজের জন্য একটি করে Thread ব্যবহার করেন—তাহলে:
এক Thread ভিডিও প্রসেস করবে
আরেক Thread সাউন্ড প্লে করবে
তৃতীয় Thread ইউজার ইন্টারঅ্যাকশন দেখবে
এভাবেই Thread ব্যবহার করে একটি অ্যাপ্লিকেশন responsive, fast, এবং efficient হয়।
Thread কখন তৈরি করা হয়?
Thread তৈরি করার সময় মূলত দুটি ধরণে হয়ে থাকে:
At process start – অনেক সফটওয়্যার শুরুতেই একাধিক Thread তৈরি করে নেয় (predefined worker threads)
On-demand – কোনো বিশেষ কাজ শুরু হলে তখন নতুন Thread তৈরি হয়, যেমন HTTP request পেলে নতুন Thread বা Goroutine শুরু করা
উদাহরণ:
একটি ওয়েব সার্ভার প্রথমে শুরু হয় মাত্র একটি Main Thread নিয়ে। যখন কোনো ইউজার রিকোয়েস্ট পাঠায়, তখন সেই রিকোয়েস্ট হ্যান্ডল করার জন্য নতুন একটি Thread তৈরি হয়—এভাবে প্রতিটি ইউজারের জন্য আলাদা আলাদা Thread তৈরি হয়।
Thread না থাকলে কী হতো?
Thread না থাকলে একটি প্রসেসে সব কাজ একটার পর একটা করতে হতো। যেমন:
প্রথমে আপনি ভিডিও লোড করলেন
তারপর ইউজার ইনপুট পড়লেন
তারপর সাউন্ড প্লে করলেন
এই ধারাবাহিকতা খুব ধীর, রেসপন্স কম এবং ইউজারের অভিজ্ঞতা খুব খারাপ হতো। একেই বলে blocking behavior।
অর্থাৎ যদি এক কাজ বেশি সময় নেয়, তাহলে পরবর্তী সব কাজ আটকে যাবে।
আরেকটি বড় সমস্যা হতো scalability।
ধরুন আপনার একটি সার্ভার অ্যাপ আছে যেখানে একসাথে ১০০ জন ইউজার রিকোয়েস্ট পাঠাচ্ছে। এখন যদি Thread না থাকে, তাহলে সব রিকোয়েস্ট সিরিয়ালি সার্ভ করতে হতো। অথচ Thread-এর মাধ্যমে প্রতিটি রিকোয়েস্ট আলাদাভাবে হ্যান্ডেল করা যায়, তাও সমান্তরালে।
Thread-এর আচরণ
প্রত্যেকটি Thread-এর থাকে:
নিজস্ব Stack (লোকাল ভ্যারিয়েবল সংরক্ষণের জন্য)
নিজস্ব Instruction Pointer (বর্তমানে কোন ইনস্ট্রাকশন চলছে তা দেখায়)
নিজস্ব রেজিস্টার কন্টেক্সট
কিন্তু, সব Thread একই প্রসেসের:
Code Segment
Data Segment
Heap
File Descriptors
এই শেয়ারিং-এর কারণে Thread গুলো একে অপরের সাথে দ্রুত যোগাযোগ করতে পারে—যা Inter-Thread Communication সহজ করে তোলে।
বাস্তব উদাহরণ দিয়ে ভাবুন
একটি রেস্টুরেন্টকে কল্পনা করুন।
আপনার কাছে ১০টি অর্ডার এসেছে। এখন যদি আপনি একাই প্রতিটি অর্ডার রান্না করেন, গ্লাস পরিষ্কার করেন, বিল নেন—তাহলে ১০টি কাজ শেষ হতে অনেক দেরি হবে।
কিন্তু যদি আপনি ৩ জন কর্মচারী রাখেন:
একজন কিচেনে রান্না করছে
একজন কাস্টমার সার্ভ করছে
একজন টাকা নিচ্ছে
তাহলে আপনি দেখতে পাবেন, একসাথে অনেক কাজ দ্রুত শেষ হচ্ছে—এটাই হলো Thread-এর শক্তি।
🖊️ আল হাসিব
📅 চ্যালেঞ্জ: ৩০ দিনে ৩০টি ব্লগ পোস্ট
📂 বিষয়: Execution Model, Thread, System Programming**
Subscribe to my newsletter
Read articles from AL Hasib directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
