Ответы:
В вытесняющем ядре процесс, работающий в режиме ядра, может быть заменен другим процессом, находящимся в середине функции ядра.
Это относится только к процессам, работающим в режиме ядра, процессор, выполняющий процессы в пользовательском режиме, считается «бездействующим». Если процесс пользовательского режима хочет запросить службу у ядра, он должен выдать исключение, которое может обработать ядро.
В качестве примера:
Процесс A
выполняет обработчик исключений, Процесс B
пробуждается запросом IRQ, ядро заменяет процесс A
на B
(принудительное переключение процесса). Процесс A
остался незавершенным. Планировщик впоследствии решает, A
получает ли процесс время ЦП или нет.
В невыдвижном ядре процесс A
просто использовал бы все процессорное время, пока он не закончил, или добровольно решил позволить другим процессам прервать его (запланированное переключение процессов).
Сегодняшние операционные системы на основе Linux обычно не содержат полностью вытесняющего ядра, но все же есть важные функции, которые должны работать без перебоев. Поэтому я думаю, что вы могли бы назвать это «селективным вытесняющим ядром».
Кроме того, существуют подходы, чтобы сделать ядро Linux (почти) полностью упреждающим.
преимущество -> способность операционной системы выгружать или останавливать текущую запланированную задачу в пользу задачи с более высоким приоритетом. Планирование может быть одним из, но не ограничиваясь этим, планирования процесса или ввода-вывода и т. Д.
В Linux программы пользовательского пространства всегда были приоритетными: ядро прерывает программы пользовательского пространства для переключения на другие потоки, используя обычную тактовую метку. Таким образом, ядро не ожидает, пока программы пользовательского пространства явно освободят процессор (что имеет место в случае совместной многозадачности). Это означает, что бесконечный цикл в программе пользовательского пространства не может блокировать систему.
Тем не менее, до ядер 2.6 само ядро не было преемним: как только один поток вошел в ядро, он не мог быть прерван для выполнения другого потока. Однако это отсутствие вытеснения в ядре вызвало ряд проблем, связанных с задержкой и масштабируемостью. Таким образом, приоритет ядра был введен в ядрах 2.6, и его можно включить или отключить с помощью опции CONFIG_PREEMPT. Если CONFIG_PREEMPT включен, то код ядра может быть прерван везде, кроме случаев, когда код отключил локальные прерывания. Бесконечный цикл в коде больше не может блокировать всю систему. Если CONFIG_PREEMPT отключен, то поведение 2.4 восстанавливается.
Повторно цитируется и форматируется с: http://www.linuxquestions.org/questions/linux-general-1/pre-emptive-vs-non-pre-emptive-kernel-582437/
Вытесняющее ядро позволяет вытеснять процесс, пока он работает в режиме ядра. Не вытесняющее ядро не позволяет процессу, выполняющемуся в режиме ядра, быть выгруженным; процесс в режиме ядра будет работать до тех пор, пока он не выйдет из режима ядра, не заблокирует или добровольно не даст управление процессором. Очевидно, что невыдвижное ядро, по существу, свободно от условий гонки на структурах данных ядра, поскольку в ядре одновременно активен только один процесс. Мы не можем сказать то же самое о вытесняющих ядрах, поэтому они должны быть тщательно спроектированы, чтобы гарантировать, что данные общего ядра свободны от условий гонки. Вытесняющие ядра особенно сложно спроектировать для SMP-архитектур, поскольку в этих средах два процесса в режиме ядра могут работать одновременно на разных процессорах. Превентивное ядро больше подходит для программирования в реальном времени, поскольку это позволит процессу в реальном времени выгружать процесс, запущенный в данный момент в ядре. Кроме того, вытесняющее ядро может быть более отзывчивым, поскольку меньше риск того, что процесс в режиме ядра будет работать в течение сколь угодно длительного периода времени, прежде чем передать процессор ожидающим процессам. Конечно, этот эффект можно минимизировать, создавая код ядра, который не ведет себя таким образом. Далее в этой главе мы рассмотрим, как различные операционные системы управляют вытеснением в ядре. этот эффект может быть минимизирован путем разработки кода ядра, который не ведет себя таким образом. Далее в этой главе мы рассмотрим, как различные операционные системы управляют вытеснением в ядре. этот эффект может быть минимизирован путем разработки кода ядра, который не ведет себя таким образом. Далее в этой главе мы рассмотрим, как различные операционные системы управляют вытеснением в ядре.