ویندوز و سیستمعاملهای دیگر چگونه از چند هسته در پردازنده استفاده میکنند؟
پردازندههای چندهستهای از چندین سال پیش در انواع کامپیوترهای شخصی دیده میشوند و بهرهبرداری از آنها، موجب افزایش سرعت و کارایی سیستمها شده است. بهعنوان کاربر دنیای فناوری شاید این سؤالها برایتان مطرح شده باشد: ویندوز یا دیگر سیستمعاملها چگونه از قابلیت پردازندههای چندهستهای استفاده میکنند؟ وقتی کاربرد چند هسته جزو خصوصیات سختافزاری محسوب میشود، هستههای چگونه اجرای اپلیکیشنها را اولویتدهی و بین خود تقسیم میکنند؟ میتوان اپلیکیشنها و سیستمعامل را بهگونهای پیکربندی کرد که استفادهی بهتر و بیشتری از هستههای بیشتر داشته باشند؟ درادامهی این مطلب زومیت، تا حدودی به این پرسشها پاسخ میدهیم.
زمانیکه کامپیوتر خود را روشن میکنید و پیش از اجرای سیستمعامل، پردازندهی اصلی و مادربرد باهم ارتباط برقرار میکنند (اصطلاح Handshake). پردازندهی مرکزی اطلاعات مشخصی دربارهی خصوصیات عملیاتی خود به مادربرد و بخش UEFI میفرستد. بخش مذکور از اطلاعات دریافتشده برای راهاندازی اولیهی مادربرد و بوتکردن سیستم استفاده میکند.
پیش از اجرای سیستمعامل، پردازنده و مادربرد اطلاعاتی را برای تنظیمات ابتدایی ردوبدل میکنند
در علوم کامپیوتر، رشته (Thread) به کوچکترین واحد اجرایی میگوییند که سیستم برنامهریز سیستمعامل اجرا میکند. برای درک بهتر، رشته را میتوان با مرحلهای در خط مونتاژ شبیه دانست. یک سطح بالاتر از رشته، فرایند (Process) قرار دارد. فرایندها برنامههای کامپیوتری هستند که در یک یا چند رشته اجرا میشوند. در مثال خطتولید، فرایند را میتوان کل مراحل تولید هر محصول دانست که رشته هریک از وظایف در آن مراحل تولیدی است.
تا اینجا میدانیم پردازندهها تنها میتوانند در هر لحظه، یک رشته را اجرا کنند. هر فرایند نیز حداقل به یک رشته نیاز دارد. اکنون این سؤال ایجاد میشود: چگونه کارایی و قدرت کامپیوتر را افزایش دهیم؟ پاسخ در افزایش سرعت کلاک پردانده نهفته است. قانون مقیاسدهی دنارد از دههها پیش بهعنوان راهکار عملی افزایش سرعت و کارایی در پردازندهها شناخته میشد. اگرچه قانون مور مشخص کرد میتوان ترانزیستورهای بیشتری با گذشت زمان در فضاهای کوچکتر جانمایی کرد، قانون دنارد بود که باعث دستیابی به سرعت کلاک بیشتر در ولتاژ مصرفی کمتر شد.
اگر کامپیوتری بتواند با سرعت مناسبی وظایف خود را انجام دهد، ضعف احتمالی آن در مدیریت بیش از یک رشته، آنچنان مشکلزا نخواهد بود. البته همه میدانیم وظایف پردازشی در جهان وجود دارند که حلکردن آنها در کامپیوتر کلاسیک به زمانی حتی بیش از زمان حیات جهان هستی نیاز دارد. بهجز آن موارد خاص، کامپیوترهای سریع در حلکردن سایر وظایف مشکل خاصی ندارند؛ وظایفی که کم هم نیستند.
با سریعترشدن کامپیوترها، توسعهدهندهها بهمرور نرمافزارهای پیچیدهتری تولید کردند. همین روند نیاز به پردازش در چند رشته را افزایش داد. در سادهترین شیوهی پردازش چندرشتهای (موسوم به Coarse-Grained)، سیستمعامل بهجای منتظرماندن برای نتیجهی یک حساب در یک رشته، از رشتهای دیگر برای انجام وظیفه استفاده میکند. چنین روندی در دههی ۱۹۸۰ مرسوم شد که کلاک CPU و RAM در حال جداسازی از یکدیگر بود. در آن دوران، سرعت حافظه و پهنای باند آن، هر دو با سرعتی بسیار آهستهتر از سرعت کلاک پردازنده رشد میکردند. تولد حافظهی کش به این معنا بود که پردازندهها میتونند مجموعههای کوچک دستورالعمل را برای انجام حساب سریع و کوتاه، نزد خود نگه دارند. همچنین، پردازش چندرشتهای مطمئن میشد پردازندهها همیشه وظیفهای برای انجامدادن داشته باشند.
توسعه و انتشار نرمافزارهای پیچیدهتر، نیاز به پردازندههای چندهستهای را بهوجود آورد
فراموش نکنید توضیحات مذکور همگی پردازش در پردازندهی تکهستهای را شرح میدهند. امروزه، اصطلاحهای چندرشتهای و چندپردازشی اغلب با معنای مشترکی بهکار میروند. البته چنین معنای مشترکی همیشه استفاده نمیشود و دو مفهوم جدا به نامهای Symmetric Multiprocessing و Symmetric Multithreading داشتیم که درادامه هرکدام را شرح میدهیم.
SMT: پردازنده میتواند همزمان بیش از یک رشته را اجرا کند. این فرایند با برنامهریزی رشتهی دوم بهصورتی انجام میشود که رشتهی مذکور بتواند از واحدهای اجرایی خالی استفاده کند که رشتهی اول اشغال نکرده است. اینتل فناوری مذکور را بهنام Hyper-Threading میشناسد و AMD همان نام SMT را استفاده میکند. درحالحاضر، هر دو تیم آبی و قرمز از SMT برای افزایش کارایی پردازنده استفاده میکنند و روند استراتژیک خاص خود را برای پیادهسازی فناوری داشتند و آن را در محصولات خاصی ارائه میکردند. امروزه، اکثر محصولات از اینتل و AMD به قابلیت SMT مجهز هستند. پیادهسازی SMT در محصولات مصرفکننده، یعنی پردازندههای با تعداد دوبرابر رشته نسبت به هستهها داریم (مثلا پردازندهای با هشت هسته و شانزده رشتهی پردازشی).
SMP: پردازنده بیش از یک هستهی پردازشی دارد یا از مادربردی چندسوکتی استفاده میکند. هر هستهی پردازشی، تنها یک رشته را اجرا میکند؛ درنتیجه تعداد رشتههایی که در هر چرخهی کلاک اجرا میشوند، به تعداد هستههای شما محدود خواهد بود؛ مثلا پردازندههای هشتهستهای با هشت رشتهی پردازشی.
فرایندهای چندرشتهای در مفاهیم تکهستهای به این معنا بود که پردازندهی شما با چه سرعتی میتواند بین رشتهها جابهجا شود نه اینکه پردازندهی شما میتواند بیش از یک رشته را در آن واحد اجرا کند یا خیر.
بهینهسازی جریان کاری و نقش سیستمعامل
پردازندههای مدرن حتی آنهایی که بیست سال پیش با معماری x86 ساخته شدند، مفهومی بهنام Out of Order Execution یا OoOE را بهکار میگیرند. تمامی هستههای پردازندهی مدرن و قدرتمند، همچون هستههای big در معماری big.LITTLE پردازندههای گوشی هوشمند، طراحی OoOE دارند. این پردازندهها دستورالعملهای دریافتی را بهصورت آنی در ساختار جدید مرتب میکنند تا اجرای آنها بهینهسازی شود.
پردازندهی مرکزی کدی را اجرا میکند که از سمت سیستمعامل ارسال شده است؛ اما سیستمعامل نقشی در اجرای دستورالعملها ندارد. وظیفهی مذکور بهصورت داخلی در پردازنده مدیریت میشود. پردازندههای مدرن x86 هر دو از بازتنظیم ترتیب دستورالعملهای دریافتی استفاده و دستورالعملهای x86 را به فعالیتهای کوچکتر سبک RISC تبدیل میکنند. اختراع OoOE باعث شد مهندسان بتوانند بدون وابستگی به توسعهدهندگان برای نوشتن کد عالی و بهینه، بهرهوری مناسب و مشخصی در پردازندهها تضمین کنند. اجازهدادن به پردازندهی مرکزی برای مرتبکردن مجدد دستورالعملها، حتی در مفهوم تکهستهای هم به افزایش بهرهوری سیستم چندرشتهای هم میانجامد. فراموش نکنید پردازندهی مرکزی همیشه درحال جابهجاشدن بین وظایف است؛ حتی اگر شما متوجه آن نشوید.
پردازندهی مرکزی با وجود تمام قابلیتهایی که در سطح مهندسی دریافت میکند، نقشی در برنامهریزی خودش ایفا نمیکند و سیستمعامل این وظیفه را برعهده دارد. ظهور پردازندههای چندرشتهای نیز این مفهوم و ترتیب را تغییر نداد. وقتی اولین برد دوپردازندهای مخصوص مصرفکننده (ABIT BP6) معرفی شد، علاقهمندان به پردازشهای چندرشتهای مجبور شدند از ویندوز NT یا ویندوز ۲۰۰۰ استفاده کنند. خانوادهی Win9X از پردازش چندهستهای پشتیبانی نمیکرد.
پشتیبانی از اجرای فرایندها در چند هستهی پردازنده به قابلیتهایی اساسی در سیستمعامل نیاز دارد. سیستمعامل باید بتواند تمامی وظایف قبلی شامل مدیریت حافظه و تخصیص منابع را انجام دهد که از اختلال در سیستمعامل بهدست اپلیکیشنها جلوگیری میکرد. دراینمیان، وظیفهای جدید هم به آن اضافه میشود تا هستههای پردازنده را از ایجاد اختلال در فرایندهای یکدیگر منع کند.
پردازندههای چندهستهای مدرن لزوما به «واحد برنامهریز مرجع» مجهز نیستند؛ واحدی که بتواند وظیفهها را بین هستهها تقسیم یا بهنوعی جریان کاری توزیع کند. درنتیجه چنین وظیفهای را سیستمعامل برعهده دارد.
میتوان ویندوز را با هدف بهرهبرداری بهتر از هستهها پیکربندی کرد؟
بهطورکلی، پاسخ به این پرسش منفی است. البته برخی اوقات برای بهرهبرداری از قابلیتهای جدید پردازندهای چندهستهای، به بهروزرسانی ویندوز نیاز است؛ اما چنین پیکربندیهایی در داخل مایکروسافت انجام میشود و کاربر نهایی نقشی در بهینهسازیها ایفا نمیکند. درنهایت، استثناهای بسیار محدودی وجود دارد که بررسی آنها خالی از لطف نیست.
پردازنده AMD 2990WX بهنوعی استثنایی برای قانون مذکور محسوب میشود. این پردازنده عملکردی تقریبا ضعیف در ویندوز دارد؛ چون مایکروسافت وجود بیش از یک نود NUMA را در پردازنده تفسیر نمیکند و درنتیجه، از تمامی منابع 2990WX استفاده نمیشود. در برخی موارد، راهکارهایی برای بهبود کارایی این پردازنده در ویندوز وجود دارد که به پیکربندیهای دستی نیاز دارد. البته همهی کارشناسان این تغییرات دستی در رشتههای پردازشی را تأیید نمیکنند و آنها استفاده از لینوکس را برای پردازندهی مذکور پیشنهاد میدهند.
پردازندهی 3990X استثنای بزرگتری در قانون تغییر پیکربندی برای بهرهوری بیشتر است. ویندوز ۱۰ گروههای پردازنده را به ۶۴ رشته محدود میکند؛ درنتیجه، نمیتوانید بیش از ۵۰ درصد از منابع اجرایی 3990X را به جریان کاری واحد اختصاص دهید؛ مگر اینکه اپلیکیشن مدنظر از برنامهریز اختصاصی استفاده کند. بهدلیل همین محدودیتها، 3990X برای اکثر اپلیکیشنها پیشنهاد نمیشود و تنها در ابزارهای رندر و دیگر اپلیکیشنهای حرفهای کاربرد دارد که از برنامهریز اختصاصی بهره میبرد.
مثالهای یادشده نشان داد تغییر دستی پیکربندی برای افزایش کارایی سیستمعامل در پردازندههای چندهستهای، به پردازندههایی محدود میشود که از بیشترین تعداد هسته برخوردار است. در حالت دیگر، کاربر امکان تغییر و بهینهسازی چندان زیادی نخواهد داشت؛ البته چنین محدودیتی بهنفع خود کاربر هم تمام میشود. کاربر نهایی نباید نگران اختصاصدادن رشتههای پردازشی با هدف بهحداکثررساندن کارایی در پردازنده باشد؛ چون پیکربندی بهینه براساس وظایفی که پردازنده در لحظه انجام میدهد، بهصورت خودکار پیادهسازی میشود. درنهایت، پیشرفتهای آتی در دنیای کامپیوتر همگی به این سمت پیش میروند که هماهنگی پردازنده و سیستمعامل به حداکثر برسد و اولویتدهی به وظایف سریعتر انجام شود.