Я создаю NUMA-ориентированный распределитель памяти в пользовательском режиме для Linux. Распределитель во время своей инициализации захватывает большой кусок памяти, один кусок на узел NUMA. После этого страницы памяти, запрошенные пользователем, удовлетворяются, давая столько страниц памяти из большого пула чанков.
Если пользователь запрашивает n страниц, легко дать n страниц из определенного фрагмента. Но теперь я хочу реализовать политику распределения с чередованием, при которой пользователь получает по одной странице от каждого чанка с циклическим перебором до n страниц. Это поднимает проблему того, что виртуальные адреса этих страниц больше не являются смежными.
В1: Есть ли способ вернуть виртуально адресуемую непрерывную память? Единственное решение, которое я могу придумать, - это использование «умного» указателя, который умеет переходить с одной страницы на другую.
Одна из причин, по которой я иду по этому пути, заключается в том, что меня не устраивает политика выделения памяти MPOL_INTERLEAVE в linux, политика циклического перебора не является строгой (детерминированной).
В2. Существует ли недорогой способ узнать, какой странице и узлу NUMA сопоставлен данный диапазон виртуальных адресов? Точнее, я не знаю, как получить детальную информацию на уровне страниц из чтения / proc / / numa_maps.
Спасибо за ваши ответы.