Ядро - Системные вызовы и поддержка
Существуют и другие типы функций ядра, доступные для пользовательских процессов. Например, системные вызовы выполняют специальные задачи, которые пользовательский процесс не может выполнить хорошо в одиночку или вообще не может справиться с ними. Так, все действия, связанные с открытием, чтением и записью файлов, вовлекают системные вызовы.
Два системных вызова – fork()
и exec()
— важны для понимания того, как происходит запуск процессов:
fork()
– Когда процесс осуществляет вызовfork()
, ядро создает практически идентичную копию данного процесса;exec()
– Когда процесс осуществляет вызов exec(program), ядро запускает программу program, которая замещает текущий процесс.
За исключением процесса init, все пользовательские процессы в системе Linux начинаются как результат вызова fork()
, и в большинстве случаев осуществляется вызов exec()
, чтобы запустить новую программу, а не копию существующего процесса. Простым примером является любая программа, которую вы запускаете из командной строки, например команда ls, показывающая содержимое
каталога. Когда вы вводите команду ls в окне терминала, запущенная внутри окна терминала оболочка осуществляет вызов fork()
, чтобы создать копию оболочки, а затем эта новая копия оболочки выполняет вызов exec(ls), чтобы запустить
команду ls. На рисунке ниже показана последовательность процессов и системных вызовов для запуска таких программ, как ls.
Ядро также поддерживает пользовательские процессы, функции которых отличаются от традиционных системных вызовов. Самыми известными из них являются псевдоустройства. С точки зрения пользовательских процессов, псевдоустройства выглядят как обычные устройства, но реализованы они исключительно программным образом. По сути, формально они не должны находиться в ядре, но они все же присутствуют в нем из практических соображений. Например, устройство, которое генерирует случайные числа (/dev/random
), было бы сложно реализовать с необходимой степенью безопасности с помощью пользовательского процесса.
<callout type=“primary” icon=“true” title=“Примечание”>Технически пользовательский процесс, который получает доступ к псевдоустройству, все же вынужден осуществлять системный вызов для открытия этого устройства. Таким образом, процессы не могут полностью обойтись без системных вызовов.</callout>