2009-10-21 4 views
0

나는 수천 개의 프로세스 (컴파일, 링크 등)를 시작하는 빌드 도구에서 작업하고 있습니다. 또한 원격 컴퓨터에 실행 파일을 배포하여 100 대의 슬레이브 시스템에서 빌드를 실행할 수 있습니다. DLL 삽입을 구현하여 빌드 프로세스의 하위 프로세스를 모니터링하므로 예상 한 리소스를 열거 나 닫을 수 있습니다. 그렇게하면 내 사용자가 종속성 정보를 올바르게 지정하지 못했음을 알 수 있습니다.DLL 주입/IPC 질문

내 질문은 :

나는 작업 DLL 주입을 가지고 있지만 모든 윈도우 프로그래밍에 익숙한 아니에요. 자녀가 생성하는 수백만 개의 파일 보고서를 통해 부모 빌드 프로세스에 콜백을하는 가장 좋은 방법은 무엇입니까? 비 블로킹 소켓에 쓰는 것에 대해 생각해 봤지만 파이프/공유 메모리 또는 COM이 더 좋을지 궁금해하고 있습니까?

+0

incredibuild와 같은 상용 도구를 사용해 보셨습니까? 당신이 설명하는 솔루션의 복잡성을 고려할 때, 확실히 더 저렴하고 빠를 것입니다. – geva30

답변

1

첫 번째로, 한 대의 컴퓨터가 아닌 다른 컴퓨터 간의 통신을 처리하고 있기 때문에 공유 메모리를 즉시 제외 할 수 있습니다.

나는 얼마나 빨리 데이터를 보낼 수 있는지에 대해 많이 걱정하지 않고 데이터의 양을 최소화하려고 노력한다고 생각합니다. 수백만 개의 파일 I/O 보고서를 보내지 않고 그 데이터 (또는 그 순서대로)의 몇 킬로 바이트를 함께 배치하고 해당 패킷의 해시를 보냅니다. 패킷 크기를주의 깊게 선택하면 데이터 전송을 줄여서 가장 빠른 방법을 선택하는 대신 가장 편리한 방법을 간단하게 사용할 수 있습니다.

+0

당신이 여기에 있다고 생각합니다. 각 자식 프로세스에서, 나는 단지 실제로 읽혀 지거나 쓰여지는 모든 파일의 목록을 되돌리고 싶습니다. 어쩌면 Windows 메시지를 통해 전송 된 목록이 해결책 일 수 있습니다. – Benj

+0

어쩌면 - 다시 목록 정렬 및 해시 (해시 만 전송)하면 훨씬 더 많은 데이터를 줄일 수 있습니다. –

1

Windows 환경 (컴퓨터가 Linux가 아니거나 무엇이든간에)에서 이름이 지정된 파이프를 사용하는 것이 빠른 선택이며 컴퓨터 경계를 넘어 액세스 할 수 있기 때문에 좋은 선택입니다. 공유 메모리는 경주에서 벗어난 것 같습니다. 왜냐하면 컴퓨터 경계를 넘을 수 없기 때문입니다. 분산 com은 IDL에서 계약을 공식화 할 수 있지만 파이프를 통한 XML 메시지도 괜찮다고 생각합니다. xml 메시지는 채널과 완전히 독립적으로 작동하는 이점이 있습니다. 나중에 리눅스가 필요하다면 tcp/ip transport로 전환하고 xml 메시지를 보낼 수 있습니다. 제한 사항

일부 추가 기술 :

또 다른 잊어하지만 뜨거운 후보는 RPC (원격 프로 시저 호출)입니다. 윈도우 서비스가 많이 의존하고 있습니다. 하지만 난 당신이 동일한 시스템에 당신은 어떤 상태 정보를 전송해야하는 경우 RegisterWindowMessage (를 통해 윈도우 메시지를 regisier 수

RPC에게 프로그램) 및

+0

프로그래밍 RPC는 그리 어렵지 않습니다. 단지 끔찍하게 * 문서화가되지 않았습니다. 거기에 몇 가지 타사 책 만 있었는데 모두 절판되었습니다. MSDN에는 간과 할 수없는 몇 가지 기사 만 있습니다. –

+0

음, 내 시스템이 분산되어 있지만,이 특정 비트는 배포되지 않습니다. 각 컴퓨터에서 실행되는 슬레이브는 모든 파일 이벤트를 대조하여 "작업"으로 읽고 쓰는 파일 목록을 네트워크를 통해 다시 전송합니다. Windows 메시징이 승자가 될 수 있습니다.나는 많은 메시지를 파싱하는 것이 지저분해질 수 있기 때문에 XML을 좋아하지 않는다. 원근감을 내기 위해 대형 프로젝트의 한 링크는 500k 개의 입/출력 메시지를 생성 할 수 있습니다. – Benj

0
) 메시지 sendMessage 첨부를 (경쟁 보내 하드 생각

이외에도 thomas의 모든 제안과는 달리 공통 데이터베이스를 사용하여 결과를 저장할 수도 있습니다. 너무 느리다면 더 현대적이고 빠른 키/값 데이터베이스 (예 : tokyo cabinet/memcachedb/etc) 중 하나를 사용하십시오.

+0

흠, 나는 단지이 메시지를 매우 간절히 고수하기를 원합니다. 아마도 db 솔루션이 약간 과잉이라고 생각합니다. – Benj

0

이것은 빌드에서 사용되는 파일을 확인하는 작업에 과도한 부담이됩니다. 그냥 빌드 파일을 스캔 하는게 어떨까요? 또는 빌드 도구에서 출력을 캡처합니까?

+0

흠, 실제로는 분명히 빌드 도구이므로 이미 빌드 파일을 검사합니다. 내 도구는 컴파일러 등의 출력을 검사 할 수있는 기능을 제공하지만 모든 도구가 이러한 유용한 출력을 제공하는 것은 아니며 일반적인 솔루션을 원합니다. – Benj