누군가가 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 스레드와 동일한 주소 공간에 액세스 할 수 있어야합니다.
어떻게 끝나나요? 누군가 더 자세히 설명 할 수 있습니까?
JVM은 일반적인 프로세스입니다. 그것 (및 스레드)은 생성 및 스케줄링을 포함하여 OS/커널에 의해 관리됩니다. 다른 모든 프로세스 및 스레드와 동일합니다. 당신이 굵은 글씨로 쓴 부분은 특별한 것도 아닙니다. 이것은 모든 일반적인 스레드가 작동하는 방식입니다. – Mat
그리고 우리는 JVM에서 특정 스레드에 대해 CPU와 코어가 사용되어야하는지 아니면 OS 제어하에 있는지를 조작 할 수 있습니까? – user3342955
이것은 플랫폼에 따라 다릅니다. 네이티브 코드를 작성하는 것이 낫다면 리눅스 수동 스케줄링은'sched_setaffinity' 시스템 콜에 의해 수행됩니다. 내 지식에 표준 라이브러리에 자바 래퍼가 없습니다. 또한 수정 된 유사성을 가진 전체 JVM을 실행하기위한'taskset' 명령을보십시오. – gudok