Знаете ли вы, что значение констант определено в linux/sched.h
:
#define PF_VCPU 0x00000010 /* I'm a virtual CPU */
#define PF_WQ_WORKER 0x00000020 /* I'm a workqueue worker */
Что означает, когда у процесса установлены оба флага (девятый параметр в /proc/[pid]/stat
is 0x30
или decimal 48
)
Я нашел только короткие комментарии после определений, но не могу представить никакого смысла.
решение1
Этот фрагмент объясняет цель PF_WQ_WORKER
.
выдержка
Управляемая параллелизмом очередь работ должна знать, когда рабочие засыпают и просыпаются, и, когда рабочий засыпает, иметь возможность разбудить другого рабочего, чтобы поддерживать адекватный параллелизм. Этот патч вводит
PF_WQ_WORKER
идентификацию рабочих очередей работ и добавляет следующие два хука.
wq_worker_waking_up()
: вызывается, когда работник просыпается.
wq_worker_sleeping()
: вызывается, когда работник переходит в спящий режим и может вернуть указатель на локальную задачу, которую следует разбудить. Возвращенная задача пробуждается с помощью ,try_to_wake_up_local()
которая упрощенаttwu
и вызывается под ,rq lock
и может разбудить только локальные задачи.Оба хука в настоящее время определены как
noop
вkernel/workqueue_sched.h
. Более поздняяcmwq
реализация заменит их правильной реализацией.Эти хуки жестко запрограммированы, поэтому они всегда будут включены.
решение2
ThePF_VCPU
флаг установлен вguest_enter
который называетсяkvm_guest_enter
который называется вkvm_arch_vcpu_ioctl_run
. Насколько я понимаю, это аннотация к процессу, который запущен внутри виртуальной машины KVM; что касается планировщика хоста, процесс активен под видом своей виртуальной машины. Это быловведендля правильного отслеживания времени, затраченного на процесс, запущенный внутри виртуальной машины, по сравнению со временем, затраченным самой виртуальной машиной.