Понимание скорости оперативной памяти с помощью malloc, memtest и dd - PullRequest
0 голосов
/ 05 октября 2018

Играя с новым оборудованием, я написал фрагмент кода на C, чтобы проверить скорость RAM и скорость диска.По сути, это 3 строки, которые записывают 5 ГБ в ОЗУ и записывают его в файл, вокруг которого я установил несколько таймеров:

long long int AMOUNT = 5*1024*1024*1024l;
FILE *file_handle = fopen('test.bin', 'wb');
handle = malloc(AMOUNT);
memset(handle, 0, AMOUNT);
fwrite(handle, AMOUNT, 1, file_handle);

Затем я попробовал это с dd, используя ramdisk или tempfs:

mount -t tmpfs /mnt/temp1 /mnt/temp1
dd if=/dev/zero of=/mnt/temp1/test bs=1M

и обратно на диск:

dd if=/mnt/temp1/test of=/home/user/test bs=1M

В приведенную ниже таблицу моих результатов я также вставил скорость memtest 7.5.Я не понимаю 9.0 и большую разницу между memtest и другими числами ... Кто-нибудь может объяснить это?

Results

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Весь ваш эксперимент провалился, так как вы не поняли, как выражения и продвижения типов работают в C.

5*1024*1024*1024l - это 4 операнда каждый с типом int.Какой тип вы храните результат внутри не имеет значения для того, как выполняется расчет.Они выполняются в int, поскольку операнды каждого * имеют тип int.

В 32/64 бите 2 основного потока compl.система, int может иметь значение до 2 ^ 31 -1 = 2,14 млрд.Таким образом, это выражение переполняется, и вы вызываете неопределенную ошибку поведения.То, что происходит в вашей программе, обсуждать не имеет смысла.

Измените все целочисленные константы на суффикс ULL, затем начните заново.

0 голосов
/ 05 октября 2018

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

Виртуальная память

В большинстве современных пользовательских систем у вас фактически нет прямого доступа к ОЗУ.У вас есть несколько уровней косвенности, один из которых - виртуальная память.ВМ - это память, к которой ваш процесс обращается, как если бы это была обычная непрерывная ОЗУ, но которую на самом деле базовые системы конвертируют в нужный адрес в ОЗУ.Таким образом, доступ к физической памяти с помощью виртуального адреса почти наверняка не даст вам данных, которые вы искали.

Виртуальная память также имеет слои.Современные процессоры включают встроенную поддержку виртуальной памяти, и она часто контролируется с помощью MMU рядом или на том же кристалле, что и процессор.

Многие ОС также имеют свой собственный уровень виртуальной памятито, что они затем либо переводят в управляемую виртуальную память MMU на процессоре, либо напрямую в физическую память.

Просто пример того, как далеко заходит кроличья нора, в Linux на самом деле ленивое распределение памяти.Поэтому, когда вы впервые выделяете память, она не передается на ЦП, а сохраняется только в структуре данных ядра, и при последующем обращении к памяти ЦП генерирует Page Fault .Затем обработчик ошибок страницы ядра проверяет, была ли эта память отложена и, если это так, фактически выделяет ее.

Пространство ядра против пространства пользователя

Программам пространства пользователя не разрешено изменять физическую памятьнапрямую, а в случае * nixes они вызывают Системные вызовы , чтобы сделать это для них.Системные вызовы изменяют режим работы ЦП и часто являются относительно медленными операциями.

Библиотечные функции

Библиотечные функции, такие как malloc, фактически должны вести большую бухгалтерию, чтобы убедиться, чтокогда вы звоните free по указателю, вы освобождаете только эту часть.Но они также выделяются в объемах.malloc on * nixes вызывает системный вызов mmap для выделения страницы.Последующие malloc звонки будут продолжать использовать эту страницу до тех пор, пока вам не понадобится больше.

Как это относится к этому вопросу?

Вышеприведенное является лишь проблеском того, что происходит, когда вы 'работа с памятью, и то, как вы распределяете память, какое количество и какие флаги вы передаете системе, многое меняет и может объяснить расхождения между результатами.

Предложение

Попробуйте запустить strace на этих процессах, чтобы увидеть, где они проводят большую часть своего времени!

...