Как на самом деле работает multi-read exclusive-write?

281
11 июня 2022, 04:00

Всем привет.

Пожалуйста, расскажите, по возможности, подробно как на самом деле работает Multi-read Exclusive-Write (MREW), а то я все не могу понять с точки зрения физики процесса.

Объясню свой вопрос на примере многопоточного чтения и записи текста в файл.

MREW предполагает, что выполнение операции чтения может происходить несколькими потоками, а запись - только одним, чтобы исключить взаимных блокировок.

Однако, с точки зрения HDD, все эти операции будут выполняться последовательно, потому что головка диска не будет параллельно считывать различные блоки памяти.

Например, читаем 10 потоками файл размером 5 Гб, каждый поток со своим смещением. С точки зрения кода все ясно, но для жесткого диска - диск не сможет писать параллельно, так как головка диска просто физически на это не способна, как я полагаю.

Отсюда следующие вопросы:

  1. Значит нет никакой многопоточного чтения? Или как достигнуть этого эффекта?
  2. Или диск читает блоками вне зависимости полностью файл занимает блок или только часть?
  3. Тогда какой размер этого блока, чтобы максимально быстро считывать или записывать в файл?

Помогите пожалуйста с описанием процесса

Answer 1

Для MREW и целей его использования не имеет значения параллелизм исполнителя. Есть разделяемый ресурс (массив в памяти, запись в БД, файл на диске). К нему доступаются параллельно много потоков. Операция доступа неатомарна и занимает какое-то время. Нужно обеспечить целостность ресурса и консистентность данных, которые видят потоки.

Для этого предусмотрены два вида блокировок. Если потоку нужно только читать, то он захватывает блокировку на чтение, перед тем как собственно читать. Она гарантирует, что никто не поменяет массив (запись в БД, файл) пока мы читаем. А чтение может занять какое-то время. Это может быть не одна операция, а несколько. Может перемежаться с операциями от других исполнителей. Другие потоки могут параллельно захватить такую же блокировку и читать.

А вот писатель не сможет захватить эксклюзивную блокировку пока кто-то держит блокировку для чтения. И поменять не сможет, пока все не отпустят свои блокировки.

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

Теперь, что касается быстрого чтения. Распараллеливать смысла особого нет если у вас обычный диск, а не RAID. Главное не читать маленькими кусками, блоки используйте побольше. Точный размер покажет тестирование с вашим железом.

READ ALSO
Отфильтровать и вернуть коллекцию List С#

Отфильтровать и вернуть коллекцию List С#

Есть список пустых "ответов", и при ответе (Submit) создается новый объект с таким же номером (1, 2, 3 и тд), а в его свойства прописывается ID отвечающегоПустые...

224
WinForms C# Перемещение проги в панель скрытых приложений

WinForms C# Перемещение проги в панель скрытых приложений

Доброго времени суток программисты :3Я написал небольшую утилиту, и мне надо сделать так, что при нажатии на "закрыть" прога не закрывалась,...

260
Xamarin.FormsMaps.Init() не существует

Xamarin.FormsMaps.Init() не существует

Библиотека подключена, ссылка на неё есть, но почему-то самого класса и метода Init() в пространстве имён нетПомогите пожалуйста

248
Добавить новые поля при редактировании профиля C# .net MVC

Добавить новые поля при редактировании профиля C# .net MVC

Доброго времени суток всем! У меня такой вопрос: на aspnet mvc создаю веб приложение, регистрация проходит с помощью логина, почты и пароля

225