Как Linux сохраняет контроль над ЦП на машине с одним -ядром?

У меня была такая же проблема, и переустановка с помощью pacman -S linuxне помогла. На самом деле ошибка появилась при обновлении linux-aarch64в первую очередь потому, что это вызывает хук транзакции post -для mkinitcpio!

Проблема в моем случае заключалась в том, что /etc/mkinitcpio.d/linux-aarch64.presetне было заменено обновлением, а был установлен файл .pacnew. Таким образом, предустановка по-прежнему указывала на старый каталог модулей. Перемещение нового пресета на место исправило это:

# mv /etc/mkinitcpio.d/linux-aarch64.preset{.pacnew,}
# pacman -S linux-aarch64
13
27.11.2020, 11:33
4 ответа

Ядро довольно часто получает управление при нормальных операциях :всякий раз, когда процесс вызывает системный вызов и всякий раз, когда происходит прерывание. Прерывания происходят, когда аппаратное обеспечение требует внимания ЦП или когда ЦП требует внимания ядра, и одна конкретная часть аппаратного обеспечения может быть запрограммирована на периодический запрос внимания (таймера ). Таким образом, ядро ​​может гарантировать, что до тех пор, пока система не заблокируется настолько сильно, что больше не будут генерироваться прерывания, оно будет периодически вызываться.

В результате

if that process is doing some extremely long running computation without yielding

не вызывает беспокойства :Linux — это вытесняющая многозадачность операционная система, т. е. она выполняет многозадачность, не требуя взаимодействия запущенных программ.

Когда дело доходит до уничтожения процессов, в любом случае задействовано ядро. Если процесс хочет убить другой процесс, он должен вызвать для этого ядро, так что управление находится в руках ядра. Если ядро ​​решает убить процесс (, т.е. убийца OOM, или потому что процесс пытался сделать что-то, что ему не разрешено, например, получить доступ к неотображенной памяти ), он также находится под контролем.

Обратите внимание, что ядро ​​можно настроить так, чтобы не оно само управляло подмножеством процессоров системы (с помощью устаревшегоisolcpusпараметра ядра )или не планировало выполнение задач на определенных процессорах. (с использованием процессорных наборов без балансировки нагрузки, которые полностью интегрированы в cgroup v1 и cgroup v2);но по крайней мере один ЦП в системе всегда должен полностью управляться ядром. Его также можно сконфигурировать для уменьшения количества генерируемых прерываний таймера в зависимости от того, для чего используется данный ЦП.

Также нет большой разницы между системами с одним -ЦП (, одним -ядром и т. д. )и системами с несколькими -ЦП. :Каждый ЦП должен периодически обращаться к ядру, если он будет использоваться для многозадачности под управлением ядра.

43
18.03.2021, 22:47

Linux и большинство современных операционных систем используют вытесняющую многозадачность , что означает, что ядро ​​полностью контролирует время, в течение которого каждому процессу разрешено работать, и вытесняет процесс, если он выполняется слишком долго, в отличие от совместной работы. многозадачность , при которой процесс будет передавать управление, когда захочет

В основном при вытесняющей многозадачности ядро ​​будет периодически запускаться по таймеру, и всякий раз, когда ядро ​​находится под управлением (, когда происходит прерывание таймера или вызывается системный вызов ), ядро ​​​​сохраняет контекст текущего процесса. а затем при необходимости переключиться на контекст следующего процесса. Это называется переключением контекста , где все состояние процесса, включая всю информацию о потоке, значения регистров... сохраняется и восстанавливается, чтобы процесс продолжал работать с той точки, в которой он был вытеснен, даже не подозревая об этом. не работает постоянно. Следовательно, множество процессов будет выполняться одновременно в одном ядре ЦП, хотя на самом деле в любой момент времени выполняется только один процесс. Ядро также является просто специальным процессом, который выполняет всю обработку процессов и ресурсов. Он не запускается из отдельного ядра только для мониторинга других процессов

