This post은 make
이 올바른 순서로 대상을 작성하는 방법을 설명합니다. 병렬에 대해 더 자세히 이해하고 싶습니다. 게시물에서 :"-j"옵션으로 만들기 : 의존성 그래프에서 앞으로 나아갈 때 어떻게 알 수 있습니까?
정상적인 비 병렬 작업에서 make는 각 반복을 대상으로 하나를 선택하여 빌드합니다. 병렬 일 때 최대 동시 작업 수인 까지 가능한 한 많은 종속성이없는 대상을 으로 잡고 병렬로 빌드합니다.
나는 사진 무엇 :
- 없이 누락 된 종속성이있는 모든 대상을 찾습니다.
- 모든 대상을 빌드하십시오.
- 모든 병렬 작업자가 완료 (동기화) 할 때까지 기다리십시오.
- (1) 단계로 돌아갑니다.
그러나 이것은 잘못된 것입니다. make -j
은 단계 (3)없이 그래프에서 앞으로 이동해야하는시기를 어떻게 든 알고 있습니다. 새 대상은 모든 종속성이 완료되고 병렬 작업자가 사용 가능할 때만 시작됩니다. 방법?
A -> C
B -> D
, make -j2
이 중 하나C
또는 D
이 시작되기 전에 완료 모두A
및 B
기다릴 것 :
예를 들어, 그래프를 고려한다. 그러나 A
이 완료되었지만 B
이 아직 진행 중이면이 메시지는 C
으로 이동할 수 있음을 알 것입니다.
따라서 비동기를 처리하는 뮤텍스 보호 데이터 구조 (그리고 마지막으로 가져올 수있는 토큰을 생성 함)는 전적으로 작업 서버 내부에만 국한되어 있습니다. – Vroomfondel
음, make는 다중 스레드가 아니므로 토큰에 대한 뮤텍스 나 보호 된 데이터 구조가 실제로 없습니다. 만들기는 파이프에서 단일 바이트 읽기의 원 자성에만 의존하여 작업 서버를 작동시킵니다. http://make.mad-scientist.net/papers/jobserver-implementation/에는 새로운 버전의 GNU make (현재 pselect() 사용)에서 잘못된 부분이 있지만 설명이 포함되어 있습니다. – MadScientist