اگر تازه با مفاهیم چندنخی (Multithreading)، هم‌زمانی (Concurrency) و پردازش موازی (Parallelism) آشنا شده‌اید، احتمالاً اولین چیزی که ذهنتان را درگیر می‌کند این است که “این‌ها دقیقاً چه فرقی دارند؟”
در این مقاله از پایه شروع می‌کنیم؛ ابتدا سه مدل اجرای برنامه‌ها را بررسی می‌کنیم: Sequential, Interleaved, و Parallel Execution. بعد انواع Thread، مزایا و معایب Multithreading و نهایتاً اجرای Taskها روی Threadها و مفهوم مهم Context Switching را توضیح می‌دهیم، آن هم با مثال‌های روزمره و قابل درک که حتی بدون کدنویسی هم کاملاً قابل تصور باشند.

مدل‌های اجرای برنامه (Execution Models)

اجرای ترتیبی (Sequential Execution)

در این مدل تنها یک کار وجود دارد و تا پایان همان کار، هیچ کار دیگری شروع نمی‌شود.

مثال واقعی:
فرض کنید تنها یک کارگر دارید که باید:

کار اولکار دومکار سوم
چای دم کندناهار آماده کندمیز را تمیز کند

تا کار اول تمام نشود، کارگر سراغ دومی نمی‌رود. این یعنی اجرای ترتیبی.

  1.  مناسب برای برنامه‌های ساده، بدون نیاز به هم‌زمانی
  2. هیچ پیچیدگی ندارد
  3. کند است زیرا همه چیز پشت سر هم انجام می‌شود

اجرای درهم‌تنیده (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 1Thread 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) این مفاهیم را عملی نشان