Операционная система - ключевая тема в информатике, и это одна из тех тем, которые каждый разработчик программного обеспечения должен иметь базовое представление о том, как она работает. Операционная система - это программа, которая действует как посредник между пользователем компьютера и компьютерным оборудованием.

На вопрос об операционной системе многие специалисты дают обширные пояснения. Я постараюсь объяснить это как можно проще.

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

Вот что происходит на самом деле: вы просто даете компьютеру команду сделать что-то через пользовательский интерфейс приложения, а операционная система знает, как запустить процесс, какие ресурсы требуются, как эффективно использовать оперативную память, как завершить процесс быстрее , и т.д.

Основные функции операционной системы:

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

Таким образом, у вас может быть Lamborghini (оборудование с высокими техническими характеристиками), но без драйвера (операционной системы) это просто демонстрация.

Ядро

Ядро - самая важная часть коллекции программного обеспечения под названием ОС. Это программа, которая делает всю тяжелую работу в операционной системе. Он обрабатывает оборудование, синхронизацию, периферийные устройства, память, диски, доступ пользователей и все, что вы делаете на компьютере. Он решает, когда программное обеспечение должно запускаться и какие разрешения должны быть предоставлены ему. Это гарантирует, что никакая программа не обращается к памяти, которая ей не принадлежит, и что никакая программа не вызывает сбой других программ. Он разделяет время на использование процессора процессами и еще почти сотню обязанностей.

Затем у нас есть нечто, называемое оболочкой. Оболочка - это часть ОС, с которой вы, как пользователь, взаимодействуете. Это интерфейс, созданный для того, чтобы пользователь мог общаться с ядром. Командная строка и оболочки с графическим интерфейсом существуют. Комбинация этих и нескольких других программ вместе называется ОС.

Ядро - это единственная программа, постоянно работающая на компьютере (без него у вас не было бы ОС)

Прошивка

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

Для простоты мы можем представить компьютер как систему, состоящую из центрального процессора и множества периферийных устройств. Все пользовательские программы выполняются на центральном процессоре, который представляет собой мощный механизм выполнения общего назначения, и выполняемая им функция полностью определяется выполняемой программой. Теперь рассмотрим случай периферийных устройств, у них будет выделенная функция, например:

  • eMMC или аналогичное вторичное хранилище - управление блоками, интерпретация команд eMMC, отправленных с хоста, управление операциями чтения-записи и т. д.
  • Контроллер сенсорного экрана - для интерпретации команд от хоста; прочтите координаты x и y, к которым прикоснулся пользователь; отправить прерывание на хост при идентификации события касания и т. д.
  • GPU (доступны в System-on-Chips - SoC) - управляют командным кольцевым буфером между центральным процессором и графическим процессором; интерпретировать и выполнять команды, отправленные с хоста через кольцевой буфер; обрабатывать отображенные буферы; сигнализация завершения выполнения команды (заборы) и т. д.
  • BIOS (устаревшая версия) - для запуска, настройки и запуска загрузчика с загрузочного устройства при запуске компьютера.

Для обеспечения или выполнения этих функций периферийное устройство может иметь небольшой микроконтроллер (в случае с контроллером TSP, контроллером eMMC и т. Д.) - в случае графического процессора он будет мульти- основной механизм исполнения. Все они будут иметь ЦП разной мощности.

Как и в случае со всеми процессорами, он требует инструкций для выполнения и выполнения своей требуемой функции. Ему не нужны такие возможности, как:

  • многозадачность,
  • расширенная обработка прерываний,
  • сегментация и разбиение на страницы и т. д.

Следовательно, это будет очень минимальный программный пакет, достаточный для выполнения предполагаемых функций - который называется ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.

Прошивка:

  • обычно находится в ПЗУ (постоянная память) в случае автономных устройств. Они начнут выполнение на месте (из самого ПЗУ микроконтроллером) при включении устройства.
  • Иногда он может быть загружен в небольшую оперативную память - если устройство / контроллер имеет один
  • Обычно замораживается во время производства, но в некоторых случаях его можно обновить с помощью специальных инструментов (если он записан в EEPROM или NOR flash)
  • Бывают случаи, когда микропрограммное обеспечение находится на других вторичных устройствах хранения (жесткий диск, SD-карта и т. Д.). Главный ЦП загружает прошивку на периферийное устройство через некоторую шину (I2C, SPI и т. Д.) После включения и сброса периферийных устройств (происходит во время загрузки). После этого прошивка начнет выполнение на периферийном устройстве. Это происходит в большинстве современных графических процессоров, встроенных в SoC. Обновление прошивки в таких системах происходит довольно просто.

