2014-12-15 3 views
1

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

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

Как процесс распознает минутные изменения, внесенные в файл, когда оба одновременно обращаются к файлу.

Это не создает проблемы, поскольку процессы будут обращаться к старым данным, но не к тем данным, которые были изменены каким-либо другим процессом, который все еще находится в буфере пользовательского пространства.

Пожалуйста, обратите внимание, если возникнут какие-либо ошибки.

+0

Даже если буферы представляют собой единый символ, у вас все еще есть гонка. Если требуется многопроцессорное манипулирование файлами, тогда [доступны другие механизмы] (http://linux.die.net/man/2/flock). Абсолютно это проблема, но она не должна решаться на уровне ядра, так как это делает нормальный случай очень эффективным. –

+0

ya..Но как процессам удается решить такие проблемы? Как если бы два процесса обратились к произвольному файлу в нашей системе и постоянно его обновляют, это не будет большой проблемой? –

+0

Это именно то, что означает '' flock' '(http://linux.die.net/man/2/flock), для ссылок выше. Оба процесса должны использовать его для получения эксклюзивного доступа. Другие механизмы - создать временный файл, скопировать данные, обновить, а затем сделать атомное 'переименование' в оригинале. Это действительно зависит от варианта использования, и вы должны тщательно об этом подумать. У вас не может быть процессов доступа к случайным файлам, чтения/записи случайным образом и ожидать, что данные будут согласованными. Буферы с-в процессе могут содержать устаревшие данные, независимо от того, что делает ядро. –

ответ

1

Да, это происходит. Условия межпроцессного горения присутствуют и могут создавать странное поведение при буферизации IO. Как правило, хотя вход не буферизуется так много (обычно только строка за раз), так что это не так уж плохо. Есть способы обойти это, но через функцию под названием mmap.

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

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

+0

, что я имел в виду, был .. Общий файл, доступ к которому выполнялся обоими процессами. И когда один пишет на нем мгновенно другие читает его. Но второй процесс не может прочитать обновленные данные. Это не проблема? –

+0

@jackwilson Это зависит, но обычно для такой программы, как 'cat', no. На самом деле, я не могу придумать ни одной программы Coreutils, на которую это негативно повлияет. – randomusername

Смежные вопросы