Я создаю инструмент Valgrind, который генерирует некоторую информацию о частоте вызовов функций (в частности, сколько команд выполняется между вызовами). В настоящее время у меня установлен мой инструмент для записи короткой строки в файл дампа, который включает в себя поток, который выполняется, количество выполненных команд, введенную функцию и адрес этой функции. Для этого я использую предоставленную оболочку fprintf
. Например, я мог бы получить дамп, который выглядит следующим образом:Как быстро сбрасывать информацию?
1, 7363505897, (null), 4033bd
1, 1802196819, (null), 4033bd
1, 1800457355, (null), 4033bd
1, 1800903611, (null), 4033bd
1, 1801692437, (null), 4033bd
1, 1801040389, (null), 4033bd
1, 1801611746, (null), 4033bd
1, 1800840377, (null), 4033bd
1, 1801334975, (null), 4033bd
1, 1800615992, (null), 4033bd
1, 1800791120, (null), 4033bd
1, 1800710678, (null), 4033bd
1, 1801015823, (null), 4033bd
1, 1801594353, (null), 4033bd
1, 1801029625, (null), 4033bd
1, 1800482880, (null), 4033bd
В тестировании, однако, я обнаружил, что, когда я пытаюсь запустить эту процедуру для всех функций, значительная часть информации не записывается файл. Например, в моем тестовом приложении функция, называемая conj_grad
, выполняется 15 раз. Когда я конкретно использую ТОЛЬКО эту функцию, все 15 исполнений появляются в моем файле дампа; когда я использую ВСЕ функции, он появляется только один раз.
Я пришел к выводу, что я слишком часто пишу на диск. Есть ли (лучший) способ собрать эту информацию и записать ее на диск? Я не решаюсь создавать массивные буферы в памяти - инструмент уже засасывает 30+ ГБ на более крупные многопоточные программы, но при необходимости он может быть выполнен.
'Я пытаюсь слишком часто записывать на диск': разве ожидается, что O.S не справится с этим? Такие вещи просто не происходят в разумных системах. – 3442
@KemyLand - когда дело доходит до операционных систем, единственное, что я узнал в школе градиента, это то, что они «ожидаются», чтобы гарантировать многие вещи, но на практике всегда есть лазейка/исключение. Что касается моего вывода - я основываю это исключительно на том, что я видел до сих пор. Я мог бы быть совершенно неправым - не будет в первый раз, но я не знаю, что еще вызывает проблему. – tonysdg
Да, операционные системы гарантируют много вещей, которые на практике они не могут, например, избегать ситуаций нехватки памяти. Однако, основываясь на теории/коде, которые я знаю в отношении ОС, если вы не используете какой-то редкий камень, нет такой вещи, как «ситуация с ошибкой записи или слишком быстро». Ядро может просто приостановить ваш процесс, если это так. В конце концов, вы * не * пишете на диск, но рассказываете ядру, что писать в файл, а затем делает это ядро / драйвер устройства. Все хорошо вписывается. Файловые системы, блокирующие устройства ... Все было бы повреждено, если бы это произошло, и это не так. – 3442