LINUX.ORG.RU

Как в подробностях происходит неблокирующее чтение и запись файла


0

1

Для чтения алгоритм таков:

1. Открываем файл с флагами O_RDONLY | O_NONBLOCK
2. Ждём например select-ом когда можно будет его неблокирующе читать
3. Читаем

Вопрос. Что происходит после 1 пункта в ядре ОС? Оно читает с диска содержимое файла в какой-то свой внутренний буфер? Если да, то какого размера этот буфер? Размер буфера постоянный или нет?

Для записи алгоритм таков:

1. Открываем файл с флагами O_WRONLY | O_NONBLOCK
2. Ждём например select-ом когда можно будет в него неблокирующе писать
3. Пишем

Вопрос. Что происходит в пункте 3 в ядре ОС? Оно записывает данные в какой-то свой внутренний буфер и потом, уже после 3-го пункта, пишет данные на диск? Если да, то как узнать когда данные действительно записались на диск?

Что происходит после 1 пункта в ядре ОС?

Implementation defined.

Оно записывает данные в какой-то свой внутренний буфер и потом, уже после 3-го пункта, пишет данные на диск?

Implementation defined; обычно, да.

Если да, то как узнать когда данные действительно записались на диск?

man 2 fsync

JackYF ★★★★
()
Ответ на: комментарий от JackYF

Implementation defined.

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

Но всё же, как, например, это происходит в ядре Linux?

man 2 fsync

Это я знаю, это не то. fsync нужен чтоб заставить ядро записать данные на диск. А я хочу чтоб тот же select ожидал фактической записи на диск?

LinuxUser ★★★
() автор топика

ядро посылает запрос на чтение/запись контроллеру диска, потом, по прерыванию от контроллера, устанавливает флаг в объекте, представляющем открытый файл

anonymous
()

Для файлов селект сразу будет сигнализировать, что можно читать и писать, его вообще нет смысла использовать. Для всяких пайпов и сокетов: если ждём чтение, а данных в буфере нет, то надо просто уснуть. При появлении данных нужно разбудить все процессы, ждущие эти данные. При записи аналогично.

const86 ★★★★★
()
Ответ на: комментарий от LinuxUser

LinuxUser

А я хочу чтоб тот же select ожидал фактической записи на диск?

это вы будете долго ждать... может и не дождётесь. (мелкие временные файлы вообще на диск не попадают).

drBatty ★★
()
Ответ на: комментарий от anonymous

ядро посылает запрос на чтение/запись контроллеру диска

В случае чтения, этот запрос отправляется сразу после открытия файла? Что представляет из себя этот запрос на чтение? Типа «слышь, диск, скоро с тебя будут вот этот файл читать, будь готов»? Или «давай содержимое файла, я его пока во временный буфер запишу, а потом когда read вызовут, отдам ему»?

const86:

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

Да, это на практике так. Но меня интересует подробности — когда именно будет происходить чтение с диска — сразу после вызова open или в момент вызова read? Как говорил Коломбо — я должен во всём разобраться.

LinuxUser ★★★
() автор топика

я хочу чтоб тот же select ожидал фактической записи на диск?

Зачем? если это чтобы другой процесс оттуда гарантированно читал читал (хотя у тебя врайтонли), то у него это получится все равно.

papaya
()
Ответ на: комментарий от papaya

я хочу чтоб тот же select ожидал фактической записи на диск

Зачем?

Чтоб на душе спокойней стало, а то вдруг электричество выключат, а данные не успели записаться. Я понимаю что есть разные ФС и что система может быть подключена к ИБП. Если узнать момент фактической записи на диск нельзя — ничего страшного, меня это не очень волнует, гораздо важнее узнать ответ вот на эти вопросы: Как в подробностях происходит неблокирующее чтение и запись файла (комментарий)

LinuxUser ★★★
() автор топика
Ответ на: комментарий от LinuxUser

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

работу контроллера нужно выяснять еще тогда, поэтому и нужно пологаться на абстракции, на то есть ОС и хард..

papaya
()
Ответ на: комментарий от papaya

LinuxUser. Вы сами себе противоречите.

«Чтоб на душе спокойней стало»
Ничему нельзя верить, даже fsync.
Дисководы имеют гигантские буферы и не торопятся записывать
на диск, а подтверждение идет не о том, что данные на диске,
а что они получены дисководом.

«ничего страшного ... гораздо важнее узнать ответ вот на эти вопросы»
Эти вопросы не практические, а чисто познавательные. Может
статься - на разных системах по разному или зависеть от
разных факторов.

oleg_2
()

как узнать когда данные действительно записались на диск?

есть только один действительно надёжный метод.

http://xraysweb.lbl.gov/peem2/webpage/Project/TutorialContrast.shtml

Magnetic materials and thin films often exhibit magnetic domains, which can be visualized by PEEM imaging using polarized X-rays. X-ray Magnetic Circular Dichroism (XMCD) at the L3/2 edges is sensitive to the ferromagnetic domain direction, scaling with cos2α, the angle between the ferromagnetic direction and the x-ray polarization direction.

nanoolinux ★★★★
()

Открой уже сорцы и почитай

anonymous
()

а точно ли бывает неблокирующее чтение файла ? с сокетом иль пайпом то понятно - туда данные доставляет ктото третий

а кто доставляет данные в файл ?

вот открыли файл - и пробуем читать - и ведь будет сидеть и выполняться пока все что просили непрочитает ведь пока нету запроса на чтение - то и ждать что там чтото появиться нет смысла

ae1234 ★★
()

Полный тред тупаков - сказывается политика модерирования ресурса

Вы бы ВСЕ почитали для чего неблокирующее I/O служит и как работает. Вызовы чтения-записи ничего не ждут, а работа команд read() и write() тщательно описана в манах. О том, были данные записаны на диск или нет в неблокирующем режиме можно судить ровно с той же надёжностью как и для блокирующего чтения.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.