параллелизм — измерение расхода памяти, используемого параллельным кодом в переполнении стека

Я реализую FineList и LazyList занятия в C ++. Оба вышеупомянутых параллельных связанных списка были реализованы на Java в книге «Искусство многопроцессорного программирования«Я хотел бы измерить объем памяти, потребляемый каждым алгоритмом в течение всего процесса его выполнения. Я не уверен, как мне это сделать. Я мог бы просто отслеживать количество раз»новый«вызывается каждым потоком в счетчике в обоих алгоритмах и использует его в качестве критерия измерения. Точно так же всякий раз, когда поток вызывает»удалять«Я бы уменьшил счетчик. Это справедливый критерий для измерения потребления памяти? Проблема в том, что алгоритм FineList позволяет мне немедленно» удалить «узел, как только он будет удален из связанного списка, из-за того, что основанный на замке характер. Но это не так в алгоритме LazyList, так как он имеет методы без блокировки. Есть ли другой способ измерить потребление памяти, или вышеуказанный метод справедлив для обоих алгоритмов?

1

Решение

Если вы ведете заказанный журнал new а также delete звонки (включая запрашиваемый размер), и вы уверены, что интересующий вас код использует только new а также delete а не другие процедуры распределения, вы можете определить более или менее теоретический потребление памяти в любой момент времени за счет непрерывного подсчета избытка памяти, выделенной на свободную память. Вы могли бы, возможно, создать такой журнал, перегружая глобальный operator new(size_t) а также удалить.

Номер будет только теоретический из-за нескольких факторов:

  1. Распределители добавляют определенное количество служебной информации, поэтому фактическая выделенная память обычно будет больше, чем сумма размеров выделенных объектов. Эти накладные расходы включают фрагментацию, поскольку некоторая нераспределенная память может быть технически свободна, но не совсем доступна.
  2. Распределители не могут вернуться любой памяти операционной системе, или они могут вернуть ее, но непредсказуемым образом. Таким образом, если вы измеряете «выделенную память» в том, что касается ОС (в сравнении с распределителем времени выполнения), у вас возникает более сложная проблема, и она сильно зависит от распределителя.
  3. Особенно в многопоточном сценарии, не вся освобожденная память обязательно используется для будущих распределений. Конкретным случаем этого для распределителей с поддержкой потоков является использование локальных буферов распределения потоков: память, освобожденная в одном потоке, может не сразу использоваться в другом потоке, пока не будет достигнут некоторый порог, при котором выделения могут перемещаться между потоками. Это может быть актуально для вашего сценария, если существует несоответствие узлов, выделенных и освобожденных между потоками.
  4. Существует целый уровень сложности, когда речь заходит о том, сколько памяти было выделено — даже определить этот термин. Например, для большого выделения ОС может вернуть вам часть памяти, которой на самом деле нет в ОЗУ, и только лениво, пока вы к ней обращаетесь. Таким образом, если вы не получаете доступ ко всему, что выделяете, числа, о которых сообщает распределитель, могут быть переоценкой.

Это просто царапает поверхность.

1

Другие решения

C ++ позволяет вам предоставить свой собственный operator new и соответствие operator delete, Это полезно для таких задач измерения. Вы даже можете использовать это, чтобы выяснить, какая память используется как функция стратегии распределения, например, Посмотрите, сколько памяти требуется вашему алгоритму при округлении выделения до числа, кратного 16 байтам.

Большим преимуществом этого подхода является то, что вам не нужно трогать код самого алгоритма. Вы можете использовать бухгалтерский учет вашего собственного распределителя.

Имейте в виду, идея программирования без блокировки может быть чрезмерно оптимистичной, если вам действительно нужно new, В C ++ нет никаких гарантий, что new без блокировки. А так как C ++ позволяет вам new память в один поток и delete это в другом, необходима некоторая межпоточная синхронизация.

0

По вопросам рекламы [email protected]