Дерево семейства процессов

Дерево семейства процессов

В операционной системе Linux существует четкая иерархия процессов. Все процессы являются потомками процесса init, значение идентификатора PID для которого равно 1. Ядро запускает процесс init на последнем шаге процедуры загрузки системы. Процесс init, в свою очередь, читает системные файлы сценариев начальной загрузки (initscripts) и выполняет другие программы, что в конце концов завершает процедуру загрузки системы.

Каждый процесс в системе имеет всего один порождающий процесс. Кроме того, каждый процесс может иметь один или более порожденных процессов. Процессы, которые порождены одним и тем же родительским процессом, называются родственными (siblings). Информация о взаимосвязи между процессами хранится в дескрипторе процесса. Каждая структура task_struct содержит указатель на структуру task_struct родительского процесса, который называется parent, эта структура также имеет список порожденных процессов, который называется children. Следовательно, если известен текущий процесс (current), то для него можно определить дескриптор родительского процесса с помощью выражения:

struct task_struct *task = current->parent;

Аналогично можно выполнить цикл по процессам, порожденным от текущего процесса, с помощью кода:

struct task_struct *task;

struct list_head *list;

list_for_each(list, &current->children) {

 task = list_entry(list, struct task_struct, sibling);

 /* переменная task теперь указывает на один из процессов,

    порожденных текущим процессом */

}

Дескриптор процесса init — это статически выделенная структура данных с именем init_task. Хороший пример использования связей между всеми процессами — это приведенный ниже код, который всегда выполняется успешно.

struct task_struct *task;

for (task = current; task != $init_task; task = task->parent)

 ;

/* переменная task теперь указывает на процесс init */

Конечно, проходя по иерархии процессов, можно перейти от одного процесса системы к другому. Иногда, однако, желательно выполнить цикл по всем процессам системы. Такая задача решается очень просто, так как список задач — это двухсвязный список. Для того чтобы получить указатель на следующее задание из этого списка, имея действительный указатель на дескриптор какого-либо процесса, можно использовать показанный ниже код:

list_entry(task->tasks.next, struct task_struct, tasks);

Получение указателя на предыдущее задание работает аналогично.

list_entry(task->tasks.prev, struct task_struct, tasks);

Дна указанных выше выражения доступны также в виде макросов next_task(task) (получить следующую задачу), prev_task(task) (получить предыдущую задачу). Наконец, макрос for_each_process(task) позволяет выполнить цикл по всему списку задач. На каждом шаге цикла переменная task указывает на следующую задачу из списка:

struct task_struct *task;

for_each_process(task) {

 /* просто печатается имя команды и идентификатор PID

    для каждой задачи */

 printk("%s[%d] ", task->comm, task->pid);

}

Следует заметить, что организация цикла по всем задачам системы, в которой выполняется много процессов, может быть достаточно дорогостоящей операцией. Для применения такого кода должны быть веские причины (и отсутствовать другие альтернативы).

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Семантическое DOM-дерево

Из книги Разгони свой сайт автора Мациевский Николай

Семантическое DOM-дерево Логическим продолжением уже проведенных исследований CSS/DOM-производительности браузеров стало рассмотрение зависимости времени создания документа от числа тегов (узлов дерева). Раздельно были проанализированы случаи, когда DOM-дерево является


20.5.1 Дерево SMI

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

20.5.1 Дерево SMI Вспомним, что первоначально SNMP предполагался как временное решение до выпуска стандартов управления ISO. На рис. 20.4 дерево администрирования/именования отражает первичные попытки согласования с ISO. Рис. 20.4. Дерево администрирования и именования SMIУзлы вверху


10.2. AVL-дерево: приближенно сбалансированное дерево

Из книги Программирование на языке Пролог для искусственного интеллекта автора Братко Иван

10.2. AVL-дерево: приближенно сбалансированное дерево AVL-дерево — это дерево, обладающее следующими свойствами:(1) Левое и правое поддеревья отличаются по глубине не более чем на 1.(2) Оба поддерева являются AVL-деревьями.Деревья, удовлетворяющие этому определению, могут быть


Глава 4 Программы семейства Uranus

Из книги Компьютер в помощь астрологу автора Жадаев А. Г.

Глава 4 Программы семейства Uranus Uranus — одна из старейших астрологических программ, используемых в настоящее время. Программы этого семейства обладают достаточно удобным в использовании русскоязычным интерфейсом, интуитивно понятной системой подсказок и отличаются


Глава 5 Программы семейства Zet

Из книги QNX/UNIX [Анатомия параллелизма] автора Цилюрик Олег Иванович

Глава 5 Программы семейства Zet Эта глава знакомит с программой Zet, которая наиболее распространена благодаря своей общедоступности. Существует ряд модификаций. На сайте программы представлены различные ее версии, начиная с пятой и заканчивая восьмой, наиболее


Возможности программ семейства Zet

Из книги 1С: Бухгалтерия 8 с нуля. 100 уроков для начинающих автора Гладкий Алексей Анатольевич

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


Глава 6 Программы семейства Stalker

Из книги Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/FireBird/Yaffil автора Ковязин Алексей Николаевич

Глава 6 Программы семейства Stalker В этой главе мы рассмотрим основные особенности программы Stalker, которая некоторое время назад была лидером по числу продаж на астрологическом рынке. В последнее время она уступила первые места программам более широкого профиля, однако


Глава 7 Программы семейства Almagest

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

Глава 7 Программы семейства Almagest Программы семейства Almagest — это венец астрологического и компьютерного творчества, их используют преимущественно профессиональные астрологи.С помощью программы HORARY ALMAGEST уверенное толкование самых сложных астрологических карт будет


Семейства API

Из книги Вопросы истории: UNIX, Linux, BSD и другие автора Федорчук Алексей Викторович

Семейства API Общее множество вызовов API (Application Program Interface — интегральное наименование всего множества вызовов из программной среды к услугам операционной системы), реализуемое операционной системой (ОС) реального времени QNX, естественным образом разделяется на три


Урок № 1. Общие сведения о продуктах семейства "1С"

Из книги Linux и все, все, все... Статьи и колонки в LinuxFormat, 2006-2013 автора Федорчук Алексей Викторович

Урок № 1. Общие сведения о продуктах семейства "1С" Фирма "1С" давно и прочно занимает лидирующие позиции на рынке программного обеспечения экономико-финансового и бухгалтерского назначения. В настоящее время компания предлагает широкий ассортимент программных средств,


Семерка - первый шаг нового семейства

Из книги автора

Семерка - первый шаг нового семейства Чем InterBase 7 отличается от своих предшественников? Вот главный вопрос, на который отвечает эта глава.Прежде всего надо отметить, что помимо непосредственно технических новшеств и улучшений в InterBase 7 был введен ряд изменений


Пример: получение семейства адресов сокета

Из книги автора

Пример: получение семейства адресов сокета Функция sockfd_to_family, представленная в листинге 4.4, возвращает семейство адресов сокета.Листинг 4.4. Возвращаемое семейство адресов сокета//lib/sockfd_to_family.c 1 #include "unp.h" 2 int 3 sockfd_to_family(int sockfd) 4 { 5  union { 6   struct sockaddr sa; 7   char data[MAXSOCKADDR]; 8  }


Представление семейства

Из книги автора

Представление семейства Сочетание символов SUSE в разное время писалось по разному и имело разное содержание. Сначала оно в форме S.u.S.E. было просто аббревиатурой от названия фирмы, занимавшейся консалтингом и поддержкой UNIX-систем. После того, как эта фирма занялась