bread/brelse

Модератор: Модераторы разделов

void*
Сообщения: 8
ОС: Slackware 11

bread/brelse

Сообщение void* »

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

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

У меня возникает вопрос - ЗАЧЕМ? Ведь когда системный вызов выполняется, приоритет обработки прерываний повышается (т.е. многие не обрабатываются просто), чтобы сохранить целостность данных ядра. Т.е. переключения в момент системного вызова на другой процесс быть не может (я прав?) тогда зачем на блокировка на это время, ведь она получается бессмысленной?

Объясните пожалуйста
Спасибо сказали:
int_0dh
Сообщения: 20
ОС: Linux

Re: bread/brelse

Сообщение int_0dh »

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

2) прерывание (имеется в виду аппартное прерывание) всегда может прервать любой syscall, если последний явно не запретил прерывания (c SMP все немножко поинтереснее)
Спасибо сказали: