مدل غالب: چندپردازندهسازی حافظه مشترک
گذار چندهستهای که پیشتر در این مجموعه بحث شد، دور شدن از هستههای تکسریع بهدلیل دیوار توان، پردازندههایی تولید کرد که چند هسته روی همان تراشه قرار دارند و دسترسی به همان حافظه اصلی را به اشتراک میگذارند. این طرح Shared Memory Multiprocessor نامیده میشود، و تا حد زیادی رایجترین معماری موازی در سختافزار مصرفی و سرور امروزی است.
چرا حافظه مشترک برنامهنویسی را ساده میکند
در یک سیستم حافظه مشترک، هر هسته میتواند مستقیماً هر مکانی در حافظه اصلی را بخواند یا بنویسد، با استفاده از همان فضای آدرس که هر هسته دیگر استفاده میکند. این یک مزیت قابلتوجه برای برنامهنویسان در مقایسه با سیستمهایی است که هر پردازنده حافظه کاملاً جداگانهای دارد، چون داده میتواند بین رشتهها صرفاً با دسترسی آنها به همان آدرس حافظه به اشتراک گذاشته شود، با تکیه بر مکانیزمهای انسجام کش که پیشتر در این مجموعه بحث شد برای سازگار نگهداشتن دید هر هسته.
Uniform Memory Access (UMA)
در یک طرح UMA (Uniform Memory Access)، هر هسته همان تأخیر دسترسی به هر مکانی در حافظه اصلی را تجربه میکند، صرفنظر از اینکه کدام هسته خاص درخواست را میدهد. این طرح از نظر مفهومی ساده است، اما مقیاسدهی آن به تعداد بسیار زیادی هسته دشوار میشود، چون همه هستهها برای دسترسی به همان مسیرهای حافظه مشترک رقابت میکنند.
Non-Uniform Memory Access (NUMA)
یک طرح NUMA (Non-Uniform Memory Access) این مسئله مقیاسدهی را با تقسیم فیزیکی حافظه به مناطق، که هرکدام نزدیکتر به یک گروه خاص از هستهها قرار دارند، حل میکند. یک هسته میتواند حافظه در منطقه نزدیک خودش را سریعتر از حافظه واقع نزدیک به گروه دیگری از هستهها دسترسی کند، حتی اگر کل فضای حافظه همچنان بهعنوان یک فضای آدرس یکپارچه واحد برای نرمافزار ظاهر شود.
UMA:
همه هستهها ↔ یک حافظه مشترک واحد،
همان تأخیر صرفنظر از اینکه کدام هسته دسترسی میکند
NUMA:
گروه هسته A ↔ حافظه محلی A (دسترسی سریع)
گروه هسته B ↔ حافظه محلی B (دسترسی سریع)
گروه هسته A ↔ حافظه B (دسترسی بینمنطقهای، کندتر)طرحهای NUMA به تعداد بسیار بزرگتری از هستهها نسبت به UMA مقیاس مییابند، به قیمت نیاز نرمافزار، و گاهی صراحتاً برنامهنویس، به آگاهی از اینکه کدام منطقه حافظه برای بهترین کارایی "نزدیکتر" است.
هماهنگی کار در سراسر هستهها
صرفنظر از اینکه یک سیستم از UMA یا NUMA استفاده کند، سیستمعامل نقش مرکزی در هماهنگی اجرای موازی ایفا میکند: اختصاص رشتههای مختلف به هستههای مختلف، مهاجرت رشتهها بین هستهها در صورت نیاز برای متعادلسازی بار، و تکیه بر عناصر پایه همگامسازی که پیشتر در این مجموعه بحث شد، مانند دستورات اتمیک و قفلها، تا اطمینان دهد رشتهها بهدرستی دسترسی به داده مشترک را هماهنگ میکنند.
چرا درک این تمایز اهمیت دارد
نرمافزار نوشتهشده بدون هیچ آگاهی از محلیت حافظه میتواند بهطور محسوسی روی سیستمهای NUMA بدتر عمل کند اگر رشتهها مکرراً به حافظهای که دور از هستهای که روی آن اجرا میشوند دسترسی داشته باشند. سیستمعاملها و نرمافزار توجهکننده به کارایی بهطور فزاینده توپولوژی NUMA را بهطور صریح در نظر میگیرند، و داده یک رشته را در حافظهای فیزیکاً نزدیک به هستهای که احتمالاً بیشتر به آن دسترسی پیدا میکند قرار میدهند.