У меня есть многопоточное приложение Linux, занимающее объем оперативной памяти около 150 МБ, когда я использую mlockall для блокировки всего процесса в памяти. Это сделано для того, чтобы можно было избежать сбоев страниц для некоторых потоков с высоким приоритетом, которые имеют низкие требования к задержке. Однако есть только выбранный поток / контекст выполнения, к которому предъявляются такие требования, и я пытаюсь блокировать код и данные только для этих потоков, чтобы уменьшить объем заблокированной памяти процесса.
Идея состоит в том, чтобы собрать все эти функции в отдельный текстовый раздел, а затем заблокировать страницы.
Чертеж идеи заключается в следующем
//Define a marker for compiler for all code that needs to be locked:
#define __hard_rt_fn __section(.locked.txt)
//mark the identified functions with the marker
Event* __hard_rt_fn GetEvent();
//Ask the loader/linker script to give the start and end address of the
.locked ():
{
__locked_start = .;
*(.text);
*(.rodata.*);
}
__locked_size = SIZEOF(.locked);
Export(__locked_start);
Export(__locked_size);
//In the main initialisation function, lock the section
extern long int __locked_start;
extern long int __locked_size;
Main()
{
……
mlock(__locked_start,__locked_size);
……
}
Этот метод основан на подходе, который используется во встроенной системе, когда части кода необходимо перемещать в ОЗУ, а оставшиеся остаются в ПЗУ.
У меня есть следующие запросы
1. Достижимо ли это с помощью динамических (GNU) компоновщиков / загрузчиков?
2.Как указать блокировку страниц для динамически загружаемых библиотек.
3. Есть ли лучший способ или инструмент для блокировки только определенных разделов кода и данных.
Задача ещё не решена.