Как ведут себя сегменты одной страницы памяти, когда mlock'd? - PullRequest
0 голосов
/ 23 марта 2019

Страница man для этих системных вызовов указывает, что блокировка и разблокировка памяти выполняется в единицах целых страниц.

Предположим, что я вызвал mlock(2) для блокировки нескольких диапазонов адресов с одной страницы памяти.Если я вызову munlock(2) для одного из этих диапазонов, будет ли снята блокировка для всей страницы (т.е. неявно разблокирует все остальные диапазоны на странице)?или блокировка страницы сохраняется до тех пор, пока не будут освобождены все диапазоны адресов?

Редактировать: Чтобы уточнить, мой вопрос не о гранулярности mlock (страница руководства оченьясно с этой стороны).Мой вопрос о блокировке и разблокировке нескольких отдельных диапазонов на одной странице.Мой вопрос можно перефразировать следующим образом:

  • Реализует ли ядро ​​механизм, когда страница остается заблокированной, пока число mlocks превышает количество разблокировок?или
  • ядро ​​наивно разблокирует всю страницу, когда вызывается один munlock (независимо от того, сколько mlocks было вызвано ранее)?

1 Ответ

1 голос
/ 23 марта 2019

Если он блокирует или разблокирует, он делает это для всей страницы. Там нет меньшей степени детализации в ЦП (без учета сегментации x86, которая фактически отключена). ОС также не проверяет каждый доступ к памяти (будет слишком медленным, как при переходе на компьютеры 80-х годов).

Реализует ли ядро ​​механизм, при котором страница остается заблокированной, пока количество блокировок превышает количество разблокировок?

нет

Нет

Блокировки памяти не складываются, то есть страницы, которые были заблокированы несколько раз при вызовах mlock () или mlockall (), будут разблокированы одним вызовом munlock () для соответствующего диапазона или munlockall ().

...