24.3.1.1. QEMU user mode multithreading
User mode simulation QEMU v4.0.0 always shows the number of cores of the host, presumably because the thread switching uses host threads directly which would make that harder to implement.
It does not seem possible to make the guest see a different number of cores than what the host has. Full system does have the -smp
options, which controls this.
E.g., all of of the following output the same as nproc
on the host:
nproc ./run --cpus 1 --userland userland/cpp/thread_hardware_concurrency.cpp ./run --cpus 2 --userland userland/cpp/thread_hardware_concurrency.cpp
This random page suggests that QEMU splits one host thread thread per guest thread, and thus presumably delegates context switching to the host kernel: https://qemu.weilnetz.de/w64/2012/2012-12-04/qemu-tech.html#User-emulation-specific-details
We can confirm that with:
./run --userland userland/posix/pthread_count.c --cli-args 4 ps Haux | grep qemu | wc
Remember QEMU user mode does not show stdout immediately though.
At 369a47fc6e5c2f4a7f911c1c058b6088f8824463 + 1 QEMU appears to spawn 3 host threads plus one for every new guest thread created. Remember that userland/posix/pthread_count.c spawns N + 1 total threads if you count the main
thread.