# Why Threads?

## ভূমিকা

আমাদের আধুনিক কম্পিউটিং জগতে thread হল একটি মৌলিক ধারণা যা modern operating systems এবং application development এর অবিচ্ছেদ্য অংশ। কিন্তু থ্রেডের আবির্ভাব কেন হল? কেন কেবল process ব্যবহার করে কাজ চালানো গেল না? আজকের এই ব্লগে আমরা এই প্রশ্নের উত্তর খুঁজব।

## প্রসেস: প্রথম যুগের কাহিনী

কম্পিউটার বিজ্ঞানের শুরুর দিকে, operating system একটি কম্পিউটার প্রোগ্রামকে একটি "process" হিসেবে দেখত। প্রতিটি process নিম্নলিখিত বৈশিষ্ট্য ধারণ করে:

* নিজস্ব memory space
    
* নিজস্ব program counter
    
* নিজস্ব registers
    
* নিজস্ব stack
    
* নিজস্ব heap
    
* নিজস্ব resource allocations (files, network connections, etc.)
    

যখন operating system এক process থেকে অন্য process এ context switch করত, তখন সম্পূর্ণ state সংরক্ষণ করতে হত এবং নতুন process এর state load করতে হত। এই প্রক্রিয়া অত্যন্ত ব্যয়বহুল:

```plaintext
Process A → Context Switch → Process B
- সমস্ত CPU registers সংরক্ষণ করা
- Memory mapping বদলানো
- Cache invalidate করা
- TLB (Translation Lookaside Buffer) flush করা
- Kernel data structures আপডেট করা
```

## সমস্যা: একটি প্রসেসের ভেতরে একাধিক কাজ

কম্পিউটার application গুলো যত জটিল হতে শুরু করল, তত বেশি parallelism এর প্রয়োজন দেখা দিল। একটি application কে নিচের মত কাজ একসাথে করতে হত:

* UI আপডেট করা
    
* নেটওয়ার্ক কমিউনিকেশন হ্যান্ডেল করা
    
* ব্যাকগ্রাউন্ডে ডাটা প্রসেস করা
    
* ইউজার ইনপুট গ্রহণ করা
    

যদি এই প্রতিটি কাজের জন্য আলাদা process বানাতে হত, তাহলে:

1. **অত্যধিক context switching overhead** - প্রতিটি switch এ সম্পূর্ণ CPU state সংরক্ষণ করতে হত
    
2. **মেমোরি ব্যবহারের অপচয়** - প্রতিটি process পুরো program কোড এবং data এর কপি রাখত
    
3. **জটিল inter-process communication (IPC)** - সবগুলো process এর মধ্যে communication মেকানিজম লাগত (pipes, sockets, shared memory, etc.)
    

## সমাধান: থ্রেড

এই সমস্যাগুলো সমাধান করার জন্য thread concept আবিষ্কার করা হয়। Thread হল একটি process এর ভেতরে "lightweight execution unit"।

একটি process এর ভেতরে একাধিক thread থাকতে পারে যারা:

### শেয়ার করে:

* Code segment
    
* Data segment
    
* Heap memory
    
* File descriptors
    
* Signals
    
* Process ID
    

### আলাদা থাকে:

* Thread ID
    
* Stack
    
* Register set (program counter সহ)
    
* Thread-specific data
    

## থ্রেড বনাম প্রসেস: কেন থ্রেড বেশি দক্ষ?

### 1\. দ্রুত Context Switching

Thread context switch অনেক হালকা কারণ:

```plaintext
Thread A → Context Switch → Thread B (একই process এর ভেতরে)
- শুধু registers সংরক্ষণ করা
- Stack pointer বদলানো
- Memory mapping বদলানো লাগে না
- Cache invalidate করা লাগে না
```

একটি thread context switch একটি process context switch এর তুলনায় প্রায় 10-100 গুণ দ্রুত হতে পারে।

### 2\. কম মেমোরি ফুটপ্রিন্ট

নতুন thread শুরু করা মাত্র কয়েক কিলোবাইট memory নেয় (প্রধানত stack এর জন্য), যেখানে একটি নতুন process মেগাবাইট পরিমাণ memory নিতে পারে।

### 3\. কার্যকর ডাটা শেয়ারিং

একই process এর thread গুলো সহজেই data share করতে পারে - কারণ তারা একই memory space ব্যবহার করে। এতে কোন IPC মেকানিজম লাগে না।

### 4\. Multi-core Processor এর সম্পূর্ণ ব্যবহার

Modern multi-core CPU তে থ্রেড গুলো সমান্তরালভাবে চলতে পারে, যা কার্যকর parallelism সক্ষম করে।

## Modern Operating Systems এ থ্রেডের ধরণ

### 1\. User-Level Threads

* OS thread scheduler এর অজ্ঞাতে থাকে
    
* Library implementation (Green threads, Goroutines)
    
* Faster creation/scheduling
    
* একটি OS-level thread blocking হলে সব user-level threads block হয়
    

### 2\. Kernel-Level Threads

* OS দ্বারা সরাসরি ম্যানেজ করা হয়
    
* OS scheduler এর মাধ্যমে schedule করা হয়
    
* বেশি resource লাগে
    
* একটি thread block হলে অন্য threads চলতে থাকে
    

## আধুনিক প্রোগ্রামিং ভাষায় থ্রেডিং

আধুনিক প্রোগ্রামিং ভাষাগুলো thread সমর্থন করে বিভিন্ন উপায়ে:

```go
// Go - Goroutines (lightweight user-level threads)
func main() {
    go func() {
        // Concurrent task
    }()
    // Main thread continues
}
```

```java
// Java - Threads
public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            // Concurrent task
        });
        thread.start();
        // Main thread continues
    }
}
```

## উপসংহার

Thread হল modern computing এর একটি অপরিহার্য অংশ যা পারফরম্যান্স, রিসোর্স ব্যবহার এবং প্রোগ্রাম ডিজাইন উন্নত করেছে। Process এর তুলনায় হালকা হওয়ায় thread গুলো concurrent programming কে অনেক বেশি accessible করেছে।

কম context switching overhead এবং shared memory access এর সুবিধার জন্য threads বিশেষ করে interactive applications, web servers, এবং database systems এ ব্যাপকভাবে ব্যবহৃত হয়।

যদিও threads তাদের নিজস্ব জটিলতা (যেমন race conditions, deadlocks) নিয়ে আসে, তারা আধুনিক computing এর একটি অপরিহার্য অংশ হিসেবে থেকে যাবে যতক্ষণ আমাদের multiple tasks একসঙ্গে করার প্রয়োজন আছে।

থ্রেডের উপযোগিতা বুঝতে পারলে, আমরা আরো efficient, responsive এবং scalable software তৈরি করতে পারি।
