문제

저는 수천 개의 프로세스 (컴파일, 링크 등)를 시작하는 빌드 도구에서 작업합니다. 또한 실행 파일을 원격 머신에 배포하여 빌드를 실행할 수 있도록 실행할 수 있습니다. 빌드 프로세스의 아동 프로세스를 모니터링하기 위해 DLL 주입을 구현하여 예상 한 자원을 열거 나 닫았다는 것을 알 수 있습니다. 이렇게하면 사용자가 종속성 정보를 올바르게 지정하지 않는지 알 수 있습니다.

내 질문은 다음과 같습니다.

DLL 주입이 작동하지만 Windows 프로그래밍에 익숙한 것은 아닙니다. 수백만 개의 파일 IO가 아이들이 생성 할 것이라고보고하면서 부모 빌드 프로세스로 콜백하는 가장/가장 빠른 방법은 무엇입니까? 블로킹되지 않은 소켓에 글을 쓰도록 생각했지만 파이프/공유 메모리 또는 COM이 더 좋을지 궁금합니다.

도움이 되었습니까?

해결책

첫째, 한 기계뿐만 아니라 기계 간의 통신을 다루고 있기 때문에 공유 메모리를 즉시 배제 할 것입니다.

나는 데이터를 얼마나 빨리 보낼 수 있는지에 대해 많은 걱정하는 대신 데이터의 양을 최소화하려고 노력하는 것에 대해 열심히 생각합니다. 수백만 개의 파일 I/O 보고서를 보내는 대신 해당 데이터의 몇 킬로바이트 (또는 해당 순서의 무언가)를 함께 배치하고 해당 패킷의 해시를 보냅니다. 패킷 크기를 신중하게 선택하면 데이터 전송을 가장 편리한 방법을 선택하는 대신 가장 편리한 방법을 사용할 수있는 지점으로 데이터 전송을 줄일 수 있어야합니다.

다른 팁

Windows World에 머무르는 경우 (기계가 Linux 또는 무엇이든) 이름이 지정된 파이프는 빠르고 기계 경계를 통해 액세스 할 수 있기 때문에 좋은 선택입니다. 공유 메모리는 기계 경계를 넘을 수 없기 때문에 레이스에서 벗어 났다고 생각합니다. 분산 COM은 IDL에서 계약을 공식화 할 수 있지만 파이프를 통한 XML 메시지도 괜찮다고 생각합니다. XML 메시지는 채널과 완전히 독립적으로 작동하는 이점이 있습니다. 나중에 Linux가 필요한 경우 TCP/IP 전송으로 전환하여 XML 메시지를 보낼 수 있습니다.

한계가있는 몇 가지 추가 기술 :

또 다른 잊혀지지 만 뜨거운 후보자는 RPC (원격 절차 호출)입니다. 많은 Windows 서비스가 이에 의존합니다. 그러나 나는 RPC를 프로그래밍하기가 어렵다고 생각합니다

동일한 컴퓨터에 있고 상태 정보 만 보내야하는 경우 registerWindowMessage ()를 통해 Windows 메시지를 Regisier 및 vie sendMessage ()를 보낼 수 있습니다.

Thomas의 모든 제안과는 별도로 공통 데이터베이스를 사용하여 결과를 저장할 수도 있습니다. 그리고 그것이 너무 느리면 더 현대적인 (그리고 빠른) 키/값 데이터베이스 (도쿄 캐비닛/memcachedb/등) 중 하나를 사용하십시오.

이것은 빌드에 사용 된 파일을 확인하는 작업에 대해 많은 과잉처럼 들립니다. 빌드 파일을 스캔하는 것은 어떻습니까? 아니면 빌드 도구에서 출력을 캡처 하시겠습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top