Можно ли писать в разные части одного и того же файла из нескольких потоков?

Могу ли я писать в разные части одного и того же файла одновременно из нескольких потоков (на обычном ПК)? Я имею в виду только одну головку диска, поэтому записи могут выполняться только в каком-то порядке в любом случае, а не параллельно, правильно?

Edit:

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

Ответ 1

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

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

Если программа привязана к диску, делая ее многопоточной (и все еще записывая один и тот же объем данных на один и тот же диск), она не ускорит ее.

Если мы говорим о традиционном жестком диске, последовательный ввод-вывод, как правило, быстрее, чем ввод-вывод, который включает перемещение головки диска назад и вперед. Имея это в виду, разделение ввода-вывода по потокам может быть даже продуктивным.

Есть несколько способов изучить, насколько ускоряются:

  • Уменьшение объема ввода-вывода (например, с помощью алгоритма сортировки, который требует меньше ввода-вывода или выполнения большего объема работы в памяти);
  • Улучшение пропускной способности ввода-вывода, например, с помощью более быстрого привода.

Ответ 2

Это возможно для операционных систем unix (-like), по крайней мере, предположительно и для Windows, хотя обработка файлов несколько отличается и может потребоваться определенный режим файла, разрешить это (изменить: см. ответ bizzehdee).

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

Но, короче говоря, просто искать и писать, старые байты в файле перезаписываются. Если два процесса записываются на одинаковых байтах, я думаю, что конечный результат undefined, и в любом случае что-то, что никогда не должно происходить в правильно функционирующей системе, и любые программы, выполняющие это, должны иметь некоторый механизм предотвращения дублирования записи.


О скорости: в зависимости от того, что вы делаете, действительно. Если вы просто выполняете сырую запись, вещи, вероятно, замедлятся на традиционном вращающемся жестком диске, или файл может стать фрагментированным более легко. На SSD, вероятно, нет замедления, но не ускоряется.

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

Ответ 3

вам нужно посмотреть CreateFileEx и WriteFileEx и использовать lpOverlapped. Это позволяет одновременно читать асинхронное чтение и/или записывать из/в один и тот же файл в нескольких потоках.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365748(v=vs.85).aspx

Ответ 4

Да, это возможно, но, как говорят другие, вряд ли это улучшит производительность в общем случае.

Однако одно из ваших утверждений не совсем корректно.

есть только одна головка диска

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

Некоторые диски с несколькими пластинами также могут читать или записывать на все пластины одновременно. Некоторые Fujitsu Eagle drives в 80-х сделали это и были использованы для первых систем, способных записывать несжатые цифровые видеосигналы. Конечно, это не "случайный доступ", так как все головы движутся вместе. Я не уверен, что современные приводы используют эту технику.