В многопроцессорных компьютерных системах программная блокировка является проблемой снижения производительности из-за времени ожидания простоя, проводимого центральными процессорами в критических секциях уровня ядра . Программная блокировка является основной причиной снижения масштабируемости в многопроцессорной системе, накладывая ограничение на максимальное полезное число процессоров. Чтобы смягчить это явление, ядро должно быть спроектировано так, чтобы его критические секции были как можно короче, следовательно, разбивая каждую структуру данных на меньшие подструктуры.
В большинстве многопроцессорных систем каждый процессор планирует и контролирует себя сам, поэтому нет процессора-«супервизора», [1] а структуры данных ядра являются глобально общими; разделы кода, которые обращаются к этим общим структурам данных, являются критическими разделами . Такой выбор дизайна сделан для улучшения масштабируемости, надежности и модульности. [1] Примерами такой структуры данных ядра являются готовый список и каналы связи .
«Конфликт» происходит, когда более одного процессора пытаются получить доступ к одному и тому же ресурсу (участку памяти) в одно и то же время. Чтобы предотвратить критические гонки и несогласованность , только одному процессору ( ЦП ) в определенный момент времени разрешено получать доступ к определенной структуре данных (участку памяти), в то время как другие ЦП, пытающиеся получить доступ в то же время, блокируются , ожидая в состоянии простоя. [1] [2]
Можно выделить три случая, когда это ожидание простоя необходимо, удобно или неудобно. Ожидание простоя необходимо, когда доступ осуществляется к списку готовности для низкоуровневой операции планирования . Ожидание простоя не обязательно, но удобно в случае критической секции для операций синхронизации / IPC , которые требуют меньше времени, чем переключение контекста (выполнение другого процесса , чтобы избежать ожидания простоя). Ожидание простоя, напротив, неудобно в случае критической секции ядра для управления устройствами , присутствующей только в монолитных ядрах . Микроядро вместо этого попадает только в первые два из вышеперечисленных случаев.
В многопроцессорной системе большинство конфликтов являются конфликтами на уровне ядра из-за доступа к критическим разделам уровня ядра, и, таким образом, периоды ожидания простоя, генерируемые ими, оказывают существенное влияние на снижение производительности. Это время ожидания простоя увеличивает среднее количество простаивающих процессоров и, таким образом, снижает масштабируемость и относительную эффективность .
Принимая в качестве параметров средний интервал времени, проведенный процессором в критических секциях уровня ядра ( L , время в заблокированном состоянии), и средний интервал времени, проведенный процессором в задачах вне критических секций ( E ), [1] отношение L/E имеет решающее значение при оценке блокировки программного обеспечения.
Типичные значения для L/E находятся в диапазоне от 0,01 до 0,1. [3] В системе с отношением L/E 0,05, например, если имеется 15 ЦП, ожидается, что в среднем 1 ЦП всегда будет простаивать; [3] при 21 ЦП будут простаивать 2,8; [4] при 40 ЦП будут простаивать 19; при 41 ЦП будут простаивать 20. [3] Поэтому добавление более 40 ЦП в эту систему будет бесполезным. В общем, для каждого значения L/E существует пороговое значение для максимального количества полезных ЦП.
Чтобы снизить деградацию производительности программной блокировки до разумных уровней ( L/E между 0,05 и 0,1), ядро и/или операционная система должны быть спроектированы соответствующим образом. Концептуально наиболее приемлемым решением является разложение каждой структуры данных ядра на более мелкие независимые подструктуры, каждая из которых имеет более короткое время разработки. Это позволяет более чем одному ЦП получать доступ к исходной структуре данных.
Многие однопроцессорные системы с иерархическими доменами защиты , по оценкам, тратят до 50% времени на выполнение операций «режим супервизора». Если бы такие системы были адаптированы для многопроцессорной обработки путем установки блокировки при любом доступе к «состоянию супервизора», L/E легко бы превысило 1, [3] что привело бы к системе с той же пропускной способностью, что и однопроцессорная система, несмотря на количество ЦП.