ماشین‌های مجازی: اجرای چند سیستم مجزا روی یک کامپیوتر

یک کامپیوتر فیزیکی واحد می‌تواند به‌نظر برسد چند سیستم‌عامل کاملاً مجزا را هم‌زمان اجرا می‌کند، هرکدام بی‌خبر از وجود دیگری. این مقاله توضیح می‌دهد یک ماشین مجازی واقعاً چیست، یک هایپروایزر چگونه این توهم را مدیریت می‌کند، و چرا این فناوری هم برای تجمیع سرور و هم امنیت سیستم اهمیت دارد.

مجازی‌سازی سخت‌افزاریماشین‌های مجازیهایپروایزر

~3 دقیقه مطالعه · آخرین به‌روزرسانی ۱۵ شهریور ۱۴۰۵

یک ماشین مجازی واقعاً چیست

یک Virtual Machine (VM) یک محیط ایجادشده توسط نرم‌افزار است که مانند یک کامپیوتر کامل و مستقل رفتار می‌کند، قادر به اجرای سیستم‌عامل و برنامه‌های خودش، حتی اگر واقعاً همان سخت‌افزار فیزیکی زیربنایی را با ماشین‌های مجازی دیگر به اشتراک بگذارد.

نرم‌افزاری که این کار را ممکن می‌کند

یک لایه نرم‌افزاری خاص به نام Hypervisor (که Virtual Machine Monitor نیز نامیده می‌شود) بین سخت‌افزار فیزیکی و هر ماشین مجازی قرار می‌گیرد، و هر تلاش یک سیستم‌عامل مهمان برای دسترسی به منابع سخت‌افزاری واقعی مانند پردازنده، حافظه، و ذخیره‌سازی را رهگیری و مدیریت می‌کند.

سخت‌افزار فیزیکی
       ↓
    هایپروایزر
   ↙    ↓    ↘
 VM 1   VM 2   VM 3
(هرکدام در حال اجرای
 سیستم‌عامل مستقل خودش)

پشتیبانی سخت‌افزاری چگونه مجازی‌سازی را بهبود می‌بخشد

مجازی‌سازی اولیه به‌شدت به تکنیک‌های نرم‌افزاری برای رهگیری و ترجمه عملیات‌های ممتاز متکی بود، که سربار کارایی معناداری معرفی می‌کرد. پردازنده‌های امروزی، از جمله بسیاری از پیاده‌سازی‌های RISC-V، شامل Hardware Virtualization Extensions اختصاصی هستند که اجازه می‌دهند دستورات ممتاز یک سیستم‌عامل مهمان با سربار بسیار کمتری مدیریت شوند، چون خود پردازنده می‌تواند مستقیماً بسیاری از عملیات‌های مرتبط با مجازی‌سازی را تشخیص و مدیریت کند به‌جای نیاز به دخالت هایپروایزر در نرم‌افزار برای هر تک عملیات.

چرا ایزوله‌سازی اهمیت دارد

یک ویژگی حیاتی ماشین‌های مجازی Isolation است: یک خطا، کرش، یا نقض امنیتی درون یک ماشین مجازی نباید بتواند روی دیگرانی که همان سخت‌افزار فیزیکی را به اشتراک می‌گذارند تأثیر بگذارد. این ایزوله‌سازی توسط هایپروایزر اجرا می‌شود، که با دقت دسترسی هر ماشین مجازی به حافظه و سایر منابع را کنترل می‌کند، و از خواندن یا خراب کردن داده یک مهمان دیگر توسط یک مهمان جلوگیری می‌کند.

کاربردهای عملی ماشین‌های مجازی

  • Server Consolidation: اجرای چند بار کاری با بار سبک به‌عنوان ماشین‌های مجازی مجزا روی یک سرور فیزیکی قدرتمند به‌جای اختصاص یک ماشین فیزیکی کامل به هر بار کاری، که بهره‌برداری کلی از سخت‌افزار را بهبود می‌بخشد.
  • Testing and Development: اجرای نسخه‌ها یا پیکربندی‌های مختلف سیستم‌عامل روی همان ماشین فیزیکی بدون نیاز به سخت‌افزار اختصاصی جداگانه برای هرکدام.
  • Security Isolation: اجرای یک برنامه غیرقابل‌اعتماد یا آزمایشی درون ماشین مجازی خودش، که آسیب بالقوه را در صورتی که آن برنامه در نهایت مورد نفوذ قرار گرفته یا مخرب باشد محدود می‌کند.

