У меня есть простой монофонический нарезкой приложение, которое делает почти чистую обработкуНевозможно выделить исключительно процессор для моего процесса
- Он использует два Int буферов одного и того же размера
- Он читает один в каждом конкретном один все значения первого буфера
- каждое значение является случайным индексом во втором буфере
- считывает значение в индексе во втором буфере
- Он суммирует все значения, взятые из второго буфера
- Он делает все предыдущие шаги для больше и больше
- В конце концов, я печатаю число вольные и невольные контекст CPU переключается
Если размер буфера станет достаточно большим, мой компьютер начинает замедляться: почему? У меня есть 4 ядра с гиперпотоком, поэтому 3 ядра восстанавливаются. Только один на 100% занят. Это потому, что мой процесс использует почти 100% для «RAM-bus»?
Затем я создал CPU-набор, который я хочу посвятить мой процесс (мой CPU-набор содержит как CPU-потоков одного и того же ядра)
$ cat /sys/devices/system/cpu/cpu3/topology/core_id
3
$ cat /sys/devices/system/cpu/cpu7/topology/core_id
3
$ cset set -c 3,7 -s my_cpuset
$ cset set -l
cset:
Name CPUs-X MEMs-X Tasks Subs Path
------------ ---------- - ------- - ----- ---- ----------
root 0-7 y 0 y 934 1/
my_cpuset 3,7 n 0 n 0 0 /my_cpuset
Это кажется, что абсолютно никаких задач на всех работает на моем CPU-наборе. Я могу возобновить свой процесс и в то время как он работает, я запускаю:
$ taskset -c 7 ./TestCpuset # Here, I launch my process
...
$ ps -mo pid,tid,fname,user,psr -p 25244 # 25244 being the PID of my process
PID TID COMMAND USER PSR
25244 - TestCpus phil -
- 25244 - phil 7
PSR = 7: мой процесс хорошо работает на ожидаемом CPU-нить. Я надеюсь, что это только один работает на нем, но в конце концов, мой процесс показывает:
Number of voluntary context switch: 2
Number of involuntary context switch: 1231
Если бы я был непроизвольные переключения контекста, то это означает, что другие процессы запущены на моем ядре: Как это возможно? Что я должен сделать, чтобы получить номер непроизвольного контекстного переключателя = 0?
Последний вопрос: Когда мой процесс запущен, если я запускаю
$ cset set -l
cset:
Name CPUs-X MEMs-X Tasks Subs Path
------------ ---------- - ------- - ----- ---- ----------
root 0-7 y 0 y 1031 1/
my_cpuset 3,7 n 0 n 0 0 /my_cpuset
Еще раз я получаю 0 задания на моем CPU-набора. Но я знаю, что на нем есть процесс: кажется, что задача не является процессом?