Жаңа буынды файлдық I/O үшін mmap(2) жүйелік шақыруы туралы біліңіз. Файлдарды жадқа бейімдеу, физикалық жадты үнемдеу және деректерге жылдам қол жеткізу!
Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Жад картасы POSIX стандатына сәйкес келетін жүйелік шақыру
Memory map POSIX compliant system call
Компьютерлік техникада, mmap(2) – файлдарды немесе құрылғыларды жадқа бейімдейтін POSIX стандатына сәйкес келетін Unix жүйелік шақыру. Бұл жадқа бейімделген файлдық кіріс-шығыс әдісі. Ол талап бойынша беттерді ауыстыруды іске асырады, себебі файлдың мазмұны бірден дискіден оқылмайды және бастапқыда физикалық жад еш пайдаланбайды. Дискіден нақты оқылымдар белгілі бір орналасқан жерге қол жеткеннен кейін ғана, жалқау түрде жүзеге асырылады. Егер бейімдеу қажет болмай қалса, көрсеткіштер munmap(2) көмегімен жадтан шығарылуы керек. Қорғау туралы ақпарат – мысалы, бейімделген аймақтарды орындалатын ретінде белгілеу – mprotect(2) арқылы басқарылуы мүмкін, ал ерекше өңдеу madvise(2) арқылы күшейтілуі мүмкін. Linux, macOS және BSD жүйелерінде mmap бірнеше түрлі бейімдеулерді құруға мүмкіндік береді. Басқа операциялық жүйелер олардың тек бір бөлігін ғана қолдауы мүмкін; мысалы, ортақ бейімдеулер VFS немесе жад кэші жоқ операциялық жүйеде тиімді болмауы мүмкін.
In computing, mmap(2) is a POSIX compliant Unix system call that maps files or devices into memory. It is a method of memory mapped file I/O. It implements demand paging because file contents are not immediately read from disk and initially use no physical RAM at all. The actual reads from disk are performed after a specific location is accessed, in a lazy manner. After the mapping is no longer needed, the pointers must be unmapped with munmap(2). Protection information—for example, marking mapped regions as executable—can be managed using mprotect(2), and special treatment can be enforced using madvise(2). In Linux, macOS and the BSDs, mmap can create several types of mappings. Other operating systems may only support a subset of these; for example, shared mappings may not be practical in an operating system without a global VFS or I/O cache.
Тарих
Жад картасымен жұмыс жасайтын файлдардың бастапқы дизайны TOPS 20 операциялық жүйесінен туындаған. mmap және оған қатысты жүйелік шақырулар Unix-тің Беркли бағдарламалық таратуының (BSD) нұсқасының бір бөлігі ретінде әзірленген. Олардың API-ы 4.2BSD жүйелік нұсқаулығында сипатталған, бірақ ол осы шығарылымда да, 4.3BSD-де де іске асырылмаған. Дегенмен, Sun Microsystems компаниясы осы API-ны өздерінің SunOS операциялық жүйесінде іске асырған. Берклидегі Калифорния университетінің BSD әзірлеушілері Sun компаниясынан оның іске асырылуын беруді сұрады, бірақ нәтиже болмады; 4.3BSD Reno нұсқасы Mach виртуалды жад жүйесіне негізделген іске асырылумен шығарылды.
The original design of memory mapped files came from the TOPS 20 operating system. mmap and associated systems calls were designed as part of the Berkeley Software Distribution (BSD) version of Unix. Their API was already described in the 4.2BSD System Manual, even though it was neither implemented in that release, nor in 4.3BSD. Sun Microsystems had implemented this very API, though, in their SunOS operating system. The BSD developers at University of California, Berkeley unsuccessfully requested Sun to donate its implementation; 4.3BSD Reno was instead shipped with an implementation based on the virtual memory system of Mach.
Файлмен қорғалған және анонимді
Файлмен сүйенетін карталау процестің виртуалды жадының бір бөлігін файлдарға байланыстырады; яғни, осы жад бөліктерін оқу файлдан мәліметтерді оқуға әкеледі. Бұл стандартты карталау түрі. Анонимді карталау процестің виртуалды жадының бір бөлігін файлға байланыстырмайды. Оның мазмұны нөлдермен толтырылады. Осы тұрғыдан анонимді карталау malloc-қа ұқсас, және кейбір malloc жүзеге асыруларында белгілі бір бөлулер үшін, әсіресе үлкендері үшін қолданылады. Анонимді карталау POSIX стандартының бөлігі емес, бірақ MAP_ANONYMOUS және MAP_ANON флагтары арқылы көптеген операциялық жүйелерде қолданылады.
File backed mapping maps an area of the process's virtual memory to files; that is, reading those areas of memory causes the file to be read. It is the default mapping type. Anonymous mapping maps an area of the process's virtual memory not backed by any file. The contents are initialized to zero. In this respect an anonymous mapping is similar to malloc, and is used in some malloc implementations for certain allocations, particularly large ones. Anonymous mappings are not part of the POSIX standard, but are implemented in almost all operating systems by the MAP ANONYMOUS and MAP ANON flags.
Жад көрінісі
Егер карталау ортақ болса (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 арқылы карталанған жад бағдарлама орындалулары арасында тұрақты емес (егер ол файлмен қамтамасыз етілмесе).
If the mapping is shared (the MAP SHARED flag is set), then it is preserved when a process is forked (using a fork(2) system call). Therefore, writes to a mapped area in one process are immediately visible in all related (parent, child or sibling) processes. If the mapping is shared and backed by a file (not MAP ANONYMOUS) the underlying file medium is only guaranteed to be written after it is passed to the msync(2) system call. In contrast, if the mapping is private (the MAP PRIVATE flag is set), the changes will neither be seen by other processes nor written to the file. A process reading from, or writing to, the underlying file will not always see the same data as a different process that has mapped the file, since segments of the file are copied into RAM and only periodically flushed to disk. Synchronization can be forced with a call to msync(2). Using mmap on files can significantly reduce memory overhead for applications accessing the same file; they can share the memory area the file encompasses, instead of loading the file for each application that wants access to it. This means that mmap(2) is sometimes used for Interprocess Communication (IPC). On modern operating systems, mmap(2) is typically preferred to the System V IPC Shared Memory facility. The main difference between System V shared memory (shmem) and memory mapped I/O (mmap) is that System V shared memory is persistent: unless explicitly removed by a process, it is kept in memory and remains available until the system is shut down. mmap'd memory is not persistent between application executions (unless it is backed by a file).
Деректер базасын іске асыруда пайдалану
mmap жүйелік шақыру түрлі дерекқоры жүзеге асыруларда буферлік жиынтықты іске асырудың орнына қолданылған, бірақ бұл буферлік жиынтықты қолдану арқылы ғана шешілетін жаңа проблемалар жиынтығын тудырды.
The mmap system call has been used in various database implementations as an alternative for implementing a buffer pool, although this created a different set of problems that could realistically only be fixed using a buffer pool.