چرا این فناوری برای محاسبات مدرن اهمیت دارد

ماشین‌های مجازی پایه فنی زیربنای بیشتر پلتفرم‌های محاسبات ابری امروزی را تشکیل می‌دهند، که اجازه می‌دهند یک ارائه‌دهنده ابری برش‌های دقیقاً اندازه‌گذاری‌شده از سخت‌افزار فیزیکی را به‌طور هم‌زمان به بسیاری از مشتریان مختلف اجاره دهد، هرکدام باور دارند به کامپیوتر اختصاصی خودشان دسترسی دارند، در حالی که سخت‌افزار زیربنایی به بهره‌برداری کلی بسیار بالاتری نسبت به اختصاص ماشین‌های فیزیکی به‌طور جداگانه دست می‌یابد.

نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

Hardware Multithreading: پنهان کردن تأخیر با جابه‌جایی بین وظایف

Hardware Multithreading: پنهان کردن تأخیر با جابه‌جایی بین وظایف

ادامه

چرا برنامه‌نویسی موازی سخت است و سیستم‌های موازی چگونه دسته‌بندی می‌شوند

نوشتن نرم‌افزاری که به‌درستی و کارآمد از چند پردازنده استفاده کند، اساساً سخت‌تر از نوشتن کد پی‌درپی است. این مقاله توضیح می‌دهد چرا برنامه‌نویسی موازی چالش‌های منحصربه‌فردی درباره هماهنگی و بازده کاهشی معرفی می‌کند، سپس طبقه‌بندی کلاسیک فلین را پوشش می‌دهد که سخت‌افزار موازی را به SISD، MIMD، SIMD، و مدل‌های مرتبط دسته‌بندی می‌کند.

ادامه

<h2>Real Stuff: Memory Hierarchies in Commercial Processors</h2> <p>Real processors implement the caching and memory concepts covered throughout this chapter with specific, carefully chosen parameters. Both the <code>ARM Cortex-A53</code> and <code>Intel Core i7</code>, discussed earlier in this series regarding pipeline design, also differ meaningfully in their memory hierarchies: mobile-oriented designs like the Cortex-A53 typically use smaller cache sizes at each level to conserve power and die area, while performance-oriented designs like the Core i7 use larger, multi-level caches, often three levels deep, to minimize average memory access time at the cost of additional power and chip area.</p> <h2>Applying Cache Concepts: Cache Blocking for Matrix Multiply</h2> <p>Matrix multiplication, discussed earlier in this series regarding subword parallelism and instruction-level parallelism, can also be optimized specifically for the memory hierarchy using a technique called <code>Cache Blocking</code> (also called <code>Tiling</code>). Rather than processing an entire large matrix row by row, which can repeatedly evict useful cached data due to capacity misses discussed earlier in this series, the matrix is divided into smaller sub-blocks sized specifically to fit within the cache.</p> <pre class="code-block"><code>Without blocking: Large matrix accessed row-by-row, repeatedly evicting data still needed later, causing many capacity misses With blocking: Matrix divided into smaller sub-blocks that fit entirely within the cache, each sub-block fully processed before moving to the next</code></pre><br> <p>By ensuring each sub-block's data remains in the cache throughout its processing, cache blocking significantly reduces the number of capacity misses, directly applying the locality principles introduced earlier in this series to a real, widely used computational workload.</p> <h2>Common Fallacies About Memory Hierarchies</h2> <ul> <li>Assuming a larger cache is always better — as discussed earlier regarding cache performance tradeoffs, a larger cache increases hit time and cost even as it reduces capacity misses.</li> <li>Assuming virtual memory and caching are unrelated systems — as shown earlier in the unified framework covering block placement, identification, replacement, and write policy, they answer the exact same underlying questions.</li> <li>Assuming a cache miss always costs the same amount of time — as discussed earlier regarding the three types of misses, the actual cost depends heavily on which level of the memory hierarchy must ultimately satisfy the request.</li> </ul> <h2>Common Pitfalls in Memory-Sensitive Code</h2> <ul> <li>Writing code with poor spatial locality, such as accessing array elements in a non-sequential pattern, which defeats the benefit of the block-based caching discussed earlier in this series.</li> <li>Ignoring the load-use hazard discussed earlier in this series when reasoning about why memory-heavy code sometimes performs worse than expected despite a seemingly efficient algorithm.</li> <li>Overlooking multicore cache coherence overhead, discussed earlier in this series, when writing parallel code that frequently modifies shared data across cores.</li> </ul> <h2>Chapter Summary: The Full Memory Hierarchy Picture</h2> <p>This chapter traced the path from the smallest and fastest storage to the largest and slowest: SRAM-based caches exploiting locality of reference, virtual memory providing both illusion of abundant memory and process isolation, dependable memory techniques protecting against silent data corruption, cache coherence keeping multicore systems consistent, and RAID protecting persistent storage against physical disk failure. Every one of these mechanisms exists because no single memory technology can be simultaneously fast, large, cheap, and reliable — a theme first introduced at the very start of this chapter and echoed in every technique built on top of it.</p>

