В моей программе мне нужно знать, к каким страницам программа периодически обращается, поэтому через каждые 0,5 или 1 секунду я проверяю, к каким страницам обращались, и вычисляю контрольную сумму по этим значениям страниц.
Я использую функцию mprotect
, чтобы отметить области памяти, которые необходимо увидеть, и устанавливаю обработчик сигнала SIGSEGV
для каждого потока.В начале каждого периода я устанавливаю защиту на PROT_READ
, а затем, когда происходит сбой страницы, я даю доступ как к чтению, так и к записи после того, как запомнил ее адрес.
Однако я заметил, что этот метод делает выполнение моей программы довольно медленным.Кроме того, поскольку я делаю это для каждого потока, это еще больше снижает производительность.Есть ли способ сделать эту процедуру быстрее.В частности, возможно ли сделать это на уровне процесса, поэтому, например, если поток A вызывает ошибку страницы, он дает запись на эту страницу, а когда поток B обращается к ней, он уже имеет разрешения на запись.