Кіріспе

Жад картасы POSIX стандатына сәйкес келетін жүйелік шақыру

Компьютерлік техникада, mmap(2) – файлдарды немесе құрылғыларды жадқа бейімдейтін POSIX стандатына сәйкес келетін Unix жүйелік шақыру. Бұл жадқа бейімделген файлдық кіріс-шығыс әдісі. Ол талап бойынша беттерді ауыстыруды іске асырады, себебі файлдың мазмұны бірден дискіден оқылмайды және бастапқыда физикалық жад еш пайдаланбайды. Дискіден нақты оқылымдар белгілі бір орналасқан жерге қол жеткеннен кейін ғана, жалқау түрде жүзеге асырылады. Егер бейімдеу қажет болмай қалса, көрсеткіштер munmap(2) көмегімен жадтан шығарылуы керек. Қорғау туралы ақпарат – мысалы, бейімделген аймақтарды орындалатын ретінде белгілеу – mprotect(2) арқылы басқарылуы мүмкін, ал ерекше өңдеу madvise(2) арқылы күшейтілуі мүмкін. Linux, macOS және BSD жүйелерінде mmap бірнеше түрлі бейімдеулерді құруға мүмкіндік береді. Басқа операциялық жүйелер олардың тек бір бөлігін ғана қолдауы мүмкін; мысалы, ортақ бейімдеулер VFS немесе жад кэші жоқ операциялық жүйеде тиімді болмауы мүмкін.

Тарих

Жад картасымен жұмыс жасайтын файлдардың бастапқы дизайны TOPS 20 операциялық жүйесінен туындаған. mmap және оған қатысты жүйелік шақырулар Unix-тің Беркли бағдарламалық таратуының (BSD) нұсқасының бір бөлігі ретінде әзірленген. Олардың API-ы 4.2BSD жүйелік нұсқаулығында сипатталған, бірақ ол осы шығарылымда да, 4.3BSD-де де іске асырылмаған. Дегенмен, Sun Microsystems компаниясы осы API-ны өздерінің SunOS операциялық жүйесінде іске асырған. Берклидегі Калифорния университетінің BSD әзірлеушілері Sun компаниясынан оның іске асырылуын беруді сұрады, бірақ нәтиже болмады; 4.3BSD Reno нұсқасы Mach виртуалды жад жүйесіне негізделген іске асырылумен шығарылды.

Файлмен қорғалған және анонимді

Файлмен сүйенетін карталау процестің виртуалды жадының бір бөлігін файлдарға байланыстырады; яғни, осы жад бөліктерін оқу файлдан мәліметтерді оқуға әкеледі. Бұл стандартты карталау түрі. Анонимді карталау процестің виртуалды жадының бір бөлігін файлға байланыстырмайды. Оның мазмұны нөлдермен толтырылады. Осы тұрғыдан анонимді карталау malloc-қа ұқсас, және кейбір malloc жүзеге асыруларында белгілі бір бөлулер үшін, әсіресе үлкендері үшін қолданылады. Анонимді карталау POSIX стандартының бөлігі емес, бірақ MAP_ANONYMOUS және MAP_ANON флагтары арқылы көптеген операциялық жүйелерде қолданылады.

Жад көрінісі

Егер карталау ортақ болса (MAP SHARED белгісі қойылған болса), онда процесс бұрқақталғанда (fork(2) жүйелік шақыруды пайдалану арқылы) сақталады. Сондықтан, карталанған аймаққа бір процесс жазған өзгерістер байланысты барлық процестерде (ата, бала немесе бауырлас) бірден көрінеді. Егер карталау ортақ болса және файлмен қамтамасыз етілсе (MAP ANONYMOUS емес), онда негізгі файлға жазу тек msync(2) жүйелік шақыру арқылы жіберілгеннен кейін ғана кепілдендіріледі. Керісінше, егер карталау жеке болса (MAP PRIVATE белгісі қойылған болса), өзгерістер басқа процестерге көрінбейді және файлға жазылмайды. Файлдан оқитын немесе жазатын процесс, файлды картаға түсірген басқа процесспен бірдей деректерді әрқашан көрмейді, себебі файлдың сегменттері RAM-ге көшіріледі және дискіге тек уақыт-уақытпен жадтан шығарылады. Синхрондауды msync(2) шақыру арқылы күштеп жүзеге асыруға болады. Файлдарда mmap пайдалану, бір файлға қол жеткізетін бағдарламалар үшін жадты үнемдеуге мүмкіндік береді; олар файлға қол жеткізгісі келетін әр бағдарлама үшін файлды жүктеудің орнына, файл қамтитын жад аймағын бөлісе алады. Бұл mmap(2) кейде Процестер Аралық Коммуникация (IPC) үшін қолданылады дегенді білдіреді. Қазіргі операциялық жүйелерде mmap(2) жүйелік V IPC ортақ жадынан (shmem) көбінесе артықшылыққа ие. Жүйелік V ортақ жады мен жадқа карталанған I/O (mmap) арасындағы басты айырмашылық – жүйелік V ортақ жадының тұрақтылығында: егер ол процесспен жойылмаса, ол жадыда сақталады және жүйе өшірілгенге дейін қолжетімді болады. mmap арқылы карталанған жад бағдарлама орындалулары арасында тұрақты емес (егер ол файлмен қамтамасыз етілмесе).

Деректер базасын іске асыруда пайдалану

mmap жүйелік шақыру түрлі дерекқоры жүзеге асыруларда буферлік жиынтықты іске асырудың орнына қолданылған, бірақ бұл буферлік жиынтықты қолдану арқылы ғана шешілетін жаңа проблемалар жиынтығын тудырды.