Приведенный ниже код представляет собой упрощенную версию из учебника (драйверы устройств 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;
}
Забот о тупике: < /strong> Код сначала устанавливает состояние задачи на Task_retemble и только затем выпускает Mutex. Я беспокоюсь о том, что после первой строки (__Set_current_state) процесс может быть превзойден планировщиком, прежде чем он сможет вызвать mutex_unlock (). Если это произойдет, процесс будет в состоянии сна при удержании замка. Это приведет к тупику, так как процесс написания (который нуждается в замке, чтобы разбудить читателя) не сможет его приобрести. Это действительная проблема? Если да, то какой правильный атомный способ справиться с этим? Все они тогда будут участвовать в гонках, чтобы приобрести мутекс. Похоже, это классическая проблема «громового стада», что приводит к потраченным впустую циклам процессора и несправедливому распределению ресурсов. Это правильная оценка проблемы? Если да, то какой рекомендуемый способ разбудить только один процесс ожидания, гарантируя, что только один читатель получает данные, а другие остаются спать?
Приведенный ниже код представляет собой упрощенную версию из учебника (драйверы устройств 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> [list] [*] Забот о тупике: < /strong> Код сначала устанавливает состояние задачи на Task_retemble и только затем выпускает Mutex. Я беспокоюсь о том, что после первой строки (__Set_current_state) процесс может быть превзойден планировщиком, прежде чем он сможет вызвать mutex_unlock (). Если это произойдет, процесс будет в состоянии сна при удержании замка. Это приведет к тупику, так как процесс написания (который нуждается в замке, чтобы разбудить читателя) не сможет его приобрести. Это действительная проблема? Если да, то какой правильный атомный способ справиться с этим? Все они тогда будут участвовать в гонках, чтобы приобрести мутекс. Похоже, это классическая проблема «громового стада», что приводит к потраченным впустую циклам процессора и несправедливому распределению ресурсов. Это правильная оценка проблемы? Если да, то какой рекомендуемый способ разбудить только один процесс ожидания, гарантируя, что только один читатель получает данные, а другие остаются спать?