Операционная система с другой стороны

  • Предоставляет ядро ​​ для взаимодействия с базовыми аппаратными компонентами и связанным пользовательским пространством (программами, libc, библиотеками и т. Д.) Для пользователя.
  • Он обеспечивает (через ядро) стандартные функции, такие как многопользовательская, многопрограммная, безопасность, драйверы устройств и т. Д., Которые необходимы для использования базового оборудования.

По сути, прошивка, ядро, операционная система - это абстракции, предназначенные для различных приложений.

Прерывать

Основная функция «прерывания», это делает возможным мультипрограммирование. ЦП всегда намного быстрее устройств ввода / вывода. Поэтому, когда вы начинаете операцию ввода-вывода, вам не нужно ждать ее завершения, вы можете выполнять другую работу тем временем. По завершении ввода-вывода отправляет сигнал прерывания, а программный счетчик получает адрес подпрограммы обработчика прерывания. Что произойдет, если нет операции ввода-вывода? На этот случай есть специальное устройство - «интервальный таймер». На этот раз дает прерывание. Операционная система обрабатывает эти параллельные операции. Для этого есть разные алгоритмы. И прекрасная область системного программирования. Также есть программные прерывания (исключения) в случае критического программного события. (например разделить на ноль или повредить защиту памяти и т. д.)

Прерывание в операционной системе - это своего рода событие, генерируемое либо внутри, либо извне, которое запускает определенную последовательность событий. Возможно, было бы проще объяснить на более мелком уровне:

Аппаратные прерывания поступают извне операционной системы. На компьютере это может произойти из-за щелчка мыши, жесткого диска или даже из-за сбоя в какой-либо форме. Они называются асинхронными прерываниями, потому что они не обязательно происходят после завершения другой операции на компьютере и не зависят от времени компьютера. Асинхронное прерывание может произойти в любой момент. Предположим, у вас есть микроконтроллер с одной кнопкой и одним светодиодом. У вас есть прерывание, которое будет включать и выключать светодиод, срабатывающий при нажатии этой кнопки.

Когда кнопка нажата, где-то в микроконтроллере устанавливается флаг, который, по сути, отправляет прямое сообщение микроконтроллеру, в котором говорится: «Эй, событие произошло!» и он дает местоположение события, в данном случае это вход, которым является кнопка. Это место указывает на определенное место в памяти программы, где происходят действия, которые вы хотите выполнить. В этом случае местоположение, на которое указывает вектор прерывания, является функцией, которая включает или выключает светодиод.

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

Синхронное прерывание - или программное прерывание (также иногда называемое «исключением») - происходит, когда процессор сталкивается с каким-то странным или иным неожиданным поведением при обработке программного обеспечения. Они считаются синхронными, потому что происходят в пределах времени компьютера и не зависят от каких-либо вечных источников.

Обработка прерываний:

  • Операционная система сохраняет состояние ЦП, сохраняя регистры и программный счетчик.
  • Входящие прерывания отключены (предотвращение потери прерываний)
  • Какое устройство?

Опрос (личность неизвестна)

Vectored (отправляет личность)

  • Отдельные сегменты кода определяют, какое действие следует предпринять для каждого типа прерывания.

Временная шкала прерывания:

Структура операционной системы

Операционная система может иметь много структур. По структуре операционной системы; Операционные системы можно разделить на множество категорий.
Некоторые из основных структур, используемых в операционных системах:

  1. Простая структура

Это самая старая архитектура, используемая для разработки операционной системы. Всего один или два уровня кода. Когда DOS была изначально написана, ее разработчики понятия не имели, насколько большой и важной она в конечном итоге станет. Он был написан несколькими программистами за относительно короткий промежуток времени без использования современных методов разработки программного обеспечения, а затем постепенно разросся, превзойдя свои первоначальные ожидания. Он не разбивает систему на подсистемы и не делает различий между пользовательским режимом и режимом ядра, позволяя всем программам получать прямой доступ к базовому оборудованию. (Обратите внимание, что в любом случае набор микросхем 8088 не поддерживает режим "пользовательский" и "режим ядра", так что в то время это не было вариантом.)

Исходная ОС UNIX использовала простой многоуровневый подход, но почти вся ОС была на одном большом уровне, не разбивая ОС на многоуровневые подсистемы:

