В этом блоге мы рассмотрим системные вызовы Linux, которые часто обсуждаются в интервью DevOps и SRE, особенно в ведущих компаниях-разработчиках.
Не все в DevOps ежедневно работают с внутренними компонентами системы или устраняют проблемы с производительностью.
Даже за 12+ лет карьеры я потратил 80% времени на проектирование и внедрение и 20% на устранение неполадок.
Это полностью зависит от характера работы и проектов, которые вы выбираете для работы.
Тем не менее, для специалистов DevOps/SRE очень важно иметь четкое представление об устранении неполадок в системе, потому что мы обычно работаем с серверами.
В этом отношении Syscall является основополагающей концепцией.
Когда вы приходите на собеседование по DevOps/SRE, вы можете ожидать вопросов, связанных с системными звонками
Чтобы начать, нам нужно четко понимать несколько основ.
Пространство ядра
Именно здесь работает ядро операционной системы, ядро.
Согласно Википедии,
Ядро — это компьютерная программа, лежащая в основе операционной системы компьютера, которая постоянно имеет полный контроль над всем в системе (Википедия).
Ядро контролирует все: память, процессы, оборудование, драйверы, безопасность и многое другое.
Также он напрямую взаимодействует с процессором, оперативной памятью, диском и другим оборудованием и имеет неограниченный доступ ко всем системным ресурсам.
Пользовательское пространство
Это среда, в которой работают приложения, ориентированные на пользователя (веб-серверы, Chrome, текстовые редакторы, командные утилиты и т. д.).
Это похоже на зону ограниченного доступа, потому что она не может напрямую получить доступ к оборудованию или управлять системными ресурсами.
Вот почему, как правило, если приложение дает сбой, это не приводит к сбою всей ОС.
Syscall (системные вызовы)
Программам в пользовательском пространстве требуется Kernel Space для доступа к системным ресурсам.
Это взаимодействие осуществляется с помощью системных вызовов (Syscalls).
В этом общении ядро выступает в качестве посредника, следя за тем, чтобы программы пользовательского пространства не испортили систему.
glibc
).Практический пример: команда ls
Чтобы лучше понять взаимодействие между пользовательским пространством и пространством ядра, давайте рассмотрим реальный пример с использованием простого Linux ls
команда.
ls
— это утилита пользовательского пространства, которая выводит список содержимого каталогов.
Каждый раз при вводе ls
чтобы вывести список файлов, ваша система тайно выполняет десятки системных вызовов для связи с ядром.
На следующем рисунке показано, как происходят все эти взаимодействия от пользователя к системному оборудованию (диску) через ядро.
Типы системных вызовов
Теперь давайте рассмотрим типы системных вызовов.
Функции системных вызовов, приведенные ниже, являются функциями библиотеки C, но они являются оболочками системных вызовов, предоставляемых операционной системой
Эти функции внутренне вызывают системные вызовы Linux для взаимодействия с ядром.
1. Управление технологическим процессом
Для управления процессами (создание, завершение, выполнение).
fork()
: Создание нового процесса.exec()
: Замените текущий процесс новой программой.exit()
: Завершение процесса.wait()
: Приостановка до завершения дочернего процесса.kill()
: Отправка сигналов процессам (например, завершение или пауза).
fork()
против exec()
Системный звонок — один из популярных вопросов на собеседовании.2. Управление файлами
Для работы с файлами (чтение, запись, изменение метаданных).
open()
: Открыть файл для чтения/записи.close()
: Освободить доступ к файлу.read()
: чтение данных из файла.write()
: Запись данных в файл.unlink()
: Удалить файл.chmod()
: Изменение прав доступа к файлам.
3. Управление устройствами
Для управления аппаратными устройствами (обрабатываются как файлы в Unix-подобных системах).
ioctl()
: Настройка операций, специфичных для устройства.read()
: чтение данных с устройства.write()
: Запись данных на устройство.
4. Информационное сопровождение
Для получения или установки данных системы/процесса.
getpid()
: Получение идентификатора текущего процесса.time()
: Получить системное время.sysinfo()
: Проверка использования системных ресурсов.setpriority()
: Настройка приоритета планирования процессов.
5. Коммуникация (IPC)
Для обеспечения межпроцессного взаимодействия (IPC) или работы в сети.
pipe()
: создание однонаправленного канала передачи данных.shmget()
: Выделение общей памяти.socket()
: Установите сетевое соединение.send()
: Передача данных по сети.recv()
: Получение данных по сети.
Заключение
Использование системных вызовов в повседневной работе встречается очень редко, если только вы не работаете с низкоуровневым системным программированием, разработкой ядра, настройкой производительности и т.д.
Тем не менее, понимание системных вызовов может быть полезно в таких ролях, как DevOps, SRE и серверная инженерия, при устранении проблем с производительностью, отладке приложений и т. д.