Тема3,4,5: процессы и потоки ос Linux
Основными активными сущностями в ос Linuxявляются процессы. Процессы в Linux — классические, последовательные процессы. Каждый процесс выполняет одну программу и изначально получает один поток управления. У процесса есть один счетчик команд, который отслеживает следующую исполняемую команду. Linuxпозволяет процессу создавать дополнительные потоки. Также Linux представляет собой многозадачную систему, так, что несколько независимых процессов могут работать одновременно. У каждого процесса в Linux есть пользовательская часть, в которой работает программа пользователя, однако, когдаодин из потоков делает системный вызов,то происходит эмулированное прерывание с переключением в режим ядра. После этого поток начинает работу в контексте ядрас другой картой памяти, своимстеком ядра, счетчиком команд в режиме ядра и полным доступом ко всем ресурсам машины. Ядро ОC Linux внутренним образом представляет процессы как задачи при помощи структуры задачtask_struct. Процесс с одним потоком представляется одной структурой задач, а многопоточный процесс будет иметь по одной структуре задачи для каждого из потоков пользовательского уровня. Само ядро является многопоточным и имеет потоки уровня ядра, которые не связаны ни с какими пользовательскими процессами и выполняют код ядра. Для каждого процесса в памяти находится его дескриптор типа task_struct. Он содержит важную информацию, необходимую ядру для управления всеми процессами. Дескриптор процесса создается при создании процесса. Для совместимости с другими системами unix процессы в Linux идентифицируются при помощи идентификатора процессаPID(ProcessIdentifier). Ядро организует все процессы в двунаправленный список структур задач. Информация в дескрипторе процесса подразделяется на следующие категории:
- Параметры блокирования (приоритет процесса, израсходованное за последний учитываемый период времени, количество проведенного в режиме ожидания времени)
- Образ памяти (указатели на сегмент текста, данных и стека) Когда процесса нет в памяти, то здесь так же хранится, как найти его части на диске.
- Сигналы (маски, указывающие, какие сигналы перехватываются, какие временно заблокированы, и какие находятся в процессе доставки).
- Машинные регистры. Когда происходит эмулированное прерывание в ядро, то машинные регистры сохраняются здесь
- Состояние системного вызова (здесь хранится информация о текущем системном вызове)
- Таблица дескрипторов файлов (Когда делается системный вызов, использующий дескриптор файла, то файловый дескриптор используется как индекс в этой таблице для обнаружения соответствующей этому файлу структуры данных).
- Учетные данные (Указатель на таблицу, в которой отслеживается использованное процессом пользовательское и системное время процесса).
- Стек ядра (фиксированный стек для использования той частью процесса, которая работает в режиме ядра)
- Разное (текущее состояние процесса, ожидаемое процессом событие, PID процесса, идентификаторы родительского процесса, группы)
- Выделение структуры задач для потомка
- Заполнение структуры задач потоком данными родителя
- Выделение памяти для стека и области пользователя дочернего процесса
- Заполнение области пользователя дочернего процесса
- Выделение идентификатора для дочернего процесса
- Настройка дочернего процесса на использование программы родительского процесса
- Копирование таблицы страниц для данных и стека
- Настройка совместного использования открытых файлов
- Копирование регистров родительского процесса в дочерний процесс
- Поиск исполняемого файла
- Проверка разрешения на выполнение
- Чтение и проверка заголовка
- Копирование аргументов, среды в ядро
- Освобождение нового адресного пространства
- Копирование аргументов среды в стек
- Сбрасывание сигнала
- Инициализация регистров
Для продолжения скачивания необходимо пройти капчу: