Модель процессов в современных операционных системах и их реализация в ОС Linux

Автор: Кирьянов Д.А.

Журнал: Сервис в России и за рубежом @service-rusjournal

Статья в выпуске: 1 (1), 2007 года.

Бесплатный доступ

Короткий адрес: https://sciup.org/14056806

IDR: 14056806

Текст статьи Модель процессов в современных операционных системах и их реализация в ОС Linux

Д.А. Кирьянов, студент группы ИС 33

Московский государственный университет сервиса, г. Москва

Современные операционные системы, такие как, Linux, *BSD, Solaris и др., предоставляют пользователю несколько фундаментальных концепций, таких как, концепция файла, процесса и т.д.

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

Процесс состоит из нескольких компонентов:

  • 1.    Стек процесса, где хранятся локальные переменные

  • 2.    Регистры процессора, в которые загружены ключевые переменные (зависит от архитектуры)

  • 3.    Адресное пространство.

  • 4.    Ресурсы, такие как дескрипторы открытых файлов, ожидающие на обработку сигналы и т.д.

  • 5.    Управляющие структуры ядра ОС.

В некоторых ОС, таких как Microsoft Windows или Sun Solaris, различают еще и, так называемые, легковесные процессы(потоки, lightweight processes). На их поддержание тратится лишняя память ядра.

Linux не различает понятий процесс и поток - каждый новый создаваемый процесс является и потоком.

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

Основная структура в ядре Linux которая соответствует каждому процессу, является task_struct. Все процессы связаны в двухсвязный кольцевой список с названием task list.

Каждая структура task_struct занимает порядка 1,7 Кб, зато полностью описывает процесс.

Поля структуры task_struct содержат информацию о процессе, которую можно поделить на несколько категорий:

  • 1.    Поля, которые отвечают за общую информацию о процессе, такие как идетификатор процесса(PID), код завершения процесса(exit_code), идентификатор родительского процесса(PPID) и т.д.

  • 2.    Поля, нужные для планировщика задач: приоритет процесса(prio и static_prio), квант времени(timeslice) и т.д.

  • 3.    Поля, связанные с безопасностью: идентификатор пользователя, запустившего процесс(uid), идентификатор группы(gid) и т.д.

Процессы могут находиться в нескольких определенных состояниях:

  • 1.    TASK_RUNNING

  • 2.    TASK_INTERRUPTIBLE

  • 3.    TASK_UNINTERRUPTIBLE

  • 4.    TASK_STOPPED

  • 5.    TASK_ZOMBIE

Процесс находится в состоянии TASK_RUNNING во время выполнения или в очереди выполнения. Состояния TASK_INTERRUPTIBLE и TASK_UNINTERRUPTIBLE применяются во время блокировки( например при ожидании ресурса). TASK_STOPPED наступает при получении процессом сигнала SIGSTOP. И , наконец, TASK_ZOMBIE, наступает при смерти процесса (процесс завершен, но родитель не вызвал функцию sys_wait4())

Чтобы изменить состояние процесса, существует функция set_task_state(). В ядре Linux текущую task_struct выполняющегося процесса, можно получить с помощью макроса current.

ИССЛЕДОВАНИЕ ВОЗМОЖНОСТИ ПРИМЕНЕНИЯ МАЛОГАБАРИТНЫХ ПЛАЗМАТРОНОВ НА ПРЕДПРИЯТИЯХ СЕРВИСА

Статья