Форум программистов, компьютерный форум CyberForum.ru

Битовые утечки при записи данных на диск - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Builtin функции http://www.cyberforum.ru/cpp/thread1755256.html
Погружение в сабж. Компилятор gcc. Имеет ли смысл вообще их изучать, какие из них действительно надо знать, ибо полезные? И вообще, как можно относиться к их использованию в коде?
C++ Ищу исходники для игры pinball Всем Доброго времени суток ! Есть-ли у кого нибуть исходники для игры pinball (желательно с комментариями) ? Буду очень благодарен если кто-то скинет ! Добавлено через 33 секунды заранее благодарен ! http://www.cyberforum.ru/cpp/thread1754811.html
C++ Опрос про чувствительность к регистру
Языки программирования бывают чувствительные (думаю, большинство) и нечувствительные к регистру букв. Для кого-то удобны вторые языки, кто-то со строгим подходом считает, что первые - это канон, а нечувствительность к регистру переменных/функций развращает мозг прогера. Хотелось бы услышать мнения пользователей CyberForum-а о том, чем хороша/плоха чувствительность/нечувствительность к регистру...
C++ Как запустить проект, используя компилятор LLVM?
Собрал под виндой LLVM. Все вроде нормально. либы есть,хидеры есть, бинари есть. Надо, думаю,попробовать с llvm'овскими либами что-нибудь собрать. полез в инет,все сделал по инструкции. Но в настройках проекта нет ни нужных либ, ни нужных хидеров... печаль. Структура каталогов такова: D:\llvm-3.4 - сорцы ллвм, D:\llvm-build - уже собраное все. Выставил переменную среды...
C++ Найти всевозможные комбинации паролей и сохранить их в блокнот http://www.cyberforum.ru/cpp/thread1753001.html
Нужна помощь, дело такое, поставил на пароль архив, пароль забыл. Но, помню , что пароль состоял из двух основных паролей ( а их всего от 4 до 6, в зависимости от конечных цифр). Методом грубого перебора постоянно сбиваюсь какие пароли уже вводил и тд. Хочу попробовать перебор по словарю, для этого нужно найти всевозможные комбинации паролей и чтоб они сохранились в блокнот.
C++ Умножить две квадратные матрицы, используя ассемблерные вставки Зравствуйте! Требуется написать программу умножения двух квадратных матриц используя ассемблерные вставки и сравнить с обычным умножением в C++ (то есть: a * b). Я написал такой код: #include <iostream> #include <ctime> void multiply(int *a, int *b, int *c, int n) { _asm { MOV EDI, a MOV ESI, b подробнее

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17188 / 5442 / 337
Регистрация: 30.03.2009
Сообщений: 14,761
Записей в блоге: 26
11.06.2016, 14:16     Битовые утечки при записи данных на диск
Цитата Сообщение от Petrolion Посмотреть сообщение
Обнаружил что если при запуске ошибка возникла в памяти, то она есть уже при всех считываниях (разумеется). Но при этом заполнение этого же массива нулями не показывает наличие сбоя в памяти при заполнении. Так же ведет себя заполнение единицами. Но при втором круге - заполнение восходящими значениями, опять возникает ошибка там же либо в другой ячейке. И так все время
Для порядку надо ещё и на бинарный код посмотреть. Я в intel'овской системе команд не разбираюсь, но, возможно, кто-то сдюжит на ассемблере целенаправленный тест написать. Тут важным моментом является то, что первый цикл с точки зрения построения кода и его исполнения принципиально отличается от второго и третьего. В первом цикле на каждой итерации изменяется значение в регистре, из которого затем данные попадают в память. Во втором и третьем цикле значения в этом регистре вычисляются вне цикла и внутри цикла уже не модифицируются. И если на какой-то итерации в первом цикле регистр оказался с неправильным значением, то с этого момента все записи в память пойдёт с неправильным значением

Цитата Сообщение от Petrolion Посмотреть сообщение
Мой результат теста показал, что если ошибка появилась, то она уже есть все время в пределах текущего запуска и массива
Тут уже писали, что если данный фрагмент кода постоянно исполняется на одном и том же ядре, то такое поведение вполне логично

В реальности процессор исполняет намного больше, чем написано в этом примере. Тут работа идёт с большим объёмом данных (1 гигабайт). А потому в процессе исполнения циклов постоянно работает механизм вытеснения данных из кэша. При этом кэши первого уровня, насколько я понимаю, находятся на каждом ядре, а кэши второго и третьего уровня общие. При протравливании кэша первого уровня ещё работает механизм когерентности кэшей, чтобы инвалидация кэша распространилась на все ядра. Сам процесс записи непосредственно в память тоже достаточно сложный, т.к. между кэшем и непосредственно планкой памяти куча всяких механизмов.

Весь цикл записи занимает много довольно тактов, а потому в процессе исполнения успевает возникать аппаратное прерывание от таймера. В момент перывания неисполненные операции работы с памятью сбрасываются в так называемый подвал (cellar) и их переисполнением занимается операционная система. Правда этот вариант отбрасывается, т.к. в этом случае дефектным было бы значение только по одному адресу в памяти, а не в большом блоке. После прерывания операционная система по каким-то причинам могла неправильно восстановить значение регистра, что так же привело бы к неправильному значению в большом блоке памяти

Добавлено через 2 минуты
Цитата Сообщение от Evg Посмотреть сообщение
Тут работа идёт с большим объёмом данных (1 гигабайт)
Пардон, тут 4 гигабайта. Если физической памяти меньше, то будут ещё и откачки-подкачки виртуальных страниц, что тоже делается через операционную систему

Добавлено через 6 минут
Цитата Сообщение от Evg Посмотреть сообщение
Правда этот вариант отбрасывается, т.к. в этом случае дефектным было бы значение только по одному адресу в памяти, а не в большом блоке
Увидел логи, по ходу я словесное описание не правильно понял. Сбой всё-таки единичный (портится значение только в одном адресе памяти). Т.е. варианты с проблемами, вызыванными прерыванием операционной сиситемы, скорее всего отбрасываются. Но странным выглядит то, что сбой происходит примерно по одним и тем же виртуальным адресам. Т.е. тут дело скорее в подсистеме памяти (начиная от кэша и далее), чем в вычислительных узлах процессора

Так что для порядку имеет смысл провести эксперимент с привязкой исполнения к конкретному ядру

Добавлено через 1 минуту
Обнуление и объединичивание блока памяти попробуй выкинуть из теста. По идее это лишний мусор, который только мешает. Так же полезно было бы выкинуть обработку нажатия клавиши и всю печать переделать на printf/fprintf. Это сильно упростит код функции main (на тот случай, если кто-то захочет проанализировать бинарный код). И оставить только одну печать (либо в лог, либо на экран)

Добавлено через 2 минуты
И проверку делать не по 8 раз, а по одному. Т.е. минимизировать пример, вопсроизводящий проблему

Добавлено через 3 минуты
И ещё одно наблюдение (правда ни на какие мысли не навело). По адресу 19EA69918 дефект всегда заключается в том, что в 24-м бите имеется единица, но должен быть 0, а по адресу 1A27BC928 ситуация всегда обратная
 
Текущее время: 15:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru