|
Также можно посмотреть Кейслер "Проектирование ОС для малых ЭВМ",1983.
Смысл в том, что надо организовать неделимую операцию "проверка занятости - захват если свободно".
Поскольку в примере - процессы неравнезначны, иожно сделать следующее:
1. отключать прерывания
2. организовать двухуровневую проверку (как и есть)
3. организовать неравнозначную проверку:
А данном случае (пусть 0 - свободно, !0 - занято)
в фоновой задаче - сначала захватить, потом проверить
if (++sem > 1)) sem--, return;
в прерывании - сначала проверить, потом захватить
if (sem) return; else sem++;
Способ придумал я, поэтому лучше проверить.
4. вынести обработку на уровень задачи
На мой взгляд, лучше один раз сделать нормальную функцию захвата однобитового семафора, чем каждый раз изобретать лисапет.
А чем плохо корректное запрещение прерываний? В системах РВ - главное предсказуемость, а не скорость.
E-mail: info@telesys.ru