Skip to main content

Command Palette

Search for a command to run...

থ্রেডের ইতিহাস: অপারেটিং সিস্টেমের অদৃশ্য হিরো

Updated
7 min readView as Markdown
থ্রেডের ইতিহাস: অপারেটিং সিস্টেমের অদৃশ্য হিরো
I

A highly motivated and experienced full-stack developer with a proven track record of developing and deploying web applications. Skilled in a range of programming languages and frameworks, as well as database technologies. Comfortable working in a fast-paced environment and able to adapt to new technologies quickly. A team player who is also able to work independently when required.

প্রথম অধ্যায়: থ্রেডের জন্ম এবং দর্শন

১৯৬০-এর দশকের শেষের দিকে এবং ১৯৭০-এর দশকের শুরুতে কম্পিউটিং জগতে মাল্টি-প্রোগ্রামিং এবং টাইম-শেয়ারিং সিস্টেমের উত্থান ঘটতে থাকে। এই সময়ে, কম্পিউটার সিস্টেমে একাধিক প্রোগ্রাম একসাথে চালানোর প্রয়োজনীয়তা দেখা দেয়, কিন্তু তখন ছিল শুধু "প্রসেস" এর ধারণা।

থ্রেডের পূর্ববর্তী যুগ (১৯৬০-১৯৭০)

১৯৬০-এর দশকে, কম্পিউটার সিস্টেমে "প্রসেস" ছিল একক এক্সিকিউশন ইউনিট। প্রতিটি প্রসেসের নিজস্ব:

  • মেমরি স্পেস

  • স্ট্যাক

  • হিপ

  • রেজিস্টার সেট

  • ফাইল ডেসক্রিপ্টর

এক প্রসেস থেকে অন্য প্রসেসে কন্টেক্সট সুইচিং ছিল ব্যয়বহুল:

  • পুরো সিস্টেম স্টেট সেভ করতে হত

  • পুরো মেমরি ম্যাপ পরিবর্তন করতে হত

  • ক্যাশ ইনভ্যালিডেট করতে হত

থ্রেডের দার্শনিক ভিত্তি

থ্রেডের পিছনে মূল দর্শন ছিল:

  1. রিসোর্স শেয়ারিং: একই প্রসেসের মধ্যে অনেকগুলো এক্সিকিউশন পাথ থাকা, যারা মেমরি ও অন্যান্য রিসোর্স শেয়ার করে কাজ করে।

  2. কম ওভারহেড: প্রসেস তৈরি করার তুলনায় থ্রেড তৈরি করা অনেক কম ব্যয়বহুল।

  3. প্যারালেলিজম: একটি প্রোগ্রামের ভিতরে প্যারালেল এক্সিকিউশন সক্ষম করা।

প্রসিদ্ধ কম্পিউটার সায়েন্টিস্ট এডসগার ডেইকস্ট্রা ১৯৬৮ সালে "THE" অপারেটিং সিস্টেমে মাল্টিপ্রোগ্রামিং এর ধারণা নিয়ে কাজ করেন, যা পরবর্তীতে থ্রেডের ধারণাকে প্রভাবিত করে।

দ্বিতীয় অধ্যায়: থ্রেডের আবির্ভাব (১৯৭০-১৯৮০)

প্রথম থ্রেড ইমপ্লিমেন্টেশন

থ্রেডের ধারণা আনুষ্ঠানিকভাবে ১৯৭৯ সালে Burroughs MCP (Master Control Program) এবং তারপর ১৯৮০-এর দশকের শুরুতে Xerox PARC এর Mesa এবং Cedar প্রোগ্রামিং সিস্টেমে দেখা যায়। এই সিস্টেমগুলো প্রথম "lightweight processes" বা থ্রেডের ধারণা চালু করে।

UNIX-এ থ্রেডের আগমন

UNIX অপারেটিং সিস্টেমে থ্রেডের ধারণা ধীরে ধীরে এসেছে:

  • ১৯৮৪: AT&T UNIX System V-তে "lightweight processes" এর ধারণা আসে

  • ১৯৮৮-৮৯: POSIX threads (pthread) স্ট্যান্ডার্ড ডেভেলপ হতে শুরু করে

  • ১৯৯৫: POSIX 1003.1c থ্রেড স্ট্যান্ডার্ড চূড়ান্ত হয়

প্রখ্যাত কম্পিউটার বিজ্ঞানী এন্ড্রু ট্যাননবাম এবং ডেভিড চেরিটন থ্রেড মডেল এবং কনকারেন্ট প্রোগ্রামিং নিয়ে গুরুত্বপূর্ণ গবেষণা করেন।

