Как каждый процесс прикрепляется к определенному ядру с помощью планировщика (Linux) - PullRequest
13 голосов
/ 09 февраля 2012

Сейчас я изучаю планировщик Linux. Что касается сродства ядра процессора, я хотел бы знать следующее:

1) Как каждый процесс (поток) прикрепляется к ядру?

существует системный вызов sched_setaffinity для изменения соответствия ядра, на котором выполняется процесс. Но внутренне, когда процесс (или поток) генерируется, как планировщик Linux по умолчанию назначает процесс (поток) определенному ядру? Я изменил системный вызов sched_setaffinity для получения информации о перемещении задачи из одного ядра в другое.

printk(KERN_INFO "%d %d %ld %lu %s\n", current->pid, current->tgid,
                                       current->state, current->cpus_allowed,
                                       current->comm);

Похоже, в /var/log/messages отсутствует дамп вышеуказанной информации. Так что планировщик по умолчанию закрепляет каждый процесс по-своему, но я не могу понять, как.

2) Можно ли получить идентификатор ядра по PID или другой информации?

Это то, что я хочу реализовать внутри ядра Linux. В task_struct есть член по имени cpus_allowed. Но это маска для установки сходства, а не идентификатор ядра. Я хочу получить данные, идентифицирующие ядро, на котором выполняется указанный процесс.

Спасибо

Ответы [ 4 ]

4 голосов
/ 09 февраля 2012

Каждый ЦП имеет свою собственную очередь выполнения, AFAIK. Мы можем узнать текущий ЦП процесса, посмотрев, к какой очереди выполнения он принадлежит. Учитывая task_struct *p, мы можем получить его очередь выполнения на struct rq = task_rq(p), а struct rq имеет поле с именем cpu , я думаю, это должен быть ответ.

Я не пробовал это на практике, просто прочитал некоторый код в Интернете, и я не совсем уверен, сработает он или нет. Хотелось бы, чтобы это помогло тебе.

2 голосов
/ 13 сентября 2012

Вы можете определить идентификатор процессора, на котором работает поток, используя его task_struct:

#include <linux/sched.h>

task_struct *p;
int cpu_id = task_cpu(p);
2 голосов
/ 01 июня 2012

Поле 39 в /proc/pid/stat указывает текущее ядро ​​/ процессор процесса.

Например:

#cat /proc/6128/stat
6128 (perl) S 3390 6128 3390 34821 6128 4202496 2317 268 0 0 1621 59 0 0 16 0 1 0 6860821 10387456 1946 18446744073709551615 1 1 0 0 0 0 0 128 0 18446744073709551615 0 0 17 8 0 0 0

Процесс 6128 выполняется на ядре 8.

0 голосов
/ 09 февраля 2012

Сродство ядра процессора зависит от ОС.ОС знает, как это сделать, вам не нужно.Вы можете столкнуться с множеством проблем, если укажете, на каком ядре работать, некоторые из которых могут замедлить процесс.

В ядре Linux структура данных, связанная с процессами task_struct, содержит поле битовой маски cpu_allowed.Он содержит n битов по одному для каждого из n процессоров в машине.Машина с четырьмя физическими ядрами будет иметь четыре бита.Если бы эти ядра ЦП были с поддержкой Hyper-Thread, они имели бы восьмибитную битовую маску.Если данный бит установлен для данного процесса, этот процесс может выполняться на связанном ядре.Следовательно, если процессу разрешено запускаться на каком-либо ядре и при необходимости можно выполнять миграцию между процессорами, битовая маска будет полностью равна 1.Фактически это состояние по умолчанию для процессов в Linux.Например,

PID  2441: PRIO 0, POLICY N: SCHED_NORMAL, NICE 0, AFFINITY 0x3

процесс 2441 имеет сходство с процессором 0x3, что означает, что он может использоваться в Core0 и Core1.

Приложения также могут указывать / устанавливать соответствие, используя Kernel APIsched_set_affinity () путем изменения битовой маски.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...