Всем привет.
Пожалуйста, расскажите, по возможности, подробно как на самом деле работает Multi-read Exclusive-Write (MREW), а то я все не могу понять с точки зрения физики процесса.
Объясню свой вопрос на примере многопоточного чтения и записи текста в файл.
MREW предполагает, что выполнение операции чтения может происходить несколькими потоками, а запись - только одним, чтобы исключить взаимных блокировок.
Однако, с точки зрения HDD, все эти операции будут выполняться последовательно, потому что головка диска не будет параллельно считывать различные блоки памяти.
Например, читаем 10 потоками файл размером 5 Гб, каждый поток со своим смещением. С точки зрения кода все ясно, но для жесткого диска - диск не сможет писать параллельно, так как головка диска просто физически на это не способна, как я полагаю.
Отсюда следующие вопросы:
Помогите пожалуйста с описанием процесса
Для MREW и целей его использования не имеет значения параллелизм исполнителя. Есть разделяемый ресурс (массив в памяти, запись в БД, файл на диске). К нему доступаются параллельно много потоков. Операция доступа неатомарна и занимает какое-то время. Нужно обеспечить целостность ресурса и консистентность данных, которые видят потоки.
Для этого предусмотрены два вида блокировок. Если потоку нужно только читать, то он захватывает блокировку на чтение, перед тем как собственно читать. Она гарантирует, что никто не поменяет массив (запись в БД, файл) пока мы читаем. А чтение может занять какое-то время. Это может быть не одна операция, а несколько. Может перемежаться с операциями от других исполнителей. Другие потоки могут параллельно захватить такую же блокировку и читать.
А вот писатель не сможет захватить эксклюзивную блокировку пока кто-то держит блокировку для чтения. И поменять не сможет, пока все не отпустят свои блокировки.
Так что не важно, что скажем диск может делать только одну операцию чтения в конкретный момент (хотя это не так, диски могут переупорядочивать операции с целью оптимизации). Но даже если так, то все равно чтение большого файла будет состоять из множества мелких чтений, между которыми может "вклиниться" запись. И для этого нужен механизм, который будет синхронизировать доступ.
Теперь, что касается быстрого чтения. Распараллеливать смысла особого нет если у вас обычный диск, а не RAID. Главное не читать маленькими кусками, блоки используйте побольше. Точный размер покажет тестирование с вашим железом.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть список пустых "ответов", и при ответе (Submit) создается новый объект с таким же номером (1, 2, 3 и тд), а в его свойства прописывается ID отвечающегоПустые...
Доброго времени суток программисты :3Я написал небольшую утилиту, и мне надо сделать так, что при нажатии на "закрыть" прога не закрывалась,...
Библиотека подключена, ссылка на неё есть, но почему-то самого класса и метода Init() в пространстве имён нетПомогите пожалуйста
Доброго времени суток всем! У меня такой вопрос: на aspnet mvc создаю веб приложение, регистрация проходит с помощью логина, почты и пароля