তৃতীয় অধ্যায়: লিনাক্স কার্নেলে থ্রেডের ইতিহাস

লিনাক্সে প্রারম্ভিক থ্রেড সাপোর্ট

লিনাক্স কার্নেলে থ্রেডের ইতিহাস বেশ মজার:

  • ১৯৯১-১৯৯৫: লিনাক্সের প্রথম দিকে কোনো নেটিভ থ্রেড সাপোর্ট ছিল না।

  • ১৯৯৬: লিনাক্সে LinuxThreads লাইব্রেরি চালু হয়, যা POSIX threads ইমপ্লিমেন্ট করে। এটি clone() সিস্টেম কল ব্যবহার করে থ্রেড তৈরি করত, কিন্তু এতে অনেক সীমাবদ্ধতা ছিল।

  • ২০০২-২০০৩: লিনাক্স কার্নেল ২.৬ ভার্সনে NPTL (Native POSIX Thread Library) চালু হয়, যা আরও এফিশিয়েন্ট এবং POSIX স্ট্যান্ডার্ড কমপ্লায়েন্ট ছিল।

লিনাক্স কার্নেলে থ্রেড ইমপ্লিমেন্টেশন

লিনাক্স কার্নেলে থ্রেড ইমপ্লিমেন্টেশন এর মূল বৈশিষ্ট্য:

  1. ১-১ থ্রেড মডেল: লিনাক্সে প্রতিটি ইউজার-লেভেল থ্রেড একটি কার্নেল থ্রেডের সাথে ম্যাপ হয়।

  2. clone() সিস্টেম কল: লিনাক্সে clone() ব্যবহার করে থ্রেড তৈরি হয়, যা fork() এর একটি জেনারেলাইজেশন। clone() এ flags পাস করে বলা যায় প্রসেসের কোন রিসোর্স শেয়ার করতে হবে:

     clone(function, stack_ptr, CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, arg);
    
  3. প্রসেস কে Task হিসেবে দেখা: লিনাক্স কার্নেলে, প্রসেস এবং থ্রেড উভয়ই "task" হিসেবে রিপ্রেজেন্ট করা হয়। তফাৎ শুধু কোন রিসোর্স শেয়ার করা হয়।

  4. সিডিউলিং: কার্নেল ২.৬ থেকে, O(1) স্কেডিউলার চালু হয় যা থ্রেড সিডিউলিং আরও এফিশিয়েন্ট করে। পরে CFS (Completely Fair Scheduler) চালু হয়।

লিনাক্স কার্নেল ডেভেলপমেন্টে থ্রেডের মাইলস্টোন

  • ২০০২: Ingo Molnar এবং Ulrich Drepper NPTL ডেভেলপ করেন

  • ২০০৩: কার্নেল ২.৬ এ NPTL ইন্টিগ্রেট হয়

  • ২০০৬: কার্নেল ২.৬.১৭ এ RCU (Read-Copy-Update) এর উন্নতি, থ্রেড সিঙ্ক্রোনাইজেশন উন্নত করে

  • ২০০৭: CFS স্কেডিউলার চালু হয় যা থ্রেডেড অ্যাপ্লিকেশনের পারফরম্যান্স বাড়ায়

চতুর্থ অধ্যায়: প্রসেস বনাম থ্রেড

কীভাবে প্রসেস থ্রেড তৈরি করে

প্রসেস থ্রেড তৈরি করার মূল পদ্ধতি:

  1. সিস্টেম কল: প্রসেস সরাসরি OS API কল করে থ্রেড তৈরি করতে পারে।

     // POSIX Threads API
     pthread_t thread;
     pthread_create(&thread, NULL, thread_function, NULL);
    
  2. থ্রেড লাইব্রেরি: প্রসেস থ্রেড লাইব্রেরি ব্যবহার করে থ্রেড তৈরি করতে পারে।

  3. কার্নেল সাপোর্ট: কার্নেল সরাসরি clone() বা প্রাসঙ্গিক সিস্টেম কল ব্যবহার করে থ্রেড তৈরি করে।

থ্রেড ক্রিয়েশনের সীমাবদ্ধতা

প্রসেস কতগুলো থ্রেড তৈরি করতে পারে তার সীমাবদ্ধতা:

  1. সিস্টেম রিসোর্স: কার্নেল সাধারণত /proc/sys/kernel/threads-max এ ম্যাক্সিমাম থ্রেড সেট করে।

  2. স্ট্যাক সাইজ: প্রতিটি থ্রেডের নিজস্ব স্ট্যাক থাকে। ডিফল্ট স্ট্যাক সাইজ সাধারণত ৮MB।

  3. মেমরি: প্রতিটি থ্রেড তৈরি করতে অতিরিক্ত মেমরি লাগে।