2. Многоуровневая архитектура операционной системы.

Многоуровневая архитектура операционной системы была разработана в 60-х годах при таком подходе, операционная система разбита на несколько уровней. Операционная система разделена на несколько уровней (уровней), каждый из которых построен поверх нижних уровней. Нижний уровень (уровень 0) - это оборудование, самый высокий (уровень N) - это пользовательский интерфейс. При модульности уровни выбираются таким образом, что каждый из них использует функции (операции) и службы только нижележащих уровней.

Первый уровень можно отлаживать, не беспокоясь об остальной части системы. Для реализации этой функции после того, как первый уровень отлажен, требуется базовое оборудование пользователя. Можно предположить, что оно работает правильно, пока второй уровень будет отлажен и в ближайшее время. Если ошибка обнаружена во время отладки определенного уровня, уровень должен находиться на этом слое, потому что уровень под ним уже отлажен. Из-за этого конструкция системы упрощается, когда операционная система разбита на слои.

  • Другой подход - разбить ОС на несколько более мелких уровней, каждый из которых опирается на уровень ниже и полагается исключительно на услуги, предоставляемые следующим более низким уровнем.
  • Такой подход позволяет разрабатывать и отлаживать каждый уровень независимо, предполагая, что все нижние уровни уже отлажены и могут предоставлять надлежащие услуги.
  • Проблема состоит в том, чтобы решить, в каком порядке размещать слои, поскольку ни один слой не может обращаться к услугам более высокого уровня, и может возникнуть очень много ситуаций с курицей и яйцом.
  • Многоуровневые подходы также могут быть менее эффективными, поскольку запрос на обслуживание от более высокого уровня должен фильтровать все нижние уровни, прежде чем он достигнет HW, возможно, со значительной обработкой на каждом этапе.

Операционная система Os / 2 является примером многоуровневой архитектуры операционной системы, другим примером является более ранняя версия Windows NT.
Основным недостатком этой архитектуры является то, что она требует соответствующего определения различных уровней и тщательного планирования надлежащего размещение слоя. Нижние уровни не зависят от верхних уровней.

3. Микроядро

ОС построена из множества процессов на уровне пользователя.

  • Основная идея микроядер состоит в том, чтобы удалить из ядра все несущественные службы и вместо этого реализовать их как системные приложения, тем самым сделав ядро ​​как можно меньшим и эффективным.
  • Большинство микроядер обеспечивают базовое управление процессами и памятью, а также передачу сообщений между другими службами и не более того.
  • Безопасность и защиту можно повысить, поскольку большинство служб выполняется в пользовательском режиме, а не в режиме ядра.
  • Расширение системы также может быть проще, поскольку оно включает только добавление дополнительных системных приложений, а не перестройку нового ядра.
  • Mach был первым и наиболее широко известным микроядром, и теперь он составляет основной компонент Mac OSX.
  • Первоначально Windows NT была микроядром, но страдала от проблем с производительностью по сравнению с Windows 95. NT 4.0 улучшила производительность за счет перемещения большего количества служб в ядро, и теперь XP снова стала более монолитной.
  • Другой пример микроядра - QNX, ОС реального времени для встраиваемых систем.

4. Модульный

Ядро ядра с динамически загружаемыми модулями.

  • Современная разработка ОС является объектно-ориентированной, с относительно небольшим ядром ядра и набором модулей, которые могут быть связаны динамически. См., Например, структуру Solaris, показанную на рисунке 2.13 ниже.
  • Модули похожи на уровни в том, что каждая подсистема имеет четко определенные задачи и интерфейсы, но любой модуль может свободно связываться с любым другим модулем, что устраняет проблемы прохождения нескольких промежуточных уровней, а также проблемы с курицей и яйцом.
  • Ядро в этой архитектуре относительно невелико, подобно микроядрам, но ядро ​​не обязано реализовывать передачу сообщений, поскольку модули могут связываться друг с другом напрямую.

5. Гибридная система

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

MAC OS

  • Архитектура Max OSX опирается на микроядро Mach для основных служб управления системой и ядро ​​BSD для дополнительных служб. Сервисы приложений и динамически загружаемые модули (расширения ядра) обеспечивают остальную функциональность ОС:

iOS

  • Операционная система iOS была разработана Apple для iPhone и iPad. Он требует меньше памяти и вычислительной мощности, чем Max OS X, и поддерживает интерфейс с сенсорным экраном и графику для небольших экранов:

