برنامه نویسی

سیستم “MMAP” برای DBMS فراخوانی می کند

مگد، که مخفف است نقشه برداری حافظه، اجازه می دهد تا پرونده ها را به فضای حافظه مجازی یک فرآیند نقشه برداری کنید. بارگذاری موارد خاص باعث می شود که داده های مشترک در حافظه اولیه (مانند RAM) نگه داشته شوند ، که به طور قابل توجهی سریعتر از آن است ، می گویند HDD یا SSD.

به طور معمول با استفاده از mmap() تماس سیستم ارائه شده توسط اکثر سیستم عامل های مدرن.

MMAP چگونه کار می کند؟

وقتی یک پرونده است حافظه نقشه برداری، سیستم عامل در مورد آنچه می خواهد در حافظه بارگذاری کند ، و آنچه می خواهد در دیسک نگه دارد ، می گوید.

سیستم عامل بلافاصله کل پرونده را در حافظه بارگیری نمی کند و در عوض با طیف وسیعی از آدرس های حافظه مجازی همراه است.

همانطور که این برنامه به پرونده ای که حافظه نقشه برداری شده است می خواند یا می نویسد:

  • اگر صفحه قبلاً در حافظه بارگذاری شده باشد – موفقیت
  • اگر نه ، پس الف خطای صفحه رخ می دهد ، و کنترل به کنترل کننده خطای سیستم عامل به عنوان:
    1. سیستم عامل تعیین می کند که کدام پرونده و جبران با آدرس گسل مطابقت دارد.
    2. این یک صفحه حافظه فیزیکی (از RAM) اختصاص می دهد
    3. بلوک پرونده مربوطه را از دیسک به رم می خواند
    4. جدول صفحه را برای نقشه برداری صفحه مجازی به صفحه فیزیکی تازه بارگیری شده به روز می کند.
    5. آن را نشان می دهد فقط خواندنی یا قابل نوشتن بر اساس PROT_* پرچم ها

با این حال باید توجه داشت که حافظه ممکن است داشته باشد صفحات کثیف، اینترنت اکسپلورر که قبلاً در حافظه اولیه تغییراتی در آنها دارند ، که هنوز در دیسک به روز نشده اند. اگر سیستم عامل نیاز به نوشتن هر صفحه ای از این قبیل داشته باشد ، به آن نیز نیاز دارد سیاست شستشو برای رسیدگی به نحوه بازگشت داده ها به دیسک ، قبل از بازنویسی.

نمودار MMAP

مثال C برای MMAP

در اینجا یک مثال C با نظرات مفصل وجود دارد ، که نشان می دهد:

  • باز کردن یک پرونده

  • نقشه برداری آن به حافظه

  • خواندن از حافظه نقشه برداری شده

  • نوشتن برای آن

  • با استفاده از دیسک تغییر می کند msync()

  • خنثی کردن و بستن پرونده

#include 
#include 
#include       // For open()
#include    // For mmap()
#include    // For fstat()
#include      // For close(), lseek(), write()
#include      // For memcpy()

#define FILENAME "example_mmap.txt"
#define FILESIZE 4096  // 4KB

