اگر تازه با مفاهیم چندنخی (Multithreading)، همزمانی (Concurrency) و پردازش موازی (Parallelism) آشنا شدهاید، احتمالاً اولین چیزی که ذهنتان را درگیر میکند این است که “اینها دقیقاً چه فرقی دارند؟”
در این مقاله از پایه شروع میکنیم؛ ابتدا سه مدل اجرای برنامهها را بررسی میکنیم: Sequential, Interleaved, و Parallel Execution. بعد انواع Thread، مزایا و معایب Multithreading و نهایتاً اجرای Taskها روی Threadها و مفهوم مهم Context Switching را توضیح میدهیم، آن هم با مثالهای روزمره و قابل درک که حتی بدون کدنویسی هم کاملاً قابل تصور باشند.
مدلهای اجرای برنامه (Execution Models)
اجرای ترتیبی (Sequential Execution)
در این مدل تنها یک کار وجود دارد و تا پایان همان کار، هیچ کار دیگری شروع نمیشود.
مثال واقعی:
فرض کنید تنها یک کارگر دارید که باید:
| کار اول | کار دوم | کار سوم |
|---|---|---|
| چای دم کند | ناهار آماده کند | میز را تمیز کند |
تا کار اول تمام نشود، کارگر سراغ دومی نمیرود. این یعنی اجرای ترتیبی.
- مناسب برای برنامههای ساده، بدون نیاز به همزمانی
- هیچ پیچیدگی ندارد
- کند است زیرا همه چیز پشت سر هم انجام میشود
اجرای درهمتنیده (Interleaved / Concurrent Execution)
در اینجا همچنان فقط یک نیروی پردازشی داریم، ولی بین کارها جابجا میشود.
مثال:
همان کارگر این بار:
- آب را برای چای میگذارد روی گاز (در حال جوشیدن)
- تا جوش بیاید میرود برنج را میشوید
- تا برنج دم بکشد شروع میکند میز را پاک کردن
اینجا فقط یک کارگر داریم → اما چند کار همزمان در جریاناند
این یعنی Concurrency (همزمانی)
سرعت پاسخگویی بهتر میشود
منابع بلااستفاده کمتر میمانند
اگر تعداد کارها زیاد شود مدیریت سختتر میشود
اجرای موازی (Parallel Execution)
در این شرایط چند نیروی پردازشی واقعی داریم و کارها همزمان واقعاً اجرا میشوند.
مثال:سه کارگر داریم، هرکدام یکی از کارها را انجام میدهد.
نتیجه؟ همه کارها سریعتر تمام میشود.
- این یعنی Parallelism → چند عمل واقعاً همزمان
- بهترین حالت برای افزایش سرعت
- نیاز به منابع بیشتر (کارگرهای بیشتر / CPUهای بیشتر)
انواع Thread — نخها ستون فقرات اجرای همزمان
Thread یعنی مسیر اجرایی مستقل داخل یک برنامه. مثل چند کارگر در یک کارگاه.
مدلهای متداول Threading:
| نوع Thread | توضیح ساده |
|---|---|
| Single Thread | فقط یک نخ → همه کارها Sequential/Interleaved |
| Multi-Thread | چند نخ همزمان → امکان Parallel/Concurrency |
| Kernel-Level Thread | توسط سیستمعامل مدیریت میشود (سنگینتر ولی قدرتمندتر) |
| User-Level Thread | توسط برنامه مدیریت میشود (سبکتر ولی محدودیت بیشتر) |
| Hybrid Thread | ترکیبی از مدیریت Kernel + User برای بهینهسازی |
مثال ساده Kernel vs User Thread
Kernel Thread مثل کارگری است که توسط مدیریت کارخانه کنترل میشود، وظایف مشخص دارد.
User Thread مثل کارگر قراردادی است که خود تیم پروژه او را مدیریت میکند، سبکتر و ارزانتر.
Multithreading — چرا جذاب است و کجا دردسر میسازد؟
Multi-threading یعنی اجرای چند Task به شکل همزمان یا موازی.
مزایا
| مزیت | مثال قابل فهم |
|---|---|
| افزایش سرعت | ۳ کارگر → چای، ناهار، تمیزکاری همزمان |
| پاسخگویی بهتر برنامه | برنامه هنگ نمیکند چون یک Thread مخصوص UI و دیگری برای پردازش |
| استفاده بهتر از CPU های چند هستهای | اگر 4 هسته داری، چرا یک هسته بهتنهایی کار کند؟ |
معایب
| عیب | مثال |
|---|---|
| پیچیدگی مدیریت | ۵ کارگر داری ولی باید نظارت و زمانبندی کنی |
| احتمال تداخل و Race Condition | هردو کارگر همزمان سراغ یک قابلمه میروند! |
| هزینه Context Switch بالا | جابجایی کارگرها بین وظایف زمان میگیرد |
اجرای Task روی Thread — دقیقاً چه اتفاقی میافتد؟
برنامه میتواند چند Task تعریف کند و آنها را روی چند Thread قرار دهد.
گاهی یک Thread چند Task انجام میدهد (Interleaving)،
گاهی هر Task روی Thread جدا اجرا میشود (Parallel).
مثال واقعی:
| Thread 1 | Thread 2 |
|---|---|
| دم کردن چای | آماده کردن ناهار |
| پاک کردن آشپزخانه | خرید نان |
اگر Thread بیشتری داشته باشیم، تقسیمکار بهتر و سرعت بالاتر.
Context Switching — عامل پنهان کندی
وقتی CPU بین Threadها جابجا میشود، باید وضعیت Thread قبلی ذخیره و Thread جدید بارگذاری شود.
این فرآیند را Context Switch میگویند.
مثال انسانی:
تصور کن کارگر اول وسط چایسازی متوقف شود و مجبور شود کار ناهار را ادامه دهد. برای این کار:
- باید یادش بیاید قبلاً چه کرده
- وسایل را عوض کند
- فکرش را تغییر دهد
اینها هزینه زمانی دارند. اگر Thread زیاد باشد، Context Switch زیاد = سرعت کمتر.
Multithreading همیشه سریعتر نیست → گاهی Slowdown هم ایجاد میکند!
جمعبندی مقاله
| مفهوم | معنی ساده | مثال |
|---|---|---|
| Sequential | اجرای پشتسرهم | یک کارگر = یک کار همزمان |
| Concurrent | چند کار در جریان ولی با یک پردازنده | یک کارگر بین چند کار جابجا میشود |
| Parallel | چند کار همزمان واقعی با چند پردازنده | چند کارگر همزمان کار میکنند |
| Thread | مسیر اجرای مستقل | هر Thread = یک کارگر |
| Multithreading | اجرای چند Thread | چند مسیر اجرا در یک برنامه |
| Context Switching | جابجایی CPU بین Threadها | کارگر بین کارها سوییچ میکند |
اگر خواستی در نسخه بعدی همین مقاله، با مثالهای برنامهنویسی (Golang، Java، Python) این مفاهیم را عملی نشان

