10

저는 구현중인 스레드 풀에 대한 다른 스케줄링 알고리즘을 조사했습니다. 해결할 문제의 본질 때문에 병렬로 실행되는 작업은 독립적이며 새로운 작업을 생성하지 않는다고 가정 할 수 있습니다. 작업은 다양한 크기 일 수 있습니다.Work Stealing은 항상 가장 적절한 사용자 수준의 스레드 스케줄링 알고리즘입니까?

로컬 작업 대기열에 대해 잠금없는 데크를 사용하여 가장 인기있는 스케줄링 알고리즘 인 "work stealing"을 즉시 사용했습니다.이 접근법에 비교적 만족합니다. 그러나 나는 work-stealing이 최선의 방법이 아닌 일반적인 경우가 있는지 궁금해하고 있습니다.

이 특정 문제에 대해서는 각 개별 작업의 크기를 잘 예측했습니다. Work-stealing은이 정보를 사용하지 않으며이 정보로 작업을 도용하는 것보다로드 밸런싱을 향상시키는 스케줄러가 있는지 궁금합니다.

NB. 이 질문은 이전의 question과 관련이 있습니다.

+0

이 하위 주제에 대해서는 거의 알지 못하지만이 관련 질문에 대한 답변 중 일부는 도움이 될 것입니다. http://stackoverflow.com/questions/2552810/work-stealing-vs-work-shrugging –

답변

2

나는 작업을 선전 할 것이다. 예상 실행 시간에 대한 정보를 사용하여 각 스레드에 대해 개별 대기열에 분배 할 수 있습니다.

작업 배포는 기본적으로 knapsack problem이며 각 큐의 시간은 동일해야합니다.

큐를 실행하는 동안 큐를 수정하려면 논리를 추가해야합니다. 예를 들어, 예상 가동 시간이 실제 가동 시간과 일정량 차이가 난 후에 재분배가 이루어져야합니다.

+0

다른 합병증, 적용 할 수도 있고 적용하지 않을 수도있는 기본 병렬 실행 프레임 워크의 일부에 대한 가용성 변경을 처리하는 방법입니다. 작은 전용 호스트 (또는 클러스터)에서 실행 중일 때 큰 문제는 아니지만 큰 클러스터는 노드에 의존 할 수 없습니다. 가장 쉬운 해결 방법은 스케줄러가 변경된 경우 스케줄러를 다시 실행하고 실패한 노드에서 실행을 시작한 작업 부하의 일정을 다시 잡는 것입니다. 그것을 잃는 것보다 두 번 일하는 것이 낫습니다. –

+0

@Donal :이 경우 (단일 프로세스의 스레드)에도 불구하고 노드 가용성에 대해 좋은 점은 많이 생각하지 않아도됩니다. @Georg : 이것은 내가 생각했던 것입니다. 잠금 및 CAS 호출과 관련하여 작업을 미리 배포하는 것이 더 저렴해야합니다. 실제 부하 균형의 품질에 대해 걱정하고 있습니다. –

+0

걱정하지 않으셔도 좋습니다. :-) 정보를 바탕으로 말할 수는 없으므로 설명 해 주셔서 감사합니다.(나는 자신의 박사 학위를 위해 더 일반적인 문제를 해결해 준 사람들을 알고 있으며, 정말 힘들다. 특히 믹싱에서 우선 순위와 고정 예약이있는 경우.) –

1

작업 도용 스케줄러는 해당 정보를 사용하지 않지만 이론적 인 한계를 제공하는 데 의존하지 않기 때문에 가능합니다 (예 : 사용하는 메모리, 작업자 간의 예상되는 전체 통신 또한 예상 시간은 여기에 읽을 수있는 완전 엄격한 계산을 실행합니다 : http://supertech.csail.mit.edu/papers/steal.pdf를)

한 가지 흥미로운 종이 (난 당신이 액세스 할 수있는 희망 : http://dl.acm.org/citation.cfm?id=2442538를) 실제로 (즉 되려고 노력 공식적인 증거를 제공하는 제한된 실행 시간을 사용 가능한 한 원래의 도둑질 경계에 가깝게).

그렇습니다. 예를 들어 불균형 트리 검색 및 기타 특정 사례와 같이 작업 도용이 최적으로 수행되지 않는 경우가 있습니다. 그러나 이러한 경우 최적화가 수행되었습니다 (예 : 하나의 작업 (예 : http://dl.acm.org/citation.cfm?id=571876) 대신 피해자의 양말의 절반을 도용하여 허용).