Android

  • ОС Android была разработана для смартфонов и планшетов Android Open Handset Alliance, в первую очередь Google.
  • Android - это ОС с открытым исходным кодом, в отличие от iOS, что и привело к ее популярности.
  • Android включает версии Linux и виртуальную машину Java, оптимизированные для небольших платформ.
  • Приложения для Android разрабатываются с использованием специальной среды разработки Java-for-Android.

Компоненты операционной системы

Операционная система предоставляет среду, в которой выполняются программы. Для создания такой среды система разбивается на небольшие модули с четко определенным интерфейсом. Разработка новой операционной системы - важная задача. Очень важно, чтобы цели системы были определены до начала проектирования. Тип желаемой системы является основой для выбора между различными алгоритмами и стратегиями, которые будут необходимы. Такая большая и сложная система, как операционная система, может быть создана только путем разделения ее на более мелкие части. Каждая из этих частей должна быть четко определенной частью системы с четко определенными входами, выходами и функциями. Очевидно, что не все системы имеют одинаковую структуру. Однако многие современные операционные системы имеют общие системные компоненты, описанные ниже.

  1. Управление процессом

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

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

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

Процесс - это единица работы в системе. Такая система состоит из набора процессов, некоторые из которых являются процессами операционной системы, выполняющими системный код, а остальные - пользовательскими процессами, выполняющими пользовательский код. Все эти процессы потенциально могут выполняться одновременно.

Операционная система отвечает за следующие действия в связи с управляемыми процессами.

  • Создание и удаление как пользовательских, так и системных процессов
  • Приостановка - это возобновление процессов
  • Предоставление механизмов синхронизации процессов.
  • Предоставление механизмов обработки тупиковых ситуаций

2. Управление памятью

Память занимает центральное место в работе современной компьютерной системы. Память - это большой массив слов или байтов, каждый со своим адресом. Взаимодействие достигается посредством последовательности операций чтения или записи определенного адреса памяти. ЦП выбирает и сохраняет в памяти.

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

Чтобы улучшить как использование ЦП, так и скорость реакции компьютера на запросы пользователей, несколько процессов должны храниться в памяти. Есть много разных алгоритмов в зависимости от конкретной ситуации. Выбор схемы управления памятью для конкретной системы зависит от многих факторов, но особенно от конструкции аппаратного обеспечения системы. Каждый алгоритм требует собственной аппаратной поддержки.

Операционная система отвечает за следующие действия, связанные с управлением памятью.

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

3. Управление вторичным хранилищем

Основное назначение компьютерной системы - выполнение программ. Эти программы вместе с данными, к которым они обращаются, во время выполнения должны находиться в оперативной памяти. Поскольку основная память слишком мала для постоянного размещения всех данных и программ, компьютерная система должна обеспечивать вторичное хранилище для резервного копирования основной памяти. Большинство современных компьютерных систем используют диски в качестве основного оперативного хранилища информации, как программ, так и данных. Большинство программ, таких как компиляторы, ассемблеры, процедуры сортировки, редакторы, форматеры и т. Д., Хранятся на диске до загрузки в память, а затем используют диск как источник и место назначения для своей обработки. Следовательно, правильное управление дисковым хранилищем имеет решающее значение для компьютерной системы.

Есть несколько альтернатив. Системы с магнитной лентой обычно слишком медленные. Кроме того, они ограничены последовательным доступом. Таким образом, ленты больше подходят для хранения редко используемых файлов, где скорость не имеет первостепенного значения.

Операционная система отвечает за следующие действия, связанные с управлением дисками.

  • Управление свободным пространством
  • Распределение памяти
  • Планирование диска.

Операционная система-сервисы

Операционная система предоставляет услуги как пользователям, так и программам.

  • Он предоставляет программам среду для выполнения.
  • Он предоставляет пользователям услуги для удобного выполнения программ.

Ниже приведены несколько общих служб, предоставляемых операционной системой.

  • Выполнение программы
  • Операции ввода / вывода
  • Манипуляции с файловой системой
  • Коммуникация
  • Обнаружение ошибок
  • Распределение ресурсов
  • Защита

Выполнение программы

Операционные системы обрабатывают множество видов деятельности, от пользовательских программ до системных программ, таких как диспетчер очереди печати принтера, серверы имен, файловый сервер и т. Д. Каждая из этих операций инкапсулируется как процесс.

