випадку, коли він попадає в призначений діапазон. Спроба використовувати адресу з проміжків між призначеними областями викликає переривання, що може бути перехоплено самим процесом, якщо він цього побажає.
Ключовим поняттям, зв'язаним з використанням ВАП, є об'єкт пам'яті (memory object). Об'єкт пам'яті може бути чи сторінкою набором сторінок, а також може бути файлом чи іншою, більш спеціальною, структурою даних, наприклад, записом бази даних. Об'єкт пам'яті може бути відображений у не використовувану частину ВАП, формуючи нову область. Коли файл відображений у ВАП, то його можна читати, в нього можна писати за допомогою звичайних машинних команд. Відображені (mapped) файли посторінково витісняються з пам'яті звичайним чином. Коли процес завершується, то його відображені в пам'ять файли автоматично повертаються у ФС разом із усіма змінами, що відбулися з їхнім змістом у той час, коли вони були відображені в пам'ять. Також можливо скасувати відображення файлу чи іншого об'єкта пам'яті, звільняючи його адресний простір і роблячи його доступним для послідовного його розподілу чи відображення.
Звичайно, відображення файлів у пам'ять не єдиний спосіб доступу до них. Їхній уміст можна читати і звичайним способом. Однак і в цьому випадку бібліотечні функції можуть відображати файли в пам'ять крім бажання користувача, а не використовувати систему в/в. Такий спосіб дозволяє сторінкам файлів використовувати систему ВП, а не спеціально виділені буфери де-небудь у системі.
2.6. Комунікації в ядрі Mach
Основною метою, що ставили перед собою розроблювачі засобів комунікації ядра Mach, була підтримка різних стилів комунікацій у сполученні з надійністю і гнучкістю. Комунікаційні засоби ядра Mach можуть підтримувати асинхронну передачу повідомлень, RPC, потоки байт (streams), а також інші способи. Механізм взаємодії процесів Mach базується на відповідних механізмах своїх попередників - RІ і Accent. Через свій еволюційний розвиток цей механізм пристосований більше для локального використання, а не для розподілених систем.
Спочатку розглянемо випадок одного вузла, а потім розширимо його для мережі. Слід зазначити, що мультипроцесор - це теж один вузол, тому взаємодія процесів, що працюють на різних процесорах багатопроцесорної машини, також відноситься до локального випадку.
2.6.1. Порти
Основою всіх комунікацій у Mach є структура даних ядра, яку називають портом. У сутності порт являє собою захищену поштову скриньку. Коли нитка одного процесу хоче взаємодіяти з ниткою іншого процесу, то нитка-відправник записує повідомлення в такий порт, а нитка-одержувач витягає його відтіля. Кожен порт має засоби захисту, що гарантують, що тільки процеси, що мають відповідні права, можуть передавати й одержувати через нього повідомлення.
Порт підтримує взаємодію подібно конвеєрам (pіpes) у UNІХ. Порт, що може бути використаний для відправлення запиту від клієнта серверу, не може використовуватися для відправлення відповіді від сервера клієнту. Для цього потрібний другий порт. У кожного порту може бути тільки один процес, що читає з нього повідомлення, і кілька процесів, що пишуть у порт.
Порти підтримують надійний і послідовний обмін повідомленнями. Якщо нитка посилає повідомлення в порт, то система гарантує, що воно буде доставлено. Повідомлення ніколи не губляться через помилки, переповнення або з інших причин (принаймні, якщо немає відмовлень апаратури). Також гарантується, що повідомлення, відправлені однією ниткою, будуть отримані в тому ж порядку. Якщо ж дві нитки пишуть у той самий порт позмінно, то система не дає ніяких гарантій про послідовність повідомлень, тому що в ядрі повідомлення буферизуются. На відміну від конвеєра, порти підтримують потік не байтів, а повідомлень. Кілька повідомлень ніколи не з'єднуються разом в одне повідомлення.
Коли порт створюється, виділяється 64 байта з простору ядра і вони використовуються доти, поки порт не зруйнований, або явно, або побічно, при визначених обставинах, наприклад, коли не виявиться в наявності жодного процесу, що використовує цей порт.
Самі повідомлення зберігаються не в порту, а в іншій структурі даних ядра, названою чергою повідомлень. Порт містить лічильник, у якому зберігається поточна кількість повідомлень, що знаходяться в черзі, і максимально можливе число повідомлень у черзі. Якщо порт відноситься до якого-небудь набору портів, то порт зберігає покажчик на структуру даних набору портів. Процес може надати іншим процесам права на використання його портів. По різних причинах ядро повинне знати, скільки прав кожного типу надано, тому порт зберігає їхню кількість.
Якщо при використанні порту виникає помилка, то про неї повідомляється шляхом посилки повідомлень на інші порти, чиї права зберігаються тут. Нитки можуть бути заблоковані при читанні з порту, тому в структуру порту включений покажчик на список заблокованих ниток. Також важлива можливість прав на читання з порту (він може бути тільки один), тому така інформація теж зберігається в структурі даних порту. Якщо порт являє собою порт процесу, то наступне поле містить покажчик на процес, до якого порт відноситься. Якщо це порт нитки, то це поле містить покажчик на структуру даних ядра для нитки, і так далі.
Коли нитка створює порт, то у відповідь вона одержує ціле число, що ідентифікує порт, аналогічне дескриптору файлу в UNІХ. Це число використовується в послідовних викликах, за допомогою яких посилаються повідомлення порту або приймаються повідомлення від нього, для того, щоб ідентифікувати, який порт потрібно використовувати. Порти зберігаються для процесів, а не для ниток, так що якщо одна нитка створює порт і одержує у відповідь ідентифікатор, то інша нитка того ж процесу ніколи не одержить цей ідентифікатор при створенні порту. Фактично ядро не запам'ятовує інформацію про