Я читал о реализации семафоров Linux. Из-за атомарности, сигнала и ожидания (вверх и вниз в исходном коде) используются блокировки спина. Затем я увидел прерывание с отключением Linux в spin_lock_irqsave и повторное включение прерывания в spin_unlock. Это меня смутило. На мой взгляд, в критическом разделе действительно нет прерывания прерывания точки.Почему прерывание отключено между spin_lock и spin_unlock в Linux?
Например, proc A (в настоящее время активен) получил блокировку, proc B (заблокирован) ждет блокировки, а proc C выполняет некоторые несвязанные вещи. Это имеет смысл переключиться на контекст в C в критической секции между A и B. Даже если C также пытается получить блокировку, так как блокировка уже заблокирована A, результатом будет блокировка C и возобновление выполнения.
Поэтому я не знаю, почему Linux решил отключить прерывание в критических разделах, защищенных прямыми замками. Вероятно, это не вызовет никаких проблем, но мне кажется, что это избыточная операция.
Это может помочь вам понять, почему: http://www.makelinux.net/ldd3/chp-5-sect-5 –
Спасибо! В разделе 5.5.2 предлагаемой статьи были рассмотрены мои проблемы. – secXsQuared