مفاهیم نظری کش و حافظه در پردازنده‌های تجاری واقعی با چند سطح کش و اندازه‌های به‌دقت تنظیم‌شده شکل مشخصی به خود می‌گیرند. این مقاله سلسله‌مراتب حافظه واقعی در پردازنده‌های ARM و Intel را مقایسه می‌کند، نشان می‌دهد Cache Blocking چگونه ضرب ماتریس را در عمل تسریع می‌کند، و فصل سلسله‌مراتب حافظه را با پرداختن به تصورات غلط رایج به پایان می‌رساند.

ادامه

RAID: محافظت از داده با پخش آن روی چند دیسک

یک درایو ذخیره‌سازی واحد می‌تواند در هر لحظه خراب شود، و به‌طور بالقوه داده ارزشمند را بدون هیچ هشداری نابود کند. این مقاله توضیح می‌دهد RAID چگونه چند دیسک را ترکیب می‌کند تا قابلیت اطمینان، کارایی، یا هر دو را بهبود بخشد، و مبادلات بین رویکردهای mirroring، striping، و مبتنی بر پریتی را پوشش می‌دهد.

ادامه

انسجام کش: هماهنگ نگه‌داشتن چند هسته درباره حافظه

وقتی چند هسته پردازنده هرکدام کش خصوصی خودشان را دارند اما همان حافظه زیربنایی را به اشتراک می‌گذارند، یک مسئله جدی از نظر درستی پدیدار می‌شود: هسته‌های مختلف می‌توانند در نهایت دیدگاه‌های متناقضی از همان مکان حافظه داشته باشند. این مقاله توضیح می‌دهد انسجام کش یعنی چه، چرا در سیستم‌های چندهسته‌ای ضروری می‌شود، و پروتکل‌های مبتنی بر snooping چگونه داده کش‌شده هر هسته را سازگار نگه می‌دارند.

ادامه

کنترل یک کش با یک ماشین حالت متناهی

یک کش صرفاً به‌طور غیرفعال داده ذخیره نمی‌کند؛ منطق کنترلی سخت‌افزار باید چند گام مجزا را برای مدیریت درست یک miss طی کند. این مقاله توضیح می‌دهد یک ماشین حالت متناهی چگونه این منطق کنترلی را مدل می‌کند، حالت‌های درگیر در مدیریت یک cache hit و یک cache miss را مرور می‌کند، و نشان می‌دهد چرا این مدل رسمی طراحی کنترل‌کننده کش را برای استدلال درباره‌اش راحت‌تر می‌کند.

ادامه