- rfLinux
- Tuesday, April 27, 2010
- Ещё немного о потоках ядра: kthreadd
- Что такое процесс kthreadd и дети и чем он отличается от init и детей
- 1 ответ
- Русские Блоги
- Процесс создания потока ядра Linux (kthread)
- Интеллектуальная рекомендация
- Используйте Maven для создания собственного архетипа скелета проекта (4)
- Станция интерпретации больших данных B пользуется популярностью среди гигантов района «призрачные животные» Цай Сюкуня.
- Вопрос A: Алгоритм 7-15: алгоритм кратчайшего пути Дейкстры
- Учебный дневник — перелистывание страниц
- Нулевое основание для отдыха-клиента
- Вам также может понравиться
- Подробно объясните, как новички используют sqlmap для выполнения инъекционных атак на базы данных mysql.
- Vue заметки сортируют, пусть вам начать с Vue.js:. 04_3 Сетевое приложение: AXIOS плюс Вью
- Шаблон алгоритма конной повозки
- 35 Line Code, чтобы получить метод исследования событий (ON)
- Образ докера: gitlab
- Русские Блоги
- Процесс загрузки Android 8.0 (2) Запуск процесса Kthreadd kthreadd linux
- 1, к kthreadd создание
- 2.create_kthread
- 3.kthread
- 4. Способ создать нить
- 5.kthread_create_on_node
- 6. Маленький узел
- Интеллектуальная рекомендация
- Используйте Maven для создания собственного архетипа скелета проекта (4)
- Станция интерпретации больших данных B пользуется популярностью среди гигантов района «призрачные животные» Цай Сюкуня.
- Вопрос A: Алгоритм 7-15: алгоритм кратчайшего пути Дейкстры
- Учебный дневник — перелистывание страниц
- Нулевое основание для отдыха-клиента
- Вам также может понравиться
- Подробно объясните, как новички используют sqlmap для выполнения инъекционных атак на базы данных mysql.
- Vue заметки сортируют, пусть вам начать с Vue.js:. 04_3 Сетевое приложение: AXIOS плюс Вью
- Шаблон алгоритма конной повозки
- 35 Line Code, чтобы получить метод исследования событий (ON)
- Образ докера: gitlab
rfLinux
Tuesday, April 27, 2010
Ещё немного о потоках ядра: kthreadd
ещё буквально пара слов о потоках ядра. Вероятно, Вы замечали в выводе ps -ef поток ядра kthreadd. Наверняка, у Вас даже возникал вопрос, для чего он нужен? На самом деле, всё достаточно просто. Опосредованно взаимодействуя с помощью определённых API с данным потоком, различные части ядра могут ставить в очередь на создание новые потоки, которые и создаёт kthreadd. Данные API ядра используются наряду с функцией kernel_thread(), с тем отличием, что создание нового процесса происходит не сразу же. Сам поток kthreadd стартует после инициализации основного потока ядра в функции rest_init() init/main.c: Описатель задачи (struct task_struct) kthreadd хранится в переменной ядра kthreadd_task. Заметьте, что функция kernel_thread() возвращает идентификатор нового процесса (потока). Для того, чтобы получить описатель задачи, в ядре, в частности в приведённом коде, используется функция find_task_by_pid_ns(), первый аргумент которой — идентификатор потока, чей описатель задачи нам нужен, а второй — пространство идентификаторов процесса-предка (в данном случае — init).
Функция потока kthreadd реализована в kernel/kthread.c: Если не вдаваться сейчас во все детали, то из кода видно, что kthreadd() «крутится» в вечном цикле, в начале каждого прохода проверяя состояние списка kthread_create_list. Если список пуст, то поток устанавливает своё состояние как «спящий» и отдаёт управление, вызывая функцию планировщика schedule(). Если в списке есть элементы, то поток взводит спин-блокировку на списке, чтобы обезопасить его от изменений и до тех пор, пока список не пуст последовательно выполняет следующие действия:
- в переменную create типа struct create_thread_nfo* получаем элемент списка;
- удаляем элемент из списка;
- снимаем спин-лок со списка, так что теперь в него снова можно добавлять новые элементы извне;
- используя данные, находящиеся по адресу, сохранённому в create, создаём новый поток с помощью вспомогательной функции create_kthread() (не путать с kthread_create() и kernel_thread()! в отличие от них, create_kthread() не экспортируется за пределы kthread.o);
- ну и наконец снова взводим спин-лок на списке, чтобы не произошло ничего неожиданного, пока мы будем проверять пуст ли список потоков к созданию 🙂
Очередь потоков к созданию — это нечто иное, как двусвязный список, о ктором я уже писал. Вот как выглядит структура-элемент этого списка: Самые интересные на данный момент поля здесь — это threadfn — указатель на функцию, которая должна выполняться в отдельном потоке, data — указатель на данные, которые будут использоваться потоком, result — указатель на описатель задачи для нового потока.
В список новые элементы добавляются с помощью функции kthread_create(): kthread_create() принимает указатель на функцию, которая должна выполняться в отдельном потоке (threadfn), указатель на данные для потока (data) и имя нового потока (namefmt). Сперва kthread_create() инициализирует поля переменной create типа struct kthread_create_info. Затем на время добавления нового элемента в список потоков, «ждущих» создания, kthread_create() взводит спин-лок, чтобы никто больше не мог добавить новые элементы и внести сумятицу в наши дела 🙂 Новый элемент списка добавляется в хвост с помощью макроса list_add_tail(). Затем спин-лок снимается — список снова свободен. Далее, kthread_create() будит поток kthreadd с помощью wake_up_process(), который должен будет проверить очередь и запустить новый поток, как описывалось выше. Ну и наконец, если при создании нового потока не возникло ошибок, то подготавливаем такие реквизиты нового потока, как имя и параметры планирования. Оставив новый поток в состоянии сна, возвращаем управления. Вот и всё, что делает kthread_create(). Если кратко, то она ставит в очередь новый запрос на создание потока, дожидается, пока не отработает рабочий поток kthreadd и не будет создан новый спящий поток.
На этом матрёшка не заканчивается. В упомянутой функции kthreadd() мы сознательно пропустили одно место: create_kthread() — ещё одна вспомогательная внутренняя функция, которая с помощью уже знакомого нам вызова kernel_thread() создаёт реальный поток. Но, не всё так просто. На самом деле, здесь создаётся не тот поток, который указывался в качестве аргумента threadfn для kthread_create()! Создаётся всего лишь новый поток kthread — опять же, внутренняя неэкспортируемая за пределы единицы трансляции функция 🙂 По результату, который будет положительным числом — идентификатором процесса (pid) в сучае успеха или отрицательным — код ошибки, узнаём, как всё прошло.
Что же делает kthread()? Не так и много. Сначала, новый поток копирует все необходимые данные из переданного ему аргумента _create — т.е., адрес функции потока (threadfn) и данные для потока (data). Во внутреннюю пемеременную self типа struct kthread записываем «состояние» потока — should_stop — не 0, если поток должен быть остановлен и exited — код возврата, если поток завершился. Здесь: мы устанавливаем состояние потока в TASK_UNINTERRUPTIBLE (спящий процесс). В описатель задачи — result — записываем указатель на текущий контекст (ведь когда kthread была запущена через kernel_thread(), у нас уже свой контекст выполнения для данного экземпляра kthread()). Далее, сигнализируем о завершении инициализации описателя нового процесса и состояния задачи с помощью complete() (здесь я намеренно пока не углубляюсь в то, что такое атомарное ожидание). Просим ядро выполнить перепланирование процессов. В этом месте, по сути, выполнение нашего нового потока приостанавливается, т.к. планировщик не будет выделять ему процессорное время ввиду того, что поток спит. Следущие строки будут выполнены только после того, как поток будет разбужен: Тут, как будто, ничего мистического нет. Сразу, как только поток вновь получит процессор в своё владение (будет кем-то разбужен), в переменную-код возврата мы записываем код ошибки EINTR — «процесс прерван». Затем необходимо проверить, не успел ли кто-то отменить выполнение потока. Если нет, то наконец-то выполняем именно нашу функцию — threadfn(), передавая ей в качестве аргумента данные для работы. Ну а после этого — делаем do_exit() после того, как функция threadfn() возратит управление.
Такова подсистема поочередного запуска потоков в общих чертах. Всё остальное достаточно просто:
- void kthread_bind(struct task_struct *k, unsigned int cpu) — создать поток, привязанный к конкретному процессору;
- int kthread_stop(struct task_struct *k) — запросить останов потока;
- int kthread_should_stop(void) — проверка, был ли запрошен останов потока (удобно использовать внутри самого потока);
- kthread_run(threadfn, data, namefmt, . ) — макрос, который делает то же, что kthread_create() с той лишь разницей, что поток сразу будет пробуждён.
Источник
Что такое процесс kthreadd и дети и чем он отличается от init и детей
Я хотел знать, что такое kthread и почему он не занимает память и не имеет открытых файлов. Я написал некоторый код, который будет просто печатать PID запущенных в настоящее время процессов в формате родительского дочернего дерева вместе с некоторой дополнительной информацией, такой как используемые VMZ, RSS, потоки, openfiles. Все дочерние элементы PID 2 с именем kthreadd не имели VmSize и VmRSS в /proc/[pid]/status файл. /proc/[pid]/fd не содержит открытых файлов.
Что это за процессы, чем они отличаются от обычных процессов, порожденных init (PID 1). Я читал (в старой книге), что подкачка будет порождать init PID1, а все остальные процессы являются дочерними для PID 1. Определенно, существует другая архитектура (ядро Linux 3.7.10.1-16), которую я не знаю, поэтому Другой вопрос: почему PID 2 является дочерним для PID 0, а не дочерним для PID 1.
1 ответ
Потоки ядра не являются потомками init, потому что они могут быть запущены до всех процессов пользовательского пространства.
Они обычно используются для управления оборудованием, поэтому они непосредственно обрабатываются ядром и имеют высокий приоритет.
Чтобы процесс был дочерним по отношению к init, его необходимо клонировать из init, а Kthreads — это не то, поэтому его родительский PID равен 0, что означает «никто»
Все процессы пользовательского пространства обычно имеют PID, превышающий 1000, только PID-потокам ядра разрешается иметь PID, меньший 1000.
Источник
Русские Блоги
Процесс создания потока ядра Linux (kthread)
Мы создаем и запускаем потоки ядра в ядре, чего можно добиться, напрямую вызывая макрос kthread_run. Его прототип:
Видно, что kthread_run сначала использует kthread_create для создания потока ядра, а затем вызывает wake_up_process для пробуждения созданного потока.
kthread_run — это определение макроса, сначала создайте структуру потока task_struct, а затем вызовите wake_up для пробуждения.
Ядро создает поток, и функция kthread_create_on_node фактически вызывается.
Как видно из приведенного выше кода, фактическое создание потока выполняется не kthread_create_on_node, а потоком kthreadd_task. Заполняя структуру kthread_create_info и добавляя ее в kthread_create_list, kthreadd_task извлекает информацию о потоке, которая будет создана из kthread_create_list, чтобы создать поток ядра.
Поток kthreadd_task создается в начале запуска ядра.
Вышеупомянутая функция kernel_thread () вызывает do_fork для создания потока ядра.
Здесь создаются два потока, один kernel_init и один kthreadadd.
Здесь мы сначала посмотрим на поток kthreadadd, соответствующая функция потока — kthreadd.
Что делает приведенный выше код:
- Если kthread_create_list пуст, составьте расписание вручную и оставьте время процессора.
- Если kthread_create_list не является пустым, то каждая структура kthread_create_info берется из связанного списка.
- Используйте извлеченную структуру kthread_create_info для вызова функции create_kthread () для создания потока.
Здесь мы используем вызов kernel_thread, чтобы создать поток с функцией потока kthread и выполнить нашу функцию потока в этом потоке. Следовательно, выполнение всех потоков начинается с kthread.
Весь процесс создания ядра:
- Создать структуру kthread_create_info, назначить функцию работы с потоками, данные и т.д .;
- Добавьте структуру потока kthread_create_info в список kthread_create_list и разбудите поток kthreadd.
- Поток kthreadd извлекает каждую структуру kthread_create_info из списка kthread_create_list и вызывает функцию create_kthread () для создания потока с функцией kthread. В потоке kthread мы выполним функцию нужного нам потока.
Интеллектуальная рекомендация
Используйте Maven для создания собственного архетипа скелета проекта (4)
Один, базовое введение в Maven Во-вторых, скачайте и настройте Maven Три, настроить домашнее зеркало на Али В-четвертых, создайте содержимое скелета архетипа В-пятых, создайте проект через архетип 6. .
Станция интерпретации больших данных B пользуется популярностью среди гигантов района «призрачные животные» Цай Сюкуня.
Автор | Сюй Линь Ответственный редактор | Ху Вэйвэй Предисловие Недавно Цай Сюкунь отправил письмо юриста на станцию B. Содержание письма юриста показало, что «на станции B имеется большое кол.
Вопрос A: Алгоритм 7-15: алгоритм кратчайшего пути Дейкстры
Название Описание Во взвешенном ориентированном графе G для исходной точки v задача о кратчайшем пути от v до оставшихся вершин в G называется задачей кратчайшего пути с одной исходной точкой. Среди ш.
Учебный дневник — перелистывание страниц
Используйте плагин Layui.
Нулевое основание для отдыха-клиента
Предисловие: статья, обобщенная, когда я только что связался с тестом API, в дополнение к остальному клиенту этот инструмент сам, некоторые из мелких пониманий API, я надеюсь помочь тому же белую белу.
Вам также может понравиться
Подробно объясните, как новички используют sqlmap для выполнения инъекционных атак на базы данных mysql.
Шаг 1. Откройте для себя инъекцию Со мной все было нормально, когда я был свободен, я случайно нажал на чужой блог и обнаружил, что ссылка заканчивается на id, поэтому я проверил его вручную. Результа.
Vue заметки сортируют, пусть вам начать с Vue.js:. 04_3 Сетевое приложение: AXIOS плюс Вью
В предыдущем разделе мы ввели основное использование AXIOS, по сравнению с нативным Ajax, который при условии, что способ является более простым и, а сетевые данные теперь в состоянии получить его ров.
Шаблон алгоритма конной повозки
Блог гангстеров Тележки, запряженные лошадьми, используются для решения проблемы самой длинной подстроки палиндрома. Основное внимание уделяется подстрокам, а не подпоследовательностям. Если вы хотите.
35 Line Code, чтобы получить метод исследования событий (ON)
Об авторе: Чжу Сяою,Личный публичный номер: языковой класс большой кошки Эта проблема научит вас этой большой классе Cat.Как написать наиболее эффективное метод исследования событий с 35 Line R Code C.
Образ докера: gitlab
GitLab Docker images Both GitLab CE and EE are in Docker Hub: GitLab CE Docker image GitLab EE Docker image The GitLab Docker images are monolithic images of GitLab running all the necessary services .
Источник
Русские Блоги
Процесс загрузки Android 8.0 (2) Запуск процесса Kthreadd kthreadd linux
Процесс запуска запуска процесса простоя ядра Linux (PID = 0) анализируется в предыдущей статье, а процесс Kthreadd и процесс INITE. Процесс INIT более сложный и помещен в следующий анализ. В этой статье анализируется процесс запуска процесса Kthreadd.
1, к kthreadd создание
Kthreadd определяет в ядре \ Kernel \ kthread.c
Прежде чем узнать выше, процесс Kthreadd создан в Rest_init (). Структура Task_Struct — это дескриптор процесса, который включает в себя такую информацию, как PID Thread_info и процесс состояния.
Состояние | Описывать |
TASK_RUNNING | Указывает состояние, в котором процесс выполняется или готов выполнить |
TASK_INTERRUPTIBLE | Процессы, потому что некоторые условия заблокированы (приостановлены), процесс преобразует состояние достижения из этого состояния после установления условия. |
TASK_UNINTERRUPTIBLE | Значение похоже на Task_IntureBreble, но мы передаем любую информацию и т. Д., Не могу их проснуться, только когда она доступна, она будет пробуждено. |
TASK_STOPPED | Процесс остановлен |
TASK_TRACED | Процесс контролируется процессом отладчика и других процессов |
EXIT_ZOMBIE | Исполнение процесса прекращается, но его родительский процесс не использовал системные вызовы, которые нужно вызвать, чтобы узнать его информацию о прекращении, и процесс становится процессом зомби. |
EXIT_DEAD | Процесс убит, то есть окончательное состояние процесса |
TASK_KILLABLE | Когда процесс находится в этом новом состоянии сна, его принцип работы похож на Task_unintureBere, но может реагировать только на фатальные сигналы. |
В цикле Kthreaddd проверьте тему, которая будет создана из списка KTHREAD_CREATE_LIST. Если нет, пусть CPU вступит в состояние сна. Если вы назвали текут создания Create_kThread ().
2.create_kthread
Create_kthread определяет в ядре \ kernel \ kthread.c
Создайте темы в create_kThread (). Затем выполните функцию Kthread. Kthreadd — это резьба демона для ядра PID = 2. KTHREAD — это просто функция потока. Примечание
3.kthread
Kthread определяет в ядре \ Kernel \ kthread.c
Кthred создает новую тему, а затем введите состояние сна. Вам нужно вручную просыпаться на потоках и выполнять соответствующие функции. Анализ процесса Kthreadd, The Dead Cycle выглядит из списка KTHREAD_CREATE_LIST () и необходимо для создания нового потока.
4. Способ создать нить
Существует два способа создания потока в ядре Linux, один — kthread_create (), упомянутый выше (), но поток, созданный kthread_create (), не просыпается, вы должны быть где-то. Поток, созданный Kthread_Run ().
Kthread_create () и Kthread_Run () Определено в Kernel \ включают \ Linux \ kthread.h
Kthread_Create () и Kthread_Run () — два макроса Linux
Kthread_create и kthread_run не являются функцией, а определение макроса, замена соответствующего кода при компиляции, параметры макроса не имеют определения типа типа, не определение типа multi-line добавит \
5.kthread_create_on_node
Kthread_create_on_node определяет в ядре \ kernel \ kthread.c
Kthread_create () и kthread_run ()-> kthread_create_on_node -> __kthread_create_on_node -> list_add_tail
Это добавит созданную резьбу на хвост Kthread_Crate_List, и Kthreadd всегда будет сравниваться с подключенным списком Kthread_Create_List, если есть нить.
6. Маленький узел
Список подключенного KTHREAD_CREATE_LIST будет цикл в процессе Kthread, если будет создан новый поток. Если вы не входите в состояние вашего сна, пусть CPU
KTHREAD_CREATE () и KTREAD_RUN () INNUX KERNEL Создайте нить Call__kThTread_create_On_node Функция, добавьте новый поток на хвост Kthread_Crate_List.
Интеллектуальная рекомендация
Используйте Maven для создания собственного архетипа скелета проекта (4)
Один, базовое введение в Maven Во-вторых, скачайте и настройте Maven Три, настроить домашнее зеркало на Али В-четвертых, создайте содержимое скелета архетипа В-пятых, создайте проект через архетип 6. .
Станция интерпретации больших данных B пользуется популярностью среди гигантов района «призрачные животные» Цай Сюкуня.
Автор | Сюй Линь Ответственный редактор | Ху Вэйвэй Предисловие Недавно Цай Сюкунь отправил письмо юриста на станцию B. Содержание письма юриста показало, что «на станции B имеется большое кол.
Вопрос A: Алгоритм 7-15: алгоритм кратчайшего пути Дейкстры
Название Описание Во взвешенном ориентированном графе G для исходной точки v задача о кратчайшем пути от v до оставшихся вершин в G называется задачей кратчайшего пути с одной исходной точкой. Среди ш.
Учебный дневник — перелистывание страниц
Используйте плагин Layui.
Нулевое основание для отдыха-клиента
Предисловие: статья, обобщенная, когда я только что связался с тестом API, в дополнение к остальному клиенту этот инструмент сам, некоторые из мелких пониманий API, я надеюсь помочь тому же белую белу.
Вам также может понравиться
Подробно объясните, как новички используют sqlmap для выполнения инъекционных атак на базы данных mysql.
Шаг 1. Откройте для себя инъекцию Со мной все было нормально, когда я был свободен, я случайно нажал на чужой блог и обнаружил, что ссылка заканчивается на id, поэтому я проверил его вручную. Результа.
Vue заметки сортируют, пусть вам начать с Vue.js:. 04_3 Сетевое приложение: AXIOS плюс Вью
В предыдущем разделе мы ввели основное использование AXIOS, по сравнению с нативным Ajax, который при условии, что способ является более простым и, а сетевые данные теперь в состоянии получить его ров.
Шаблон алгоритма конной повозки
Блог гангстеров Тележки, запряженные лошадьми, используются для решения проблемы самой длинной подстроки палиндрома. Основное внимание уделяется подстрокам, а не подпоследовательностям. Если вы хотите.
35 Line Code, чтобы получить метод исследования событий (ON)
Об авторе: Чжу Сяою,Личный публичный номер: языковой класс большой кошки Эта проблема научит вас этой большой классе Cat.Как написать наиболее эффективное метод исследования событий с 35 Line R Code C.
Образ докера: gitlab
GitLab Docker images Both GitLab CE and EE are in Docker Hub: GitLab CE Docker image GitLab EE Docker image The GitLab Docker images are monolithic images of GitLab running all the necessary services .
Источник