Я пытаюсь понять, как работает код ниже. Это прямо из моих лекционных лекций. Эта функция P() и V() является частью реализации семафора в ОС, которую мы используем в классе (OS161). Я думаю, вам может понадобиться понимание OS161, чтобы ответить на мой вопрос, поскольку он широко используется, надеюсь, кто-то может ответить на эти вопросы.
Мое понимание этого кода с конспектов:
X: Поток функции
1. Когда поток вызова P(), мы отключаем прерывания
2. Проверьте, если мы имеем P() любые ресурсы, доступные на sem-> count
3.a) если count 0, то мы идем спать
3.b) если count! = 0, то мы уменьшаем счетчик и разрешаем вызывающему потоку продолжать критический раздел
4. Включить прерывание
Y: Течение функции V()
1. Когда поток вызовов В(), мы отключить прерывания
2. Увеличить счетчик, подразумевая, что теперь есть 1 еще ресурс доступен, чтобы захватить
3. Теперь мы идем вперед и просыпаемся все нити, которые мы отправили спать в P(), потому что не были доступны достаточно ресурсов, в то время поток пытался захватить замок в критическую секцию
4. Включение прерываний
Как спящие потоки отключены?
Мои проблемы:
1. Отключает ли раздел «отключить прерывание» прерывание на определенном уровне объявление или отключает все прерывания?
2. В функции V(), когда мы пробуждаем все потоки, поток, посланный внутри цикла while в функции P(), запускает цикл while. В лекции говорится, что одна нить захватывает замок и отдыхает спать. Мой вопрос в том, почему «sem-> count == 0» условие не оценивает false для других потоков, а только для одного.
Я действительно хочу знать, как работает функция отключения прерывания. это мой первый вопрос. Остановляет ли он планировщик потоков ?, останавливает ли он контекстный переключатель в системе?
Почему нить идет спать с отключением прерывания? это не так опасно, так как он может пропустить готовые сигналы ввода-вывода и другие вещи?
P(sem) {
Disable interrupts;
while (sem->count == 0) {
thread_sleep(sem); /* current thread
will sleep on this sem */
}
sem->count--;
Enable interrupts;
}
V(sem) {
Disable interrupts;
sem->count++;
thread_wakeup (sem); /* this will wake
up all the threads waiting on this
sem. Why wake up all threads? */
Enable interrupts;
}
спасибо.