Блокировка проблем чтения/записи и параллелистикиLinux

Ответить Пред. темаСлед. тема
Anonymous
 Блокировка проблем чтения/записи и параллелистики

Сообщение Anonymous »

Приведенный ниже код представляет собой упрощенную версию из учебника (драйверы устройств Linux, ядро ​​4.0): < /p>
while (dev->current_len == 0) {
if (filp->f_flags & O_NONBLOCK) {
ret = -EAGAIN;
goto out;
}
__set_current_state(TASK_INTERRUPTIBLE);
mutex_unlock(&fifo_mutex);
schedule();
if (signal_pending(current)) {
ret = -ERESTARTSYS;
goto out2;
}

mutex_lock(&fifo_mutex);
}
< /code>
Мои вопросы: < /p>
  • Забот о тупике: < /strong> Код сначала устанавливает состояние задачи на Task_retemble и только затем выпускает Mutex. Я беспокоюсь о том, что после первой строки (__Set_current_state) процесс может быть превзойден планировщиком, прежде чем он сможет вызвать mutex_unlock (). Если это произойдет, процесс будет в состоянии сна при удержании замка. Это приведет к тупику, так как процесс написания (который нуждается в замке, чтобы разбудить читателя) не сможет его приобрести. Это действительная проблема? Если да, то какой правильный атомный способ справиться с этим? Все они тогда будут участвовать в гонках, чтобы приобрести мутекс. Похоже, это классическая проблема «громового стада», что приводит к потраченным впустую циклам процессора и несправедливому распределению ресурсов. Это правильная оценка проблемы? Если да, то какой рекомендуемый способ разбудить только один процесс ожидания, гарантируя, что только один читатель получает данные, а другие остаются спать?


Подробнее здесь: https://stackoverflow.com/questions/797 ... ncy-issues
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Linux»