1
votes

Can somebody help me to understand how JVM spread threads between available CPU cores? Here som my vision how it is work but pls correct me.

So from the begining: when computer is started then bootstrap thread (usually thread 0 in core 0 in processor 0) starts up fetching code from address 0xfffffff0. All the rest CPUs/cores are in special sleep state called Wait-for-SIPI(WFS).

Then after OS is loaded it starts managing processes and schedule them between CPU/cores sending a special inter-processor-interrupt (IPI) over the Advanced Programmable Interrupt Controller (APIC) called a SIPI (Startup IPI) to each thread that is in WFS. The SIPI contains the address from which that thread should start fetching code.

So for example OS started JVM by loading JVM code in memory and pointing one of the CPU cores to its address (using mechanism described above). After that JVM that is executed as separate OS process with its own virtual memory area can start several threads.

So question is: how?

Does JVM use the same mechanism as OS and during time slice that OS gave to JVM can send SIPI to other cores and point the to address of the tasks that should be executed in a separate thread? If yes then how is restored the original program that could be executed by OS on this core?

Assume that it is not correct vision as suppose that this tasks of involving other CPUs/cores should be managed via OS. Overwise we could interrupt execution of some OS processes running in parallel on other cores. So if JVM wants to start new thread on other CPU/core it makes some OS call and send address of the task to be executed to the OS. OS schedule execution as for other programs but with different that this execution should happen in the same process to be able to access the same address space as the rest JVM threads.

How is it done? Can somebody describe it in more details?

1
The JVM is an ordinary process. It (and its threads) are managed by the OS / kernel, including creation and scheduling. Just like all other processes and threads. The part you put in bold is nothing special either - that's how all usual threads work.Mat
and can we manipulate from JVM which CPU and core should be used for certain thread or it is fully under OS control?user3342955
This is platform specific. If you are fine with writing native code, then in Linux manual scheduling is done by sched_setaffinity system call. There is no java wrapper in standard library to my knowledge. Also have a look at taskset command to run entire JVM with modified affinity.gudok

1 Answers

5
votes

The OS manages and schedule threads by default. The JVM makes the right calls to the OS to make this happen, but doesn't get involved.

Does JVM use the same mechanism as OS

The JVM uses the OS, it has no idea what actually happens.

Each process has its own virtual address space, again managed by the OS.


I have a library which uses JNA to wrap setaffinity on Linux and Windows. You need to do this as thread scheduling is controlled by the OS not the JVM.

https://github.com/OpenHFT/Java-Thread-Affinity

Note: in most cases, using affinity either a) doesn't help or b) doesn't help as much as you might think.

We use it to reduce jitter of around 40 - 100 microseconds which doesn't happen often, but often enough to impact our performance profile. If you want your 99%ile latencies to be as low as possible, in the micro-second range, thread affinity is essential. If you are ok with 1 in 100 requests taking 1 ms longer, I wouldn't bother.