최신 컴퓨터에는 여러 개의 처리 코어가 있습니다. 각 코어가 계속 사용 중일 수 있도록 충분한 처리가 있다고 가정합니다. 그들은 계산 작업 항목의 대기열에 할당됩니다. 또는 스케줄러가 완료할 스레드.
이러한 스레드를 실행하는 동안 새 스레드 또는 작업 항목을 생성할 수 있습니다. 동시에 처리할 수 있는 별도의 스레드입니다. 결과를 산란 프로그램에 피드백하거나 무기한 완전히 분리된 상태로 유지해야 할 수도 있습니다. 일반적으로 이러한 자식 스레드는 부모와 동일한 처리 코어에 할당됩니다.
이 모든 것은 모든 코어가 계속 사용 중이라고 가정합니다. 이는 스레드가 종료되지 않거나 새 스레드가 기존 스레드 종료 속도와 같거나 더 빠른 속도로 생성되는 경우 발생합니다. 그러나 현실 세계에서 특히 최종 사용자 컴퓨팅 장치에서 장기간의 작업량은 그렇게 간단하지 않습니다. 결국 프로세싱 코어는 할당된 모든 작업을 완료할 것입니다. 이런 일이 발생하면 유휴 상태로 앉아 잠재적인 성능을 낭비하는 대신 다른 처리 코어의 작업 대기열을 확인하고 작업 항목을 훔칩니다.
장점과 단점
작업 도용은 유휴 처리 코어가 완료될 작업을 적극적으로 검색한다는 것을 의미합니다. 이렇게 하면 전체 프로세서의 잠재적으로 많은 부분이 유휴 상태로 유지되는 것을 방지할 수 있어 도움이 됩니다. 그러나 작업 훔치기에는 약간의 대가가 따를 수 있습니다. 예를 들어, 새로운 프로세싱 코어는 관련 데이터를 캐시 메모리에 로드해야 합니다.
특히 공유 캐시 계층이 제공하지 않고 시스템 RAM에서 요청해야 하는 경우 시간이 걸릴 수 있습니다. 원래 프로세서가 해당 시간 프레임에 해당 작업 항목을 재개하여 전체 실행 속도가 더 빨라졌을 가능성이 있습니다. 작업 항목을 도난당한 처리 코어가 처리를 시작하지 않은 경우에도 마찬가지입니다. 일부 캐시된 값은 상위 스레드와 하위 스레드 간에 동일할 수 있습니다.
구현
여러 프로그래밍 언어에는 전용 프로세서에서 직접 작업을 예약할 수 있는 런타임이 있습니다. 예를 들어, Cilk 프로그래밍 언어, Rust Tokio 런타임 및 .Net Task Parallel Library가 이를 수행할 수 있습니다. 또는 운영 체제가 실제 프로세서 시간을 스케줄링하는 역할을 할 수 있습니다. 프로그램을 사용하면 운영 체제에서 자체적으로 예약하는 "작업자 스레드" 풀에 작업을 추가하기만 하면 됩니다.
이것은 프로그램이 처리 코어에 대한 전용 직접 액세스 권한이 없지만 다른 프로세스와 액세스를 공유해야 하는 시스템에서 발생합니다. 스레드가 유휴 상태로 있을 때 반복적으로 도난당하지 않도록 이 시나리오에서 각별한 주의를 기울여야 합니다.
작업 항목을 도난당하도록 선택하는 방법에는 다양한 접근 방식이 있습니다. 원래 개념에서 접근 방식은 다른 임의의 코어를 선택하는 것이었습니다. 대기열에 하나 이상의 작업 항목이 있는 경우 마지막 항목을 가져옵니다. 자식 프로세스가 원래 프로세서에 의해 즉시 실행되는지 여부에 대한 기본 설정에 따라 다릅니다. 또는 프로세서의 큐로 푸시되고 상위 프로세스가 계속 실행되면 상위 또는 하위 스레드가 도난당합니다.
이는 모두 작업 훔치기(Work Stealing)로 요약할 수 있으며, 사용 가능한 프로세서 간에 단어 로드가 고르게 분산되도록 하는 로드 밸런싱 기술입니다. 그렇게 하면 모든 프로세서가 도움이 되는 일을 하고 있습니다.
결론
작업 도용은 멀티코어 CPU에서 자동으로 발생하는 프로세스입니다. 각 코어에는 수행할 작업 대기열이 있습니다. 프로세서가 작업을 완료하면 다른 처리 코어의 대기열에서 다른 작업을 훔칩니다. 이는 프로세서가 일부 코어를 유휴 상태로 두고 다른 코어는 여전히 수행할 작업 대기열을 갖는 것을 방지하는 데 도움이 됩니다.