পঞ্চম অধ্যায়: প্রোগ্রামিং ল্যাঙ্গুয়েজে থ্রেড

বিভিন্ন প্রোগ্রামিং ভাষায় থ্রেডের বাস্তবায়ন:

C/C++ এ থ্রেড

// POSIX Threads
#include <pthread.h>

void* thread_function(void* arg) {
    // Thread code here
    return NULL;
}

int main() {
    pthread_t thread;
    pthread_create(&thread, NULL, thread_function, NULL);
    pthread_join(thread, NULL);
    return 0;
}

C++11 এ স্ট্যান্ডার্ড থ্রেড লাইব্রেরি:

#include <thread>

void thread_function() {
    // Thread code here
}

int main() {
    std::thread t(thread_function);
    t.join();
    return 0;
}

জাভাতে থ্রেড

class MyThread extends Thread {
    public void run() {
        // Thread code here
    }
}

// Usage
MyThread thread = new MyThread();
thread.start();

বা Runnable ইন্টারফেস দিয়ে:

class MyRunnable implements Runnable {
    public void run() {
        // Thread code here
    }
}

// Usage
Thread thread = new Thread(new MyRunnable());
thread.start();

পাইথনে থ্রেড

import threading

def thread_function():
    # Thread code here
    pass

# Create and start thread
thread = threading.Thread(target=thread_function)
thread.start()
thread.join()

Go তে থ্রেড (Goroutines)

আপনার দেয়া কোড উদাহরণে ব্যবহৃত:

package main

import (
    "fmt"
    "time"
)

func printNumber(x int) {
    fmt.Println("Hello Imran ", x)
}

func main() {
    go printNumber(1)
    go printNumber(2)
    go printNumber(3)
    go printNumber(4)
    go printNumber(5)

    fmt.Println(a, p)
    time.Sleep(6 * time.Second)
}

Go তে Goroutines খুব হালকা এবং এফিশিয়েন্ট। এগুলো OS থ্রেডের উপর মাল্টিপ্লেক্স হয়।

ষষ্ঠ অধ্যায়: থ্রেডের বিবর্তন এবং আধুনিক দৃষ্টিকোণ

থ্রেডের ধারণার বিবর্তন

থ্রেড কনসেপ্ট সময়ের সাথে বিবর্তিত হয়েছে:

  1. কার্নেল থ্রেডস: OS দ্বারা ম্যানেজ করা থ্রেড

  2. ইউজার থ্রেডস: ইউজার স্পেসে থ্রেড লাইব্রেরি দ্বারা ম্যানেজ করা

  3. হাইব্রিড মডেল: ইউজার এবং কার্নেল থ্রেডস মিলিয়ে

আধুনিক থ্রেড মডেল

আধুনিক সিস্টেমে থ্রেডের বিভিন্ন ইমপ্লিমেন্টেশন:

  1. Goroutines (Go): হালকা থ্রেড যা OS থ্রেডের উপর মাল্টিপ্লেক্স হয়

  2. Fibers (Windows): কোঅপারেটিভ মাল্টিটাস্কিং যা প্রোগ্রামার কন্ট্রোল করে

  3. Erlang Processes: একটি প্রসেস বিলিয়ন প্রসেস পর্যন্ত তৈরি করতে পারে

  4. Grand Central Dispatch (Apple): থ্রেড পুল এবং কোয়েউ-ভিত্তিক সিস্টেম

মাল্টিকোর প্রসেসর এবং থ্রেড

থ্রেডের একটি মূল উদ্দেশ্য হল মাল্টিকোর প্রসেসরের সম্পূর্ণ সুবিধা নেওয়া:

  • ১৯৯০-এর আগে: সিঙ্গেল কোর CPU, থ্রেডের সুবিধা সীমিত ছিল

  • ২০০৫: ইন্টেল এবং AMD ডুয়াল-কোর CPU চালু করে

  • বর্তমানে: ডেস্কটপে ৮-১৬ কোর, সার্ভারে ৬৪-১২৮ কোর

মাল্টিকোর প্রসেসরের আবির্ভাব থ্রেডের গুরুত্ব বাড়িয়েছে, কারণ একাধিক থ্রেড একসাথে বিভিন্ন কোরে রান করতে পারে।

সপ্তম অধ্যায়: থ্রেডের ভবিষ্যৎ

আসন্ন চ্যালেঞ্জ এবং সমাধান