int main() {
    int fd;
    char *mapped;
    struct stat st;

    // Step 1: Open (or create) the file
    fd = open(FILENAME, O_RDWR | O_CREAT, 0666);
    if (fd == -1) {
        perror("open");
        return EXIT_FAILURE;
    }

    // Step 2: Ensure file is at least FILESIZE long
    if (ftruncate(fd, FILESIZE) == -1) {
        perror("ftruncate");
        close(fd);
        return EXIT_FAILURE;
    }

    // Step 3: Memory-map the file
    mapped = mmap(NULL, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (mapped == MAP_FAILED) {
        perror("mmap");
        close(fd);
        return EXIT_FAILURE;
    }

    printf("File successfully memory-mapped.\n");

    // Step 4: Read the first few bytes (may be zero if file is empty)
    printf("Initial contents: \"%.32s\"\n", mapped);

    // Step 5: Write something to the mapped region
    const char *msg = "Hello via mmap!\n";
    memcpy(mapped, msg, strlen(msg));  // Equivalent to writing into memory

    printf("Modified contents in memory: \"%.32s\"\n", mapped);

    // Step 6: Flush changes to disk
    if (msync(mapped, FILESIZE, MS_SYNC) == -1) {
        perror("msync");
    } else {
        printf("Changes successfully flushed to disk.\n");
    }

    // Step 7: Unmap memory and close the file
    if (munmap(mapped, FILESIZE) == -1) {
        perror("munmap");
    }

    close(fd);
    printf("File unmapped and closed.\n");

    return EXIT_SUCCESS;
}

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

چه زمانی از MMAP در DBMS استفاده کنید

MMAP به ویژه در مواردی مفید است:

  • حجم کار بسیار زیاد است.
  • حافظه سیستم برای مجموعه کاری حافظه پنهان کافی است.
  • سادگی و کمبود سر اولویت ها هستند.
  • شما به مکانیسم های تعویض و همگام سازی سیستم عامل اعتماد دارید.

ممکن است باشد پایین ترین برای سیستم های DBMS توزیع شده در مقیاس بزرگ ، مانند PostgreSQL یا MySQL ، که کنترل صریح بر I/O و ذخیره را ترجیح می دهند.

محدودیت ها و احتیاط ها

کنترل کمتر:

نمایندگان MMAP ذخیره و اخراج به سیستم عامل ، که ممکن است برای الگوهای خاص DBMS بهینه نباشد.

الگوهای I/O:

نوشتن تصادفی می تواند گسل های مکرر صفحه و صفحات کثیف ایجاد کند و منجر به ریختن شود.

قوام و همگام سازی:

برای اطمینان از قوام و دوام (به ویژه برای سیستم های مبتنی بر WAL) باید از MSync () یا mProtect () استفاده کنید.

قابلیت حمل:

برخی از سیستم عامل ها یا سیستم های فایل (به عنوان مثال ، شبکه FS) با MMAP غیرقابل پیش بینی رفتار می کنند.

محدودیت های فضای آدرس:

در سیستم های 32 بیتی ، شما توسط فضای آدرس مجازی محدود شده اید.

ملاحظات عملکرد استفاده از MMAP () در DBMS

در حالی که MMAP () می تواند پرونده I/O را ساده کند و در بعضی موارد مزایای عملکرد را ارائه دهد ، درک عملکردهای تجاری که هنگام استفاده در سیستم های پایگاه داده استفاده می کند ، مهم است:

advents مزایای بالقوه:

  • Zero-Copy I/O: از آنجا که MMAP () پرونده ای را مستقیماً در فضای آدرس فرآیند ترسیم می کند ، هسته می تواند از نسخه های صریح بین کاربر و فضای هسته جلوگیری کند و باعث بهبود کارایی I/O شود.
  • صفحه بندی در تقاضا: سیستم عامل فقط صفحات لازم را در حافظه بارگیری می کند ، که در صورت دسترسی به کل پرونده می تواند حافظه را ذخیره کند.
  • ذخیره خودکار صفحه: ذخیره سازی صفحه در سطح سیستم عامل می تواند منجر به زمان دسترسی سریع برای داده های خواندن مکرر شود ، بدون اینکه توسعه دهنده پایگاه داده نیاز به پیاده سازی یک لایه ذخیره سازی سفارشی داشته باشد.

⚠ مشکلات احتمالی

  • صفحه اصلی خطای صفحه: هر دسترسی به صفحه ای که هنوز بارگذاری نشده است ، باعث ایجاد خطای صفحه می شود که شامل یک سوئیچ زمینه است و در صورت عدم کارآمد بودن می تواند گران باشد.
  • کنترل کمتر بر برنامه ریزی I/O: بر خلاف استراتژی های Pread ()/pwrite () یا سفارشی خوانده شده ، MMAP () بسیاری از رفتارهای صفحه بندی و گرگرفتگی را به هسته بارگیری می کند. این می تواند به تأخیر غیرقابل پیش بینی ، به ویژه تحت فشار حافظه منجر شود.
  • تأخیر در نوشتن: صفحات کثیف در حافظه باید به دیسک شستشو داده شود. اگر گرگرفتگی سیستم عامل (به عنوان مثال ، از طریق mSync () یا madvise ()) با دقت اداره نشود ، عملیات نوشتن می تواند برای مدت طولانی مسدود شود و سنبله های تأخیر را معرفی کند.
  • تعامل با محدودیت حافظه مجازی: در سیستم ها یا محیط های 32 بیتی با فضای آدرس محدود ، نقشه برداری از پرونده های بزرگ می تواند حافظه مجازی را به سرعت خسته کند و حتی اگر رم فیزیکی در دسترس باشد ، باعث ایجاد مشکلات می شود.

📌 مثال

یک DBMS را با استفاده از MMAP () برای بارگیری یک پرونده 10 گیگابایتی تصور کنید. اگر این سیستم فقط 8 گیگابایت رم داشته باشد و مجموعه کار 7 گیگابایت باشد ، ممکن است همه چیز به راحتی اجرا شود. اما اگر الگوهای دسترسی تصادفی شوند یا مجموعه کار از حافظه موجود فراتر رود ، سیستم عامل ممکن است شروع به تعویض یا تهاجمی در صفحات کند و منجر به عملکرد و عملکرد تخریب شده شود.

مثال در دنیای واقعی: LMDB

  • LMDB منحصراً از MMAP استفاده می کند.
  • تمام عملیات DB از طریق دسترسی مستقیم به حافظه انجام می شود.
  • بدون استخر بافر ، بدون ورود به سیستم نوشتن-سیستم فایل و MMAP دوام را تحمل می کند.
  • صفحات برای حفظ جداسازی عکس فوری کپی هستند.

خلاصه

مگد در DBMS تکنیکی است که پرونده های پایگاه داده در آن قرار دارند از طریق حافظه قابل دسترسی است به جای پرونده دستی I/O. این طرح را با اجازه دادن به سیستم عامل ترجمه دیسک به حافظه اما با تجارت در کنترل ، پیش بینی و مقیاس پذیری همراه است. این ایده برای سیستم های تعبیه شده یا بهینه سازی شده ایده آل است ، کمتر برای موتورهای معامله ای پیچیده که نیاز به کنترل I/O ریز دانه دارند.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا