kthreadd что за процесс
Русские Блоги
Процесс создания потока ядра Linux (kthread)
Мы создаем и запускаем потоки ядра в ядре, чего можно добиться, напрямую вызывая макрос kthread_run. Его прототип:
Видно, что kthread_run сначала использует kthread_create для создания потока ядра, а затем вызывает wake_up_process для пробуждения созданного потока.
Ядро создает поток, и функция 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.
Что делает приведенный выше код:
Здесь мы используем вызов kernel_thread, чтобы создать поток с функцией потока kthread и выполнить нашу функцию потока в этом потоке. Следовательно, выполнение всех потоков начинается с kthread.
Весь процесс создания ядра:
Интеллектуальная рекомендация
Преобразования общих типов для передачи данных по протоколу iOS-TCP / IP (приветствуются дополнения
Раньше я работал над проектами TCP / IP. Обработка данных является наиболее сложной задачей. Каждый раз, когда встречается новый тип данных, добавляется новый класс методов, что приводит к путанице. С.
Lotus версия 0.4.1 Данные цепочки блока Copy Block снижает синхронизацию
Lotus версия Скопируйте данные с узла, который был синхронизирован высотой блока Узел паузыlotus daemonБеги, сжатый каталогdatastoreПуть кlotus/datastore Копировать каталогchainс участиемmetadataЗамен.
Маленькая программа wx: ограничение количества списков цикла for
Все мы знаем, что wx: for используется для зацикливания массива. В этом цикле будут зациклены все данные в списке. Но часто нам не нужно зацикливать все данные или мы не хотим отображать все данные. О.
Шантажировал биткойн впервые
Предисловие Новости о вымогателях всегда случались, но я всегда чувствую, что это вряд ли случится со мной. В итоге я встретился сегодня. проблема Во второй половине дня я отправлю интерфейс студентам.
Русские Блоги
Процесс загрузки Android 8.0 (2) Запуск процесса Kthreadd kthreadd linux
Процесс запуска запуска процесса простоя ядра Linux (PID = 0) анализируется в предыдущей статье, а процесс Kthreadd и процесс INITE. Процесс INIT более сложный и помещен в следующий анализ. В этой статье анализируется процесс запуска процесса Kthreadd.
1, к kthreadd создание
Kthreadd определяет в ядре \ Kernel \ kthread.c
Состояние | Описывать |
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
3.kthread
Kthread определяет в ядре \ Kernel \ kthread.c
Кthred создает новую тему, а затем введите состояние сна. Вам нужно вручную просыпаться на потоках и выполнять соответствующие функции. Анализ процесса Kthreadd, The Dead Cycle выглядит из списка KTHREAD_CREATE_LIST () и необходимо для создания нового потока.
4. Способ создать нить
Kthread_create () и Kthread_Run () Определено в Kernel \ включают \ Linux \ kthread.h
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.
Русские Блоги
1 Обзор
2. Запускается процесс ожидания.
Оператор b start_kernel, b означает переход, переход к start_kernel.h, соответствующая реализация этого заголовочного файла находится в kernel / msm-4.4 / init / main.c
В конце функция start_kernel вызовет функцию rest_init.Эта функция запускает процесс init и процесс kthreadd. Функция rest_init будет проанализирована ниже.
3、rest_init
Определено в kernel / msm-4.4 / init / main.c
Rest_init буквально означает оставшуюся инициализацию, но ее совсем не оставляют. Он создает два важных процесса в системе Linux, init и kthreadd, и превращает процесс init_task в неактивный процесс. Затем я изменю метод в rest_init Анализируйте один за другим, чтобы все поняли.
3.1 rcu_scheduler_starting
Определено в kernel / msm-4.4 / kernel / rcu / Tree.c
3.2 kernel_thread
Определено в kernel / msm-4.4 / kernel / fork.c
имя параметра | эффект |
---|---|
CLONE_PARENT | Родительский процесс созданного дочернего процесса является родительским процессом вызывающего, а новый процесс и процесс, создавший его, становятся «братьями», а не «отцом и сыном». |
CLONE_FS | Дочерний и родительский процессы используют одну и ту же файловую систему, включая корень, текущий каталог, umask. |
CLONE_FILES | Дочерний процесс и родительский процесс используют одну и ту же таблицу дескрипторов файлов. |
CLONE_NEWNS | Запустить дочерний процесс в новом пространстве имен. Пространство имен описывает файловую иерархию процесса. |
CLONE_SIGHAND | Дочерний процесс и родительский процесс используют одну и ту же таблицу обработчиков сигналов. |
CLONE_PTRACE | Если отслеживается родительский процесс, отслеживается и дочерний процесс. |
CLONE_UNTRACED | Если отслеживается родительский процесс, дочерний процесс не отслеживается |
CLONE_VFORK | Родительский процесс приостанавливается до тех пор, пока дочерний процесс не освободит ресурсы виртуальной памяти. |
CLONE_VM | Дочерний процесс и родительский процесс работают в одном пространстве памяти. |
CLONE_PID | Когда создается дочерний процесс, PID согласуется с родительским процессом. |
CLONE_THREAD | Добавлен в Linux 2.4 для поддержки стандарта потоков POSIX, дочерний процесс и родительский процесс используют одну и ту же группу потоков. |
3.3 kernel_init
Определен в kernel / msm-4.4 / init / main.c; эта функция более важна и отвечает за запуск процесса инициализации. Этот процесс будет проанализирован позже.
3.4 numa_default_policy
Определено в файле kernel / msm-4.4 / mm / mempolicy.c
3.5 kthreadd
Определяется в kernel / msm-4.4 / kernel / kthread.c; процесс kthreadd будет рассмотрен во второй статье. Это важный процесс в ядре, отвечающий за планирование и управление потоками ядра. Потоки ядра в основном основаны на нем. Родительский процесс
3.6 rcu_read_lock & rcu_read_unlock
3.7 find_task_by_pid_ns
Определено в kernel / msm-4.4 / kernel / pid.c
task_struct называется дескриптором процесса. Эта структура содержит всю информацию, необходимую процессу, и определена в файле kernel / msm-4.4 / include / linux / sched.h.
Его структура очень сложна, в этой статье мы не будем на ней останавливаться, вы можете обратиться к структуре дескриптора процесса Linux task_struct для подробного объяснения.
3.8 init_idle_bootup_task
Определено в kernel / msm-4.4 / kernel / sched / core.c
3.9 schedule_preempt_disabled
Определено в kernel / msm-4.4 / kernel / sched / core.c
3.10 cpu_startup_entry
Определено в kernel / msm-4.4 / kernel / cpu / idle.c
4. Резюме
Интеллектуальная рекомендация
Преобразования общих типов для передачи данных по протоколу iOS-TCP / IP (приветствуются дополнения
Раньше я работал над проектами TCP / IP. Обработка данных является наиболее сложной задачей. Каждый раз, когда встречается новый тип данных, добавляется новый класс методов, что приводит к путанице. С.
Lotus версия 0.4.1 Данные цепочки блока Copy Block снижает синхронизацию
Lotus версия Скопируйте данные с узла, который был синхронизирован высотой блока Узел паузыlotus daemonБеги, сжатый каталогdatastoreПуть кlotus/datastore Копировать каталогchainс участиемmetadataЗамен.
Маленькая программа wx: ограничение количества списков цикла for
Все мы знаем, что wx: for используется для зацикливания массива. В этом цикле будут зациклены все данные в списке. Но часто нам не нужно зацикливать все данные или мы не хотим отображать все данные. О.
Шантажировал биткойн впервые
Предисловие Новости о вымогателях всегда случались, но я всегда чувствую, что это вряд ли случится со мной. В итоге я встретился сегодня. проблема Во второй половине дня я отправлю интерфейс студентам.
Использование команд ps, kill и nice для управления процессами в Linux
Вступление
На сервере Linux, как и на любой другой машине, можно запускать приложения. Компьютер рассматривает их как так называемые «процессы».
В то время как Linux обрабатывает низкоуровневое закадровое управление жизненным циклом процесса, пользователю может понадобиться другой способ взаимодействия с операционной системой для управления процессом на более высоком уровне.
Данное руководство затрагивает некоторые простейшие аспекты управления процессами. Для этого Linux предоставляет широчайший набор инструментов.
Данные понятия будут рассмотрены на примере сервера Ubuntu 12.04, но любой современный дистрибутив Linux будет работать таким же образом.
Как просматривать запущенные процессы в Linux
Самый простой способ узнать, какие процессы запущены на сервере в данный момент, – использовать команду top:
Верхняя часть выведенной информации предоставляет статистические данные системы, а именно нагрузку на систему и общее количество задач.
Можно увидеть, что 1 процесс запущен, а 55 процессов находятся в режиме ожидания (иначе говоря, простаивают, не используя ресурсы процессора).
Нижняя часть полученной информации отображает запущенные процессы и статистику по их использованию.
Усовершенствованная версия команды top под названием htop доступна в хранилищах. Чтобы установить ее, используйте данную команду:
sudo apt-get install htop
Запустив команду htop, можно увидеть более удобное для пользователя отображение информации:
Как использовать ps для получения списка процессов
Команды top и htop предоставляют удобный интерфейс для просмотра запущенных процессов, аналогичный графическому диспетчеру задач.
Тем не менее, данные инструменты не всегда достаточно гибки, чтобы адекватно охватить все сценарии.
При вызове без аргументов результаты могут быть немного неполными:
ps
PID TTY TIME CMD
1017 pts/0 00:00:00 bash
1262 pts/0 00:00:00 ps
Эти данные отображают все процессы, связанные с текущим пользователем и терминальной сессией. Это имеет смысл, так как в данный момент с терминала запущены только команды bash and ps.
Чтобы получить более полную картину процессов данной системы, можно запустить следующее:
Эти параметры приказывают ps показать процессы, принадлежащие всем пользователям (вне зависимости от их терминала) в удобном формате.
Чтобы увидеть дерево, отображающее иерархические отношения, можно запустить команду с данными параметрами:
Как можно видеть, процесс kthreadd отображен как порождающий относительно процесса ksoftirqd/0 и других.
Примечание об идентификаторах процессов (PID)
В Linux и Unix-подобных системах каждому процессу присвоен идентификатор (PID). Таким образом операционная система идентифицирует и отслеживает процессы.
Быстрый способ узнать PID процесса – использовать команду pgrep:
Это запросит идентификатор процесса и вернет его.
Первый порожденный при запуске процесс под названием init получает PID «1».
Данный процесс отвечает за порождение всех остальных процессов системы. Чем позже порожден процесс, тем больше будет присвоенный ему PID.
Родительский процесс – это процесс, ответственный за порождение другого процесса. Если порождающий процесс был прекращен, то дочерние процессы также прервутся. PID родительского процесса называется PPID.
PID и PPID можно увидеть в заголовках столбцов во многих приложениях управления процессами, включая top, htop и ps.
Любое общение между пользователем и операционной системой, связанное с процессами, предполагает перевод имен процессов в их идентификаторы и наоборот. Вот зачем утилиты сообщают PID.
Как отправлять сигналы процессам в Linux
Все процессы в Linux отвечают на сигналы.
Сигналы – способ завершить или изменить поведение программ на уровне ОС.
Как отправлять процессам сигналы при помощи PID
Наиболее распространенным способом передачи сигналов программам является команда kill.
Как и следовало ожидать, функциональность данной утилиты по умолчанию заключается в попытке завершить процесс:
Это отправит всем процессам сигнал TERM. Данный сигнал приказывает процессу завершиться. Это позволяет программе выполнять операции по очистке и завершить работу без помех.
Если программа неисправна и не завершает работу при отправке сигнала TERM, можно усилить сигнал, передав сигнал KILL:
Данный специальный сигнал отправляется не программе.
Вместо этого он передается ядру операционной системы, которое прерывает процесс. Это используется для блокировки программ, которые игнорируют сигналы, посылаемые им.
Каждый сигнал имеет ассоциированный номер, который можно передать вместо имени. К примеру, можно отправить «-15» вместо «-TERM» и «-9» вместо «-KILL».
Как использовать сигналы для других целей
Сигналы используются не только для завершения работы программ. Они также полезны для совершения других действий.
К примеру, многие демоны можно перезапустить при помощи сигнала отбоя HUP. Apache является одной из работающих по такому принципу программ.
Вышеприведенная команда заставит Apache перезагрузить конфигурационный файл и возобновить обслуживание контента.
Чтобы просмотреть список всех сигналов, которые можно отправить с kill, наберите:
Как отправлять сигналы процессам по имени
Хотя отправлять сигналы процессам гораздо удобнее при помощи PID, существуют также методы отправки сигнала с помощью имен процессов.
Команда pkill работает почти также, как kill, но она действует от имени процесса:
Команда, приведенная выше, является эквивалентом:
Чтобы послать сигнал каждому экземпляру определенного процесса, используйте команду killall:
Вышеуказанная команда отправит сигнал TERM каждому экземпляру firefox, запущенному на данном компьютере.
Как установить приоритеты процессов
Часто возникает необходимость установить, какие процессы имеют приоритет в серверной среде.
Некоторые процессы могут рассматриваться как критически важные, в то время как другие могут быть выполнены за счет остатка ресурсов.
Linux контролирует приоритеты с помощью значения под названием niceness.
Задачи с высоким приоритетом имеют низшее значение nice, так как они поглощают ресурсы. С другой стороны, задачи с низким приоритетом имеют высокое значение nice, так как они используют минимальное количество ресурсов.
При запуске команды top в начале статьи был выведен столбец, отмеченный как «NI». В нем указывается значение nice процесса:
top
Tasks: 56 total, 1 running, 55 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1019600k total, 324496k used, 695104k free, 8512k buffers
Swap: 0k total, 0k used, 0k free, 264812k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1635 root 20 0 17300 1200 920 R 0.3 0.1 0:00.01 top
1 root 20 0 24188 2120 1300 S 0.0 0.2 0:00.56 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd/0
В зависимости от системы, значение nice может варьироваться от «-19/-20» (наивысший приоритет) до «19/20» (самый низкий приоритет).
Чтобы запустить программу с определенным значением nice, можно использовать команду nice:
Это работает только при запуске новой программы.
Чтобы изменить значение nice программы, которая уже выполняется, нужно использовать инструмент renice:
renice 0 PID_to_prioritize
Примечание: в то время как nice работает с именем команды, renice вызывает PID процесса.
Итоги
Управление процессами – иногда достаточно сложная для новичков тема, так как используемые инструменты отличаются от их графических эквивалентов.
Однако концепции знакомы и интуитивно понятны, и, немного попрактиковавшись, их можно легко освоить. Поскольку процессы участвуют во всем, что касается компьютерной системы, очень важно научиться управлять ими.
Kthreadd что за процесс
Preface
There are 3 special processes under Linux, idle process (PID = 0), init process (PID = 1) and kthreadd (PID = 2):
a. PID=0 The system is automatically created and runs in the kernel mode;
b. PID=1 Created by process 0 to complete system initialization. It is the ancestor process of all other user processes in the system. All processes in Linux are created and run by the init process. First, the Linux kernel is started, then the init process is started in the user space, and then other system processes are started. After the system startup is complete, init will become a daemon to monitor other processes in the system;
c. PID=2 Its task is to manage and schedule other kernel threads kernel_thread, and it will execute a kthreadd function cyclically. The function of this function is to run the kthread maintained in the kthread_create_list global linked list. When we call kernel_thread, the kernel thread created will be added In this linked list, all kernel threads directly or indirectly take kthreadd as the parent process.
1. kthreadd thread
Path: \linux-3.10.x\init\main.c start_kernel()—>rest_init();
pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES); kthread thread creation, the source code is as follows:
Here we need to see where the kthread_create_list linked list is added. In the linked list, thread execution functions and thread parameters are bound:
Through create_kthread(create), complete the real process creation:
Call kernel_thread(kthread, create, CLONE_FS | CLONE_FILES | SIGCHLD) to complete the creation of the create thread:
The thread is created:
The process that created the new thread resumes kthread_create() and returns the task descriptor of the newly created thread. The newly created thread is not executed at this time due to the execution of the schedule() scheduling. Until we use it wake_up_process(p); wake up the newly created thread after the thread is awakened, it will continue to execute threadfn(data)
to sum up:
The kthreadd process is created by idle through kernel_thread and always runs in the kernel space. It is responsible for the scheduling and management of all kernel threads. Its task is to manage and schedule other kernel threads. Kernel_thread will execute a kthreadd function in a loop. The function of this function is to run The kthread maintained in the global linked list of kthread_create_list, when we call kernel_thread to create the kernel thread will be added to this linked list, so all kernel threads are directly or indirectly with kthreadd as the parent process, we create in the kernel through kernel_create or other methods A kernel thread, Then the kthreadd kernel thread is awakened, to perform the real work created by the kernel thread, the new thread will execute the kthread function, complete the creation work, and give up the CPU after creation, so The new kernel thread will not run immediately. Need to wake up manually, after being awakened, it will execute its own real work function.
Any kernel thread entry is kthread()
The kernel thread created by kthread_create() will not run immediately. Need to wake up manually.
The kernel thread created by kthread_create() may exit directly without executing the corresponding thread function threadfn