.

См. также Что означает фраза «ядро linux является вытесняющим»?

11
18.03.2021, 22:47

Проще говоря, ядро ​​является абсолютным диктатором*системы. Он контролирует , когда процессы получают ресурсы (, являясь вытесняющим многозадачным ядром ), и контролирует , какие ресурсы он получает. (Процессы запрашивают ресурсы,и ядро ​​отдает их им, если они доступны. Если они недоступны, ресурсы не предоставляются.)

Будучи абсолютным диктатором, ядро ​​может убить их, если посчитает нужным.

*Всегда есть исключения и пограничные случаи.

0
18.03.2021, 22:47

В некоторых странных случаях(встроенные устройства, возможно, RaspberryPi на основе)у вас может быть ядро ​​​​Linux(см. kernel.org и kernelnewbies. org для подробностей)управление очень ограниченным набором процессов.

Вы даже можете написать свою /sbin/initпрограмму

тогда вы полностью контролируете набор процессов.

(см. init (1 )), так что он fork (2)-имеет очень мало дочерних процессов и использует другие системные вызовы (2).

Этотучебник по операционной системедолжен дать вам больше информации, и вы многому научитесь, компилируя ядро ​​Linux из его исходного кода. Первая команда, которую нужно запустить, вероятно,make menuconfig(после того, как все дерево ядра Linux будет на вашем локальном диске ). Читайте такжеAdvanced Linux Programmingи сигнал (7 ), время (7 ), vdso (7 ).

Однако,Обратите внимание, что в 2020 году большинство процессоров для Linux имеют как минимум два ядра. И многие системы Linux используют systemd , чей исходный код является открытым исходным кодом (, и вам разрешено его изучать и улучшать ). Другие системы Linux могут использовать runit(также с открытым исходным кодом ). С осторожностью и вдохновением от существующих initпрограмм вы могли бы написать свои собственные.

Вы можете посмотреть Linux From Scratch и изучить исходный код ваших crt0 подпрограмм, а также GNU libc(она бесплатна. программное обеспечение , такое как GCC и GNU binutils и GNU bash ! )или musl -libc .

Связанная концепция состоит в том, что продолжений(причудливое название для материализации стеков вызовов)и примитива call/cc схемы. Так что читайте R5RS , ACM SIGPLAN материалы конференции (, например. PLDI ), книга КвиннекаLisp In Small Piecesи книга ПитратаИскусственные существаи, возможно, также этот проект отчета (, финансируемый КОЛЕСНИЦА). Помните о теореме Райса .

Если вы используете GCC , не забудьте скомпилировать код foo.cкак gcc -Wall -Wextra -fverbose-asm -S foo.c, а затем загляните внутрьfoo.s

Веб-сайт OSDEV также дает практическую информацию о написании (и изучении исходного кода )ядер операционных систем. Вас могут заинтересовать программы Singularity и конференции FOSDEM и ACM SIGOPS .

Вы можете использовать/proc/(см. proc (5))тогда вы можете заметить, что ваше ядро ​​​​Linux обрабатывает прерывания довольно часто (обычно сотни прерываний в второй ). Каждое прерывание (, например.те, которые запускаются HPET ), являются поводом (для ядра Linux )запланировать какой-то другой процесс.

Если ваше оборудование не выдает сотни прерываний каждую секунду, вам следует обсудить это с поставщиком или разработчиком вашего оборудования.

that process is doing some extremely long running computation without yielding

В Linux этого никогда не происходит, если только ваше ядро ​​или ваше оборудование не содержит ошибок.

В пользовательском -пространстве процесс прерывался не менее дюжины раз в секунду (в 2020 году на большинстве аппаратных средств ). Прочтите о вытеснении ядра и переключении контекста .

Обратите внимание, что переключение контекста изменяет текущее продолжение. На абстрактном уровне прерывание близко к некоторому call/ccв схеме .

1
18.03.2021, 22:47

Теги

Похожие вопросы