Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Поля, связанные с атрибутами процесса
К категории атрибутов процесса мы относим характеристики процесса, связанные с состоянием и идентификацией процесса. Рассматривая значения этих полей в произвольное время, хакер ядра может узнать текущее состояние процесса. Рис. 3.2 иллюстрирует поля task_struct, которые связаны с атрибутами процесса. State Поле state отслеживает состояние процесса, в котором процесс находится во время своего жизненного цикла. Может хранить значения TASK__RUNNING, TASK_INTERRUP-TIBLE, TASK..UNINTERRUPTIBLE, TASK_ZOMBIE, TASK_STOPPED и TASK_DEAD (см. более детальное описание в разделе «Жизненный цикл процесса»). Pid В Linux каждый процесс имеет уникальный идентификатор процесса (process identifier, pid. Его тип можно привести к целочисленному, а максимальное знаение по умолчанию равно 32768 (наибольшее значение для short int). Flags Флаги определяют специальные атрибуты, принадлежащие процессу. Флаги процессов определены в файле include/linux/sched.h и включают флаги, перечисленные в таблице 3.1. Значения флагов позволят хакеру получить больше информации о работе процесса. Описатель процесса
Рис. 3.2. Поля, связанные с атрибутами процесса Таблица 3.1. Избранные значения флагов task_struct Имя флага Когда устанавливается
PF_STARTING PF_EXITING PF_DEAD PF FORKNOEXEC При создании процесса Во время вызова do_exit () Во время вызова exit__notif у () при выходе из процесса. В этой точке процесс находится в состоянии TASK__ZOMBIE или TASK_DEAD Родитель устанавливает этот флаг перед ветвлением Bitfmt Linux поддерживает несколько исполнимых форматов. Исполнимый формат определяет, как структура кода вашей программы будет загружена в память. Рис. 3.2 иллюстрирует связь между task_struct и структурой linux_binfmt, которая содержит всю информацию, относящуюся к определенному бинарному формату (см. гл. 9). Глава 3 • Процессы: принципиальная модель выполнения 3.2.1.5 exit_code и exit_signal Поля exit_code и exit_signal хранят код выхода процесса и сигнал завершения (если он был использован). Таким образом выходное значение дочернего процесса передается его родителю. Pdeath.signal pdeath__signal - это сигнал, посылаемый при смерти родителя. Comm Чаще всего процесс создается с помощью вызова исполнимого файла из командной строки. Поле comm хранит имя исполнимого файла, вызванного из командной строки. Ptrace ptrace устанавливается системным вызовом ptrace (), вызываемым при измерении производительности процесса. Обычно флаги ptrace () определяются в файле include /linux/ptrace.h. 3.2.2 Поля, связанные с планировщиком Операции с процессами выполняются так, как будто они выполняются на собственном виртуальном процессоре. Тем не менее на самом деле он делит процессор с другими процессами. Чтобы поддерживать переключение между выполняемыми процессами, каждый процесс тесно взаимодействует с планировщиком (более подробно это описано в гл. 7). Тем не менее для того чтобы разобраться с назначением некоторых полей, вам необходимо понять несколько базовых концепций планировщика. Когда для запуска готово более одного процесса, планировщик решает, какой из них запустить первым и на какое время. Планировщик достигает равномерной производительности и эффективности, выделяя каждому процессу временной срез (timeslice) и приоритет (priority). Временной срез определяет длительность времени, отводимую процессу до того, как будет выполнено переключение на другой процесс. Приоритет процесса - это значение, определяющее относительный порядок, в котором процессу будет позволено выполняться с учетом ожидающих процессов, - чем выше приоритет процесса, тем быстрее планировщик его запустит. Поля, показанные на рис. 3.3, отслеживают значения, необходимые планировщику. Prio В гл. 7 мы увидим, что динамический приоритет процесса - это значение, зависящее от истории планировщика процессов и определяющее значение nice. (Более подробно значение nice описано в следующей вставке.) Оно обновляется во время sleep, когда процесс не выполняется и когда будет использован следующий временной срез. Это Описатель процесса
Рис. 3.3. Поля, связанные с планировщиком значение prio связано со значением поля static_prio, описанного далее. Поле prio хранит +/- 5 к значению static_prio, зависящие от истории процесса; он получает бонус +5, если слишком долго спал, и штраф -5, если удерживал процессор в течение слишком многих временных срезов. 3.2.2.2 static_prio s tatic_prio - это эквивалент значения nice. Значение static_prio по умолчанию равно MAX_PRIO-20. В нашем ядре значение по умолчанию для MAX_PRIO составляет 140. Runjist Поле run_list указывает на runqueue; runqueue содержит список всех выполняемых процессов. (См. раздел «Базовые структуры» для получения более подробной информации о структуре runqueue.) Глава 3 • Процессы: принципиальная модель выполнения Nice Системный вызов nice () позволяет пользователю изменять статический приоритет планировщика для процесса. Значение nice может варьироваться от -20 до 19. Далее функция nice () вызывает set_user_nice () для установки поля static_prio структуры task_ struct. Значение static_prio рассчитывается из значения nice с помощью макроса PRIO_TO_.NI СЕ. Аналогично значение nice рассчитывается из значения static_prio с помощью вызова NICE_TO_PRIO. ------------------------------------------------- kernel/sched.с tdefine NICE_TO_PRIO(nice) (MAX_RT_PRIO + nice + 20) tdefine PRIO_TO_NICE (prio) (prio - MAX_RT_PRIO - 20) Array Поле array указывает на массив приоритетов runqueue. (Раздел «Слежение за процессом: базовые конструкции планировщика» в этой главе описывает этот массив более подробно.) 3.2.2.5 sleep_avg Поле sleep__avg используется для расчета эффективного приоритета задачи, равного среднему количеству тиков счетчика, потраченному задачей на сон. Timestamp Поле timestamp используется для расчета sleep__avg, когда задача приостановлена или спит. 3.2.2.7 interactive_credit Поле interactive__credit используется вместе со sleep_avg и активизирует поля для расчета sleep_avg. Policy policy определяет тип процесса (например, разделяющий время или работающий в реальном времени). Тип процесса сильно зависит от приоритета планировщика. (Более подробно это поле описано в гл. 7.) 3.2.2.9 cpus_allowed Поле cpus__allowed указывает, какой процессор обрабатывает задачу. Это один из способов указания конкретного процессора для данной задачи при работе на многопроцессорной системе. 3.2 Описатель процесса 3.2.2.10 time.slice Поле time_slice определяет максимальный отрезок времени, разрешенный процессу для выполнения. 3.2.2.11 firstjime_slice Поле first_time_slice периодически устанавливается в 0 и отслеживается планировщиком. 3.2.2.12 activated Поле activated отслеживает инкрементирование и декрементирование среднего времени сна. Если выполняется непрерываемая задача, это поле устанавливается в -1. 3.2.2.13 rtpriority rt_priority - это статическое значение, которое может быть обновлено только вызовом schedule (). Это значение необходимо для поддержки задач реального времени. 3.2.2.14 nivcsw и nvcsw Существуют различные типы контекстов. Ядро отслеживает их с целью профилирования. Глобальный счетчик переключений устанавливается одним из четырех контекстных счетчиков переключений в зависимости от типа перехода выполняемого при переключении контекста (переключение контекстов описано в гл. 7). Ниже представлены счетчики для базовых переключений контекста. • Поле nivcsw (количество непринудительных переключений контекста) хранит счетчик приоритета ядра, примененного к задаче. Он увеличивается только при возвращении задачи на основе приоритета ядра, когда счетчик переключений устанавливается с помощью nivcsw. • Поле nvcsw (количество принудительных переключений контекста) хранит счетчик переключений контекста, основанных на приоритете ядра. Счетчик переключений устанавливается в nvcsw, если предыдущее состояние не было активным приоритетом. Популярное:
|
Последнее изменение этой страницы: 2016-03-25; Просмотров: 761; Нарушение авторского права страницы