থ্রেড টেকনোলজির সাম্প্রতিক বিকাশ:

  1. থ্রেড-পার-কোর: প্রতিটি CPU কোরকে একটি থ্রেডে ডেডিকেটেড করা

  2. লো-লেটেন্সি থ্রেড সুইচিং: থ্রেড সুইচিং লেটেন্সি কমানো

  3. হার্ডওয়্যার সাপোর্ট: CPU-তে থ্রেড সাপোর্ট (Intel Hyper-Threading)

  4. ট্রান্সাকশনাল মেমরি: থ্রেড সিঙ্ক্রোনাইজেশন সিমপ্লিফাই করা

থ্রেডের ভবিষ্যৎ ট্রেন্ড

আধুনিক ডেভেলপমেন্টে থ্রেডের ভবিষ্যৎ:

  1. Async/Await প্যাটার্ন: থ্রেডের বিকল্প, হাইলি স্কেলেবল

  2. Reactive প্রোগ্রামিং: ইভেন্ট-ড্রিভেন প্যারাডাইম

  3. শটডাউন মেকানিজম: গ্রেসফুল থ্রেড টার্মিনেশন

  4. Rust ল্যাঙ্গুয়েজ: থ্রেড সেফটি গ্যারান্টি

উপসংহার

থ্রেডের ইতিহাস দেখায় যে এটি কম্পিউটার সায়েন্সের একটি মৌলিক উদ্ভাবন যা আধুনিক কম্পিউটিং কে আরও দক্ষ, প্যারালেল এবং প্রতিক্রিয়াশীল করেছে। এটি হল একটি সমাধান যা প্রসেসের ভারী ওভারহেড কমিয়ে একই প্রোগ্রামে একাধিক কাজ সমান্তরালভাবে করার সুযোগ তৈরি করেছে।

আপনার দেয়া Go প্রোগ্রাম উদাহরণ ব্যবহার করে আমরা দেখতে পাই কিভাবে আধুনিক প্রোগ্রামিং ল্যাঙ্গুয়েজ থ্রেডের ধারণাকে আরও সহজ এবং শক্তিশালী করেছে। Go তে শুধু go কীওয়ার্ড দিয়ে আমরা সহজেই নতুন Goroutine (Go এর থ্রেড) তৈরি করতে পারি, যা আমাদেরকে concurrent প্রোগ্রাম লেখার ক্ষমতা দেয়।

থ্রেডের আবির্ভাব কম্পিউটার সায়েন্সের ইতিহাসে একটি গুরুত্বপূর্ণ ধাপ, যা আমাদের আজকের আধুনিক, মাল্টিকোর, প্যারালেল কম্পিউটিং জগতের ভিত্তি তৈরি করেছে।

অ্যাকাডেমিক পেপার

  1. Lampson, B. W., & Redell, D. D. (1980). "Experience with processes and monitors in Mesa." Communications of the ACM, 23(2), 105-117.

  2. Marsh, B. D., Scott, M. L., LeBlanc, T. J., & Markatos, E. P. (1991). "First-class user-level threads." ACM SIGOPS Operating Systems Review, 25(5), 110-121.

  3. Anderson, T. E., Bershad, B. N., Lazowska, E. D., & Levy, H. M. (1992). "Scheduler activations: Effective kernel support for the user-level management of parallelism." ACM Transactions on Computer Systems (TOCS), 10(1), 53-79.

  4. Drepper, U., & Molnar, I. (2003). "The Native POSIX Thread Library for Linux." Red Hat, Inc. Technical Report.

বই

  1. Tanenbaum, A. S., & Bos, H. (2014). Modern Operating Systems (4th ed.). Pearson. [থ্রেড কনসেপ্ট নিয়ে অধ্যায় 2.2]

  2. Silberschatz, A., Galvin, P. B., & Gagne, G. (2018). Operating System Concepts (10th ed.). Wiley. [থ্রেড এবং মাল্টিথ্রেডিং নিয়ে অধ্যায় 4]

  3. Love, R. (2010). Linux Kernel Development (3rd ed.). Addison-Wesley Professional. [লিনাক্স কার্নেলে থ্রেড ইমপ্লিমেন্টেশন]

  4. Stevens, W. R., & Rago, S. A. (2013). Advanced Programming in the UNIX Environment (3rd ed.). Addison-Wesley Professional. [POSIX থ্রেড প্রোগ্রামিং]

লিনাক্স কার্নেল ডকুমেন্টেশন

  1. "POSIX threads and the Linux kernel" - https://www.kernel.org/doc/html/latest/scheduler/sched-design-CFS.html

  2. "Threading models" - Linux kernel documentation, man pages, man pthreads

  3. Molnar, I. (2002). "The Native POSIX Thread Library for Linux" - https://www.akkadia.org/drepper/nptl-design.pdf

