مفهوم چند نخی در دنیای واقعی
بارها ممکنه پیش اومده باشه که در دنیای واقعی چند تا کار رو همزمان انجام داده باشیم، مثلا دیگ رو میزاریم رو گاز تا جوش بیاد، ماهی تابه داره سویا ها رو سرخ می کنه و ما هم اینور داریم ظرف ها رو میشوریم، خب حالا فکر کنید اگه این سه تا کار بجای اینکه همزمان انجام بشه به ترتیب انجام بشه چه اتفاقی می افته؟ جواب سادس زمان رو از دست میدیم! فکرشو کنید اول صبر کنیم ماهی تابه تا سرخ کنه، کار سرخ کردن که تموم شد بعد دیگ رو روشن میکنیم تا جوش بیاد بعد که جوش اومد غذا دم کشید میریم ظرف ها رو میشوریم مسلما بر خلاف سناریو اول، زمان و انرژی بیشتری بابت انجام این کار ها صرف میشه.
در دنیای کامپیوتر به مثالی که در بالا گفته شد چند نخی (Multi Theading) میگن؛ گاهی اوقات یک برنامه نیاز داره چندتا کار رو به طور همزمان انجام بده، مثلا زمانی که تو تلگرام یک ویدیو رو باز کردید، همزمان با دانلود ویدیو میتونید ویدیو رو تماشا کنید درواقع دوتا کار دانلود و پخش فیلم رو برنامه داره به صورت همزمان انجام میده، که اصطلاحا میگیم دوتا نخ (Thread) توسط برنامه ایجاد شده، یا یک اهنگ داخل تلگرام پخش کردید و همزمان دارید چت میکنید اگه اهنگ درحال دانلود هم باشه سه تا کار دانلود، اهنگ، پخش آهنگ و چت کردن رو به طور همزمان دارید انجام میدید در این وضعیت سه تا نخ برای سه کار دانلود آهنگ، پخش آهنگ و چت کردن توسط برنامه ایجاد میشه.
آشنایی با چند نخی (Multithreading)
هر کامپیوتر حداقل یک پردازنده (CPU) داره، هر پردازنده یک یا چند هسته داره و هر هسته میتونه یک یا چند نخ (بستگی به مدل پردازنده) داشته باشه؛ به عنوان مثال وقتی میگیم یک پردازنده چهارتا هسته و ۸ تا نخ داره، یعنی چهارتا هسته ی فیزیکی داره و برای هر هسته ۲ نخ فیزیکی وجود داره. در زیر به صورت تصویری یک پردازنده با چهار هسته و ۸ تا نخ شرح داده شده است.
زمانی که چند نخ توسط یک یا چند برنامه ایجاد میشه این نخ ها توسط سیستم عامل (Operating System) وارد یک صف برای اجرا شده و بر اساس اولویت بندی توسط سیستم عامل به پردازنده برای پردازش ارسال میشن.
در سیستم عامل صد ها نخ (thread) در حال اجرا وجود داره چطور یک پردازنده با ۸ نخ این نخ ها رو به طور همزمان اجرا میکنه؟
جواب سوال بر میگرده به مدیریت نخ ها توسط سیستم عامل؛ زمانی که نخ ها توسط سیستم عامل به پردازنده ارسال میشن، پردازنده هر نخ رو در کسری از ثانیه پردازش میکنه سیستم عامل پردازش نخ رو به طور موقت متوقف میکنه، سپس وضعیت نخ رو در حافظه ی موقت ذخیره میکنه و میره سراغ اجرا یا ادامه ی اجرای نخ بعدی، این عمل به سرعت در حال اتفاق افتادنه و توسط سیستم عامل مدیریت میشه، بنابراین هر نخ فیزیکی در پردازنده قادر خواهد بود صد ها نخ که توسط برنامه های سیستم عامل ایجاد میشن رو پردازش کنه؛ با این روش در واقع یک موازی سازی مجازی (virtual parallization) ایجاد میشه و اصطلاحا میگیم همزمانی (concurrency) رخ داده.
در زیر یک رابطه ی ساده هنگام سوییچ کردن بین دونخ توسط سیستم عامل به صورت تصویری نمایش داده شده است.
در تصویر سیستم عامل نخ thread(m) رو به طور موقت متوقف می کنه و با وضعیت فعلی که پردازش شده در حافظه ی موقت (RAM) ذخیره میکنه و سپس نخ thread(n) رو از اخرین وضعیت ذخیره شده ی خودش تو حافظه ی موقت صدا میکنه و به پردازنده برای ادامه ی پردازش ارسالش می کنه، تمام این کار ها از ذخیره ی یک نخ، صدا زدن نخ دیگه از حافظه ی موقت و پردازش نخ توسط پردازنده در کسری از ثانیه صورت می گیره و زمانی که کار پردازش نخ تموم بشه، نخ از چرخه خارج میشه.
آشنایی با چندکارگی (multitasking) و چند پردازشی (multiprocessing)
دوتا از تعاریفی که ممکنه با چند نخی (multithreading) به اشتباه گرفته بشه عبارتند از چندکارگی (multitasking) و چند پردازشی (multiprocessing) برای درک بهتر یک اشاره ی کوتاهی به این دو تعریف می کنیم.
تعریف چندکارگی (multitasking)
هر اپلیکیشن میتونه یک پردازش و چند نخ رو ایجاد کنه، به مدیریت و اجرای چند پردازش و نخ توسط سیستم عامل (Operating System)، multitasking گفته میشه؛ درواقع multitasking یک قابلیت در سیستم عامل است که سیستم عامل چندین کار رو مدیریت و اجرا می کنه.
تعریف چند پردازشی (multiprocessing)
به چندین پردازش توسط چندین پردازنده (هسته های پردازنده) چند پردازشی (multiprocessing) میگن.
چند نخی در زبان های برنامه نویسی
در بسیاری از زبان های برنامه نویسی کتابخونه های استاندارد برای پشتیبانی از قابلیت چندنخی (multithreading) وجود داره.
در زبان های برنامه نویسی معمولا یک نخ اصلی به نام main-thread وجود داره و فعالیت های برنامه به طور پیشفرض روی main-thread قرار داره، سپس برنامه نویس میتونه با ایجاد نخ های دیگه بعضی از فعالیت های برنامه مثل خوندن و نوشتن فایل، دانلود از اینترنت، پردازش های سنگین و ... رو روی نخ هایی که ایجاد میکنه انجام بده؛ این کار به بهبود عملکرد برنامه کمک میکنه و برنامه هنگام اجرای یک کار مسدود نمیشه.
کتابخونه های چند نخی در بعضی از زبان های برنامه نویسی
در جاوا میتونیم یک نخ رو با کلاس Thread ایجاد کنیم و همچنین برای تولید ThreadPool از پیاده سازی های ExecutorService استفاده می کنیم.
در کاتلین علاوه بر امکان استفاده از کتابخونه های جاوا یک کتابخونه ی اختصاصی به نام کراتین (Coroutines) وجود داره که برای استفاده از قابلیت های چند نخی در زبان برنامه نویسی کاتلین پیاده سازی شده است.
خلاصه
- به مدیریت و اجرای کار ها (پردازش و نخ ها) multitasking میگن.
- به چندین پردازش توسط چندین پردازنده (هسته های پردازنده)، چند پردازشی میگن.
- با چند نخی یک برنامه میتونه به طور همزمان چند کار رو انجام بده.
- نخ های ایجاد شده از برنامه های سیستم عامل، توسط سیستم عامل به ترتیب اولویت داخل یک صف قرار میگیرن و به پردازنده برای پردازش ارسال میشن.
- با قابلیت چندنخی عملکرد برنامه هنگام انجام یک کار مختل نمیشه و برنامه میتونه هم زمان چند کار رو انجام بده.