Взаимодействие между потоками linux

Тема3,4,5: процессы и потоки ос Linux

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

  1. Параметры блокирования (приоритет процесса, израсходованное за последний учитываемый период времени, количество проведенного в режиме ожидания времени)
  2. Образ памяти (указатели на сегмент текста, данных и стека) Когда процесса нет в памяти, то здесь так же хранится, как найти его части на диске.
  3. Сигналы (маски, указывающие, какие сигналы перехватываются, какие временно заблокированы, и какие находятся в процессе доставки).
  4. Машинные регистры. Когда происходит эмулированное прерывание в ядро, то машинные регистры сохраняются здесь
  5. Состояние системного вызова (здесь хранится информация о текущем системном вызове)
  6. Таблица дескрипторов файлов (Когда делается системный вызов, использующий дескриптор файла, то файловый дескриптор используется как индекс в этой таблице для обнаружения соответствующей этому файлу структуры данных).
  7. Учетные данные (Указатель на таблицу, в которой отслеживается использованное процессом пользовательское и системное время процесса).
  8. Стек ядра (фиксированный стек для использования той частью процесса, которая работает в режиме ядра)
  9. Разное (текущее состояние процесса, ожидаемое процессом событие, PID процесса, идентификаторы родительского процесса, группы)
  1. Выделение структуры задач для потомка
  2. Заполнение структуры задач потоком данными родителя
  3. Выделение памяти для стека и области пользователя дочернего процесса
  4. Заполнение области пользователя дочернего процесса
  5. Выделение идентификатора для дочернего процесса
  6. Настройка дочернего процесса на использование программы родительского процесса
  7. Копирование таблицы страниц для данных и стека
  8. Настройка совместного использования открытых файлов
  9. Копирование регистров родительского процесса в дочерний процесс
  1. Поиск исполняемого файла
  2. Проверка разрешения на выполнение
  3. Чтение и проверка заголовка
  4. Копирование аргументов, среды в ядро
  5. Освобождение нового адресного пространства
  6. Копирование аргументов среды в стек
  7. Сбрасывание сигнала
  8. Инициализация регистров
Читайте также:  Linux как настроить localhost

Для продолжения скачивания необходимо пройти капчу:

Источник

Оцените статью
Adblock
detector