প্রোগ্রামিং ল্যাঙ্গুয়েজ থ্রেড ডকুমেন্টেশন

  1. Go Language Documentation: "Effective Go - Concurrency" - https://golang.org/doc/effective_go.html#concurrency

  2. Java Threading Documentation - https://docs.oracle.com/javase/tutorial/essential/concurrency/

  3. C++11 Thread Support Library - https://en.cppreference.com/w/cpp/thread

হিস্টোরিক্যাল রেফারেন্স

  1. Dijkstra, E. W. (1968). "Cooperating sequential processes." In Programming Languages, Academic Press.

  2. Hoare, C. A. R. (1978). "Communicating sequential processes." Communications of the ACM, 21(8), 666-677.

  3. "THE multiprogramming system" documentation, Dijkstra's early work on concurrency.

  4. Saltzer, J. H., & Kaashoek, M. F. (2009). Principles of Computer System Design: An Introduction. Morgan Kaufmann. [কনকারেন্সি এবং থ্রেডিং এর উপর ঐতিহাসিক দৃষ্টিকোণ]

অনলাইন রিসোর্স

  1. "A brief history of concurrency" - https://blog.golang.org/concurrency-timeouts

  2. "NPTL - The Native POSIX Thread Library for Linux" - https://www.linuxjournal.com/article/5574

  3. "Threading Building Blocks" Intel Documentation - https://software.intel.com/content/www/us/en/develop/tools/oneapi/components/threading-building-blocks.html

  4. "The Evolution of the Unix Time-sharing System" by Dennis M. Ritchie - https://www.bell-labs.com/usr/dmr/www/hist.html

এই রেফারেন্সগুলো থ্রেডের উৎপত্তি, বিকাশ এবং আধুনিক বাস্তবায়ন সম্পর্কে আরও গভীর বোঝাপড়া তৈরি করতে সাহায্য করবে। বিশেষ করে Tanenbaum এবং Love এর বইগুলো অপারেটিং সিস্টেম এবং লিনাক্স কার্নেলে থ্রেডের সম্পূর্ণ বিবরণ প্রদান করে।

8 views

More from this blog

Low Level Design: গভীর থেকে বোঝা এবং আয়ত্ত করা

ভূমিকা: কেন এই Article? তুমি হয়তো programming শিখেছ। Variable, loop, function, data structure - সব জানো। কিন্তু যখন একটা বড় system বানাতে বসো, তখন মনে হয় কোথা থেকে শুরু করব? কীভাবে organize করব? Code লিখতে লিখতে হারিয়ে যাও একটা maze-এ। এই feeling...

Oct 15, 202520 min read71
Low Level Design: গভীর থেকে বোঝা এবং আয়ত্ত করা

Go-তে Interface কীভাবে Code Decouple করে?

একটা HTTP Server দিয়ে পুরো ব্যাপারটা বুঝে নেওয়া যাক আমরা সবাই জানি Go একটা সিম্পল ল্যাঙ্গুয়েজ, কিন্তু interface নিয়ে অনেকেরই confusion থাকে। আজকে আমরা দেখব কীভাবে interface আসলে তোমার code-কে flexible এবং maintainable বানায়। একটা real-world HTT...

Oct 14, 202520 min read5
Go-তে Interface কীভাবে Code Decouple করে?

তোমার Project-এ Coupled Code কীভাবে খুঁজে বের করবে?

Coupled code খোঁজা মানে হচ্ছে তোমার codebase-এ এমন জায়গা খুঁজে বের করা যেখানে একটা অংশ আরেকটার উপর বেশি depend করছে। এটা একটা detective work — তুমি clue খুঁজবে, pattern দেখবে, এবং সমস্যা চিহ্নিত করবে। চলো step by step শিখি কীভাবে এটা করতে হয়। কেন ...

Oct 14, 202510 min read2

Go-তে Object (Struct Instance) তৈরির সম্পূর্ণ গাইড

Go programming শেখার সময় একটা জিনিস খুব তাড়াতাড়ি বুঝতে হয় - কীভাবে object তৈরি করতে হয়। অন্য language যেমন Java বা Python এ class আছে, কিন্তু Go-তে আছে struct। আর struct এর instance বানানোই হলো object তৈরি করা। আজকের এই blog এ আমরা দেখব Go-তে ob...

Oct 13, 202524 min read3
Go-তে Object (Struct Instance) তৈরির সম্পূর্ণ গাইড
I

Imran Hasan

61 posts

Full-stack developer with experience in developing and managing web applications. Skilled in React, Node.js, HTML, CSS, and JavaScript. Experience in managing website hosting and security.