Всем доброго времени суток.
Разбираюсь с устройством буферов блочных устройств. Все в принципе понятно, кроме одного момента.
Когда вызывается bread() он непосредственно вызывает getblk() и далее при необходимости перечитывает инвалидный блок. Так вот, в описании getblk() сказано, что он ставит у буфера флаг "занят", чтобы никто еще не мог его получить. Также сказано, что этот флаг ставится исключительно на время выполнения системного вызова в контексте какого-то процесса и при выполнении флаг сбрасывается.
У меня возникает вопрос - ЗАЧЕМ? Ведь когда системный вызов выполняется, приоритет обработки прерываний повышается (т.е. многие не обрабатываются просто), чтобы сохранить целостность данных ядра. Т.е. переключения в момент системного вызова на другой процесс быть не может (я прав?) тогда зачем на блокировка на это время, ведь она получается бессмысленной?
Объясните пожалуйста
bread/brelse
Модератор: Модераторы разделов
-
int_0dh
- Сообщения: 20
- ОС: Linux
Re: bread/brelse
1) переключение может иметь место если текущий syscall не запретил это явно (обычно на очень короткое время на критических участках) - гуглить про вытесняемые ядра
2) прерывание (имеется в виду аппартное прерывание) всегда может прервать любой syscall, если последний явно не запретил прерывания (c SMP все немножко поинтереснее)
2) прерывание (имеется в виду аппартное прерывание) всегда может прервать любой syscall, если последний явно не запретил прерывания (c SMP все немножко поинтереснее)