2016-12-30 4 views
1

누군가가 JVM이 사용 가능한 CPU 코어간에 스레드를 분산시키는 방법을 이해할 수 있습니까? 여기에 som 내 비전은 어떻게 작동하지만 pls 날 수정.JVM은 CPU 코어간에 스레드를 어떻게 전파합니까?

처음부터 : 컴퓨터가 시작되면 부트 스트랩 스레드 (보통 프로세서 0의 코어 0에있는 스레드 0)가 주소 0xfffffff0에서 코드를 가져 오기 시작합니다. 나머지 모든 CPU/코어는 WIP (Wait-for-SIPI)라는 특수 절전 상태에 있습니다.

OS를로드 한 후 프로세스 관리를 시작하고 각 스레드에 SIPI (Startup IPI)라고하는 APIC (Advanced Programmable Interrupt Controller)을 통해 특수 프로세서 간 인터럽트 (IPI)를 보내는 CPU/그것은 WFS에 있습니다. SIPI에는 해당 스레드가 코드 페치를 시작해야하는 주소가 포함됩니다.

예를 들어 OS에서 JVM 코드를 메모리에로드하고 CPU 코어 중 하나를 해당 주소로 지정하여 (위에서 설명한 메커니즘 사용) JVM을 시작했습니다. 그 후 자체 가상 메모리 영역을 가진 별도의 OS 프로세스로 실행되는 JVM은 여러 스레드를 시작할 수 있습니다.

그래서 질문은 : 어떻게?

JVM은 OS와 동일한 메커니즘을 사용하고 OS가 JVM에 준 타임 슬라이스를 사용하여 SIPI를 다른 코어에 보내고 별도의 스레드에서 실행해야하는 작업의 주소를 가리킬 수 있습니까? 그렇다면 어떻게이 핵심 OS에서 실행될 수있는 원래 프로그램을 복원 할 수 있습니까?

다른 CPU/코어를 포함하는 작업이 OS를 통해 관리되어야한다고 가정 할 때 비전이 올바르지 않다고 가정합니다. 전체적으로 다른 코어에서 병렬로 실행되는 일부 OS 프로세스의 실행을 중단시킬 수 있습니다. 따라서 JVM이 다른 CPU/코어에서 새로운 쓰레드를 시작하기를 원한다면 OS 호출을하고 실행될 작업의 주소를 OS로 보낸다. OS 스케줄 실행이 다른 프로그램과 다르지만이 실행이 인 경우 동일한 프로세스에서 발생하여이 나머지 JVM 스레드와 동일한 주소 공간에 액세스 할 수 있어야합니다.

어떻게 끝나나요? 누군가 더 자세히 설명 할 수 있습니까?

+1

JVM은 일반적인 프로세스입니다. 그것 (및 스레드)은 생성 및 스케줄링을 포함하여 OS/커널에 의해 관리됩니다. 다른 모든 프로세스 및 스레드와 동일합니다. 당신이 굵은 글씨로 쓴 부분은 특별한 것도 아닙니다. 이것은 모든 일반적인 스레드가 작동하는 방식입니다. – Mat

+0

그리고 우리는 JVM에서 특정 스레드에 대해 CPU와 코어가 사용되어야하는지 아니면 OS 제어하에 있는지를 조작 할 수 있습니까? – user3342955

+1

이것은 플랫폼에 따라 다릅니다. 네이티브 코드를 작성하는 것이 낫다면 리눅스 수동 스케줄링은'sched_setaffinity' 시스템 콜에 의해 수행됩니다. 내 지식에 표준 라이브러리에 자바 래퍼가 없습니다. 또한 수정 된 유사성을 가진 전체 JVM을 실행하기위한'taskset' 명령을보십시오. – gudok

답변

5

OS는 기본적으로 스레드를 관리하고 예약합니다. JVM은 OS가 제대로 작동하도록 올바른 호출을하지만 관련되지 않습니다.

합니까 JVM은

JVM은 실제로 무슨 일을 모르고있다, OS를 사용하는 OS와 같은 메커니즘을 사용합니다.

각 프로세스에는 OS에 의해 다시 관리되는 자체 가상 주소 공간이 있습니다.


Linux 및 Windows에서 JFA를 사용하여 setaffinity를 래핑하는 라이브러리가 있습니다. 스레드 스케줄링은 JVM이 아닌 OS에 의해 제어되므로이 작업을 수행해야합니다.

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

참고 : 대부분의 경우,가) 도움이되지 않습니다 또는 b) 당신이 생각하는 것만큼 도움이되지 않습니다 중 하나 친화력을 사용한다.

자주 발생하지는 않지만 약 40 - 100 마이크로 초의 지터를 줄이기 위해이 기능을 사용하지만 성능 프로파일에 영향을주기에 충분합니다. 99 % 지연 시간을 가능한 한 짧게하려면 마이크로 초 범위에서 스레드 유사성이 필수적입니다.100 밀리 초의 요청으로 1 밀리 초가 걸리더라도 괜찮다면 걱정할 필요가 없습니다.