Спонсор: Microsoft
Опубликован: 13.11.2010 | Уровень: для всех | Доступ: свободно | ВУЗ: Санкт-Петербургский государственный университет
Лекция 25:

Обзор архитектуры и возможностей системы Linux: архитектура, ядро, распространение и лицензирование, принципы проектирования, управление процессами

< Лекция 24 || Лекция 25: 123 || Лекция 26 >

Принципы проектирования и компоненты системы Linux

Linux – многопользовательская и многозадачная ОС с полным набором UNIX-совместимых инструментов.

Ее файловая система соответствует традиционной семантике UNIX. Она полностью реализует стандартную сетевую модель UNIX.

Основные цели проектирования Linux – скорость, эффективность и стандартизация.

ОС Linux разработана как система, совместимая со стандартами POSIX по крайней мере два дистрибутива Linux были официально сертифицированы как совместимые с POSIX. Программный интерфейс Linux соответствует семантике диалекта SVR4 UNIX (разработанного фирмой AT&T), но не диалекта BSD UNIX (разработанного университетом Беркли).

Компоненты системы Linux изображены на рис. 25.2.

Компоненты системы Linux.

увеличить изображение
Рис. 25.2. Компоненты системы Linux.

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

Ядро отвечает за поддержку основных концепций (абстракций) ОС.

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

Весь код и структуры данных ядра хранятся и исполняются в едином адресном пространстве.

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

Системные утилиты выполняют индивидуальные специфические задачи.

Загружаемые модули ядра Linux

Одним из важнейших новшеств в ядре Linux являются загружаемые модули ядра ( loadable kernel modules, LKM ), появившиеся в версии 1.2. Они обеспечивают ядру гибкость и функциональность.

Части (секции) кода ядра могут компилироваться, загружаться и выгружаться, независимо от остальной части ядра.

Модуль ядра может реализовывать драйвер устройства, файловую систему или сетевой протокол.

Модульный интерфейс позволяет сторонним разработчикам реализовывать и распространять на своих собственных условиях драйверы или файловые системы, которые не могут распространяться на основе GPL.

Модули ядра позволяют инсталлировать Linux в виде стандартного, минимального ядра, без использования каких-либо встроенных устройств.

Три компоненты модуля Linux поддерживают:

  • Управление модулем
  • Регистрацию драйвера
  • Разрешение конфликтов.

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

Управление модулем разбито на две части:

  • Управление частями кода модуля в памяти ядра
  • Управление символами, на которые модуль разрешает ссылаться.

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

Схема исходного кода загружаемого модуля ядра Linux изображена на рис. 25.3.

Схема исходного кода загружаемого модуля ядра Linux.

увеличить изображение
Рис. 25.3. Схема исходного кода загружаемого модуля ядра Linux.

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

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

Таблицы регистрации включают следующие элементы:

  • Драйверы устройств
  • Файловые системы
  • Сетевые протоколы
  • Двоичные форматы.

Модуль разрешения конфликтов предоставляет механизм, который позволяет различным драйверам устройств резервировать аппаратные ресурсы и защищать эти ресурсы от случайного использования другими драйверами.

Цели модуля разрешения конфликтов:

  • Предотвратить конфликты, связанные с использованием аппаратуры
  • Предотвратить автопроверки ( autoprobes) от пересечения с уже существующими драйверами устройств
  • Разрешить конфликты различных драйверов, пытающихся иметь доступ к одной и той же аппаратуре.

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

В классической системе UNIX средства управления процессами разделяют создание процесса и запуск новой программы на две различные операции:

  • Системный вызов fork создает новый процесс
  • Новая программа запускается с помощью системного вызова exec.

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

В системе Linux свойства процесса делятся на три группы: идентификация процесса, его окружение и контекст.

Идентификатор процесса (PID) - уникальный идентификатор процесса (число); используется для указания процессов в операционной системе, когда приложение выполняет системный вызов signal, modify или wait для другого процесса.

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

Идентификация личности (Personality).Хотя это и нетрадиционно для систем типа UNIX, в Linux каждый процесс имеет уникальный идентификатор личности, с помощью которого возможна некоторая модификация семантики ряда системных вызовов. Он используется главным образом в библиотеках эмуляции, для запроса о совместимости системных вызовов с тем или иным специфическим диалектом UNIX.

Окружение процесса наследуется от процесса-родителя. Состоит из двух векторов, завершающихся нулями:

  • Вектор аргументов содержит список аргументов командной строки, использованный при вызове исполняемой программы; традиционно начинается с имени самой программы
  • Вектор окружения – список пар "NAME=VALUE", которые связывают переменные окружения с заданными именами и их произвольные текстовые значения.

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

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

Контекст процесса – это постоянно изменяющееся состояние исполняемой программы в любой момент времени.

Контекст планирования – наиболее важная часть контекста процесса; это информация, которую использует планировщик для приостановки и запуска процесса.

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

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

В то время как таблица файлов содержит список открытых файлов, контекст файловой системы применяется для запросов об открытии новых файлов. Здесь хранятся ссылки на текущую корневую ( root ) директорию и рабочую ( default ) директорию для поиска файлов.

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

Контекст виртуальной памяти процесса определяет все содержимое его персонального адресного пространства.

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

Различие проявляется только в случае, когда новый поток создается системным вызовом clone:

  • классический системный вызов fork создает новый процесс со своим полностью новым контекстом;
  • системный вызов clone создает новый процесс со своим новым идентификатором личности, но такой, которому разрешено совместно использовать структуры данных со своим родителем.

Использование системного вызова clone дает процессам возможность явного контроля над тем, какие ресурсы совместно используются потоками.

< Лекция 24 || Лекция 25: 123 || Лекция 26 >
Гульжан Мурсакимова
Гульжан Мурсакимова
Василий Четвертаков
Василий Четвертаков
Дмитрий Матвеев
Дмитрий Матвеев
Россия, Москва, 1100, 2009