Модель процессов в современных операционных системах и их реализация в ОС 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.
ИССЛЕДОВАНИЕ ВОЗМОЖНОСТИ ПРИМЕНЕНИЯ МАЛОГАБАРИТНЫХ ПЛАЗМАТРОНОВ НА ПРЕДПРИЯТИЯХ СЕРВИСА