Процесс включает в себя полный контекст выполнения (код для выполнения, данные для управления, регистры, используемые ресурсы ОС). Ниже приведены основные действия операционной системы в отношении управления программами.

  • Загружает программу в память.
  • Выполняет программу.
  • Управляет выполнением программы.
  • Предоставляет механизм синхронизации процессов.
  • Предоставляет механизм для взаимодействия процессов.
  • Предоставляет механизм обработки тупиковых ситуаций.

Операции ввода-вывода

Подсистема ввода-вывода состоит из устройств ввода-вывода и соответствующего программного обеспечения драйвера. Драйверы скрывают от пользователей особенности конкретных аппаратных устройств.

Операционная система управляет обменом данными между пользователем и драйверами устройств.

  • Операция ввода-вывода означает операцию чтения или записи с любым файлом или любым конкретным устройством ввода-вывода.
  • Операционная система обеспечивает доступ к необходимому устройству ввода-вывода при необходимости.

Манипуляции с файловой системой

Файл представляет собой набор связанной информации. Компьютеры могут хранить файлы на диске (вторичное хранилище) для долгосрочного хранения. Примеры носителей информации включают магнитную ленту, магнитный диск и оптические приводы, такие как CD, DVD. Каждый из этих носителей имеет свои собственные свойства, такие как скорость, емкость, скорость передачи данных и методы доступа к данным.

Файловая система обычно организована в каталоги для облегчения навигации и использования. Эти каталоги могут содержать файлы и другие направления. Ниже приведены основные действия операционной системы в отношении управления файлами.

  • Программа должна прочитать файл или записать файл.
  • Операционная система дает программе разрешение на работу с файлом.
  • Разрешение может быть разным: только чтение, чтение-запись, отказ и так далее.
  • Операционная система предоставляет пользователю интерфейс для создания / удаления файлов.
  • Операционная система предоставляет пользователю интерфейс для создания / удаления каталогов.
  • Операционная система предоставляет интерфейс для создания резервной копии файловой системы.

Общение

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

ОС обрабатывает стратегии маршрутизации и подключения, а также проблемы конкуренции и безопасности. Ниже приведены основные действия операционной системы в отношении связи.

  • Два процесса часто требуют передачи данных между ними.
  • Оба процесса могут быть на одном компьютере или на разных компьютерах, но связаны через компьютерную сеть.
  • Связь может быть реализована двумя способами: с помощью общей памяти или с помощью передачи сообщений.

Обработка ошибок

Ошибки могут возникнуть в любое время и в любом месте. Ошибка может произойти в ЦП, в устройствах ввода-вывода или в аппаратной памяти. Ниже приведены основные действия операционной системы в отношении обработки ошибок.

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

Управление ресурсами

В случае многопользовательской или многозадачной среды ресурсы, такие как основная память, циклы ЦП и хранилище файлов, должны выделяться каждому пользователю или каждому заданию. Ниже приведены основные действия операционной системы в отношении управления ресурсами.

  • ОС управляет всеми видами ресурсов с помощью планировщиков.
  • Алгоритмы планирования ЦП используются для лучшего использования ЦП.

Защита

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

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

  • ОС гарантирует, что весь доступ к системным ресурсам находится под контролем.
  • ОС гарантирует, что внешние устройства ввода-вывода защищены от недействительных попыток доступа.
  • ОС предоставляет возможность аутентификации для каждого пользователя с помощью паролей.

Введение в системные вызовы

Чтобы понять системные вызовы, сначала нужно понять разницу между режимом ядра и пользовательским режимом ЦП. Каждая современная операционная система поддерживает эти два режима.

Режимы, поддерживаемые операционной системой

Режим ядра

  • Когда ЦП находится в режиме ядра, выполняемый код может получить доступ к любому адресу памяти и любому аппаратному ресурсу.
  • Следовательно, режим ядра - это очень привилегированный и мощный режим.
  • Если программа выйдет из строя в режиме ядра, вся система будет остановлена.

Пользовательский режим

  • Когда ЦП находится в пользовательском режиме, программы не имеют прямого доступа к памяти и аппаратным ресурсам.
  • В пользовательском режиме, если какая-либо программа дает сбой, останавливается только эта конкретная программа.
  • Это означает, что система будет в безопасном состоянии, даже если программа в пользовательском режиме выйдет из строя.
  • Следовательно, большинство программ в ОС запускаются в пользовательском режиме.

