Как я могу получить процесс сопоставления ядра в C?

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

core 1:  14232,42323
core 2:  42213,63434,434
core 3:  34232,34314
core 4:  42325,6353,1434,4342
core 5:  43432,64535,14345,34233
core 6:  23242,53422,4231,34242
core 7:  78789
core 8:  23423,23124,5663

я sched_getcpu возвращает основной номер вызывающего процесса. Если бы существовала функция с заданным идентификатором процесса, она вернула бы номер ядра, что также было бы хорошо, но я не нашел его. sched_getaffinity тоже не полезно; Это просто говорит вам, учитывая процесс, на каких ядрах он может работать, а это не то, что меня интересует.

0

Решение

Да, виртуальный файл /proc/[pid]/stat кажется, есть эта информация: man 5 proc:

/proc/[pid]/stat
Status  information  about  the  process.   This is used by ps(1).  It is
defined in /usr/src/linux/fs/proc/array.c.
(...fields description...)

processor %d (since Linux 2.2.8)
CPU number last executed on.

на моем двухъядерном

cat /proc/*/stat | awk '{printf "%-32s %d\n", $2 ":", $(NF-5)}'
(su):                            0
(bash):                          0
(tail):                          1
(hd-audio0):                     1
(chromium-browse):               0
(bash):                          1
(upstart-socket-):               1
(rpcbind):                       1

..хотя я не могу сказать, если это уместно и / или точно ..

1

Другие решения

Я не знаю, что вы можете получить информацию о том, какой процессор какого-либо конкретного процесса является работает, но если вы посмотрите в /procвы найдете одну запись для каждого запущенного процесса. Под этим в /proc/<pid>/cpuset вы найдете информацию о наборе процессоров, которые можно использовать для запуска этого процесса.

3

На ваш вопрос нет точного ответа. Планировщик может в любое время мигрировать процесс с одного ядра процессора на другое (и он на самом деле это делает). Так что к тому времени, как вы получите ответ, он может быть уже неправильным. И процесс, как правило, не привязан к какому-либо конкретному ядру (если его Сродство процессора был установлен, например, с sched_setaffinity (2), что необычно; смотрите также cpuset (7) для большего).

Почему ты спрашиваешь? Почему это имеет значение?

Вы, вероятно, хотите копать внутри / Proc, увидеть Proc (5) справочная страница.

Другими словами, если ядро ​​действительно предоставляет эту информацию, оно /proc/ но я думаю, что информация недоступна, потому что это не имеет никакого смысла.

NB. Ядро будет планировать процессы на различных процессорных ядрах намного лучше, чем вы можете, поэтому даже при наличии хранилища вам не нужно заботиться о ядре, на котором запущен какой-то pid.

2
По вопросам рекламы [email protected]