Системный вызов

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

Когда программе в пользовательском режиме требуется доступ к ОЗУ или аппаратному ресурсу, она должна попросить ядро ​​предоставить доступ к этому ресурсу. Это делается с помощью так называемого системного вызова.

Когда программа выполняет системный вызов, режим переключается из пользовательского режима в режим ядра. Это называется переключением контекста.

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

Обычно системные вызовы выполняются программами пользовательского уровня в следующих ситуациях:

  • Создание, открытие, закрытие и удаление файлов в файловой системе.
  • Создание и управление новыми процессами.
  • Создание соединения в сети, отправка и получение пакетов.
  • Запрос доступа к аппаратному устройству, например к мыши или принтеру.

В типичной системе UNIX существует около 300 системных вызовов. Некоторые из них, которые являются важными в этом контексте, описаны ниже.

Вилка ()

Системный вызов fork() используется для создания процессов. Когда процесс (выполняемая программа) делает fork() вызов, создается точная копия процесса. Теперь есть два процесса, один из которых является родительским, а другой - дочерним процессом.

Процесс, вызвавший вызов fork(), является родительским процессом, а вновь созданный процесс называется дочерним процессом. Дочерний процесс будет точно таким же, как и родительский. Обратите внимание, что состояние процесса родительского процесса, то есть адресное пространство, переменные, открытые файлы и т. Д., Копируется в дочерний процесс. Это означает, что родительский и дочерний процессы имеют идентичные, но физически разные адресные пространства. Изменение значений в родительском процессе не влияет на дочерний процесс, и наоборот.

Оба процесса начинают выполнение со следующей строки кода, то есть со строки после вызова fork(). Давайте посмотрим на пример:

// example.c
#include <stdio.h>
void main() 
{
    int val;  
    val = fork();   // line A
    printf("%d", val);  // line B
}

Когда выполняется приведенный выше пример кода, когда выполняется строка A, создается дочерний процесс. Теперь оба процесса начинают выполнение с строки B. Чтобы отличить дочерний процесс от родительского, нам нужно посмотреть на значение, возвращаемое вызовом fork().

Разница в том, что в родительском процессе fork () возвращает значение, которое представляет собой идентификатор процесса дочернего процесса. Но в дочернем процессе fork() возвращает значение 0.

Это означает, что согласно приведенной выше программе выходом родительского процесса будет идентификатор процесса дочернего процесса, а выходом дочернего процесса будет 0.

Exec ()

Системный вызов exec() также используется для создания процессов. Но есть одно большое различие между звонками fork() и exec(). Вызов fork() создает новый процесс с сохранением родительского процесса. Но вызов exec() заменяет адресное пространство, текстовый сегмент, сегмент данных и т. Д. Текущего процесса новым процессом.

Это означает, что после exec() вызова существует только новый процесс. Процесс, который сделал системный вызов, не существовал бы.

В UNIX существует множество разновидностей exec(), одна из которых - exec1(), которая показана ниже в качестве примера:

// example2.c
#include <stdio.h>
void main() 
{
    execl("/bin/ls", "ls", 0);      // line A
    printf("This text won't be printed unless an error occurs in exec().");
}

Как показано выше, первым параметром функции execl () является адрес программы, которую необходимо выполнить, в данном случае адрес утилиты ls в UNIX. Затем следует имя программы, в данном случае ls, за которым следуют необязательные аргументы. Затем список должен заканчиваться НУЛЕВЫМ указателем (0).

Когда приведенный выше пример выполняется, в строке A вызывается и выполняется программа ls, а текущий процесс останавливается. Следовательно, функция printf() никогда не вызывается, поскольку процесс уже остановлен. Единственным исключением является то, что если функция execl () вызывает ошибку, то выполняется функция printf().

Услуги, предоставляемые системными вызовами:

  1. Создание и управление процессами
  2. Управление основной памятью
  3. Доступ к файлам, каталогам и управление файловой системой
  4. Управление устройством (ввод / вывод)
  5. Защита
  6. Сеть и т. Д.

Типы системных вызовов. Существует 5 различных категорий системных вызовов:

  1. Управление процессом : завершение, прерывание, создание, завершение, выделение и освобождение памяти.
  2. Управление файлами : создание, открытие, закрытие, удаление, чтение файла и т. Д.
  3. Управление устройством
  4. Информационное обслуживание
  5. Коммуникация

Примеры системных вызовов Windows и Unix -