2013-06-06 1 views
0

여러 CPU에서 스레드 을 사용하여 병렬 처리되는 단일 계산 처리 프로세스 X가 있습니다. 각 스레드는 스트림 출력을 생성하고 각 스트림 은 두 번째 프로세스 Y의 자체 인스턴스에 개별적으로 연결되어야합니다 (여기에는 스레드가 있기 때문에 만큼 많은 프로세스 Y가 실행됩니다). X와 Y는 각각 처리량이 상당히 좋도록 이진 형식을 쓰고 읽습니다. I/O 오버 헤드를 최소화하고이를 수행하는 가장 좋은 방법을 찾고 있습니다. 내 설정은 다음과 같습니다 순간 은 (단지 두 개의 스레드로 설명하지만, 일반적으로 나는 더 이상 팔을 것이다) : "리디렉션이 파일을 사용하여 9보다 큰 디스크립터 :스레드 별 스트림을 개별 프로세스에 연결하는 가장 좋은 방법

exec 4> >(programY > out.4) 
exec 5> >(programY > out.5) 

programX-that-writes-to-fd-4-and-5 

exec 4>&- 
exec 5>&- 

하나의 문제는 bash는 수동 상태가 있다는 것입니다 쉘이 내부적으로 사용하는 파일 기술자와 충돌 할 수 있기 때문에 조심해서 사용해야합니다. " 이것은 명확하지 않습니다. 또 다른 문제는 해지를 설정하는 좋은 방법을 찾지 못했다는 것입니다. 현재 "lsof -c programY"를 사용하지만 해킹처럼 느껴집니다. 더 나은 또는 개선 된 솔루션이 있습니까? 여기서 '주어진'은 X가 멀티 스레드이며 계산 집약적이며 Y는 단일 스레드이며 계산 집약적이며 X의 각 스레드는 Y의 인스턴스에 연결되어야한다는 것입니다.

답변

1

alt-X -n 100 -f "Y > out.%d" 

및 파일 설명 다루는두고 : 디자인 프로그램 X은 그것을 실행하고 그것을 그 프로세스를 만드는 방법에 대한 템플릿 (효과적으로 printf() 형식 문자열)을 제공하기 위해 얼마나 많은 자식 프로세스에게 할 수 있도록

그러나 실패하면 다음과 같은 쉘 스크립트를 사용할 수 있습니다.

for ((i = 4; i < 104; i++)) 
do eval "exec $i> >(programY > out.$i)" 
done 

programX -d 4 -n 100 & # Tell programX to write on file descriptors 4 to 103. 

# Optionally 
for ((i = 4; i < 104; i++)) 
do eval "exec $i>&-" 
done 

wait 

wait 명령은 모든 하위 프로세스가 종료 될 때까지 대기 한 다음 계속 진행합니다. AFAICT는 '프로세스 대체'과정 중 하나를 기다리는 것을 포함하지 않습니다.

'동일'코드를 100 번 쓰지 않으려면 eval 작업이 필요합니다. for ((...)) 루프는 C for 루프에 해당하는 bash입니다.

+0

감사합니다. 후자는 제가 지금하는 일입니다. 파일 설명자에 대한 bash 경고에 대해 걱정합니다. 이는 두 시나리오에서 모두 적용됩니다. 그리고 이것이 이것이 일반적으로 문제에 대한 제멋대로 접근하고 있는지 궁금합니다. – micans

+1

프로세스를 시작하는 프로그램은 bash의 내부 파일 설명자 사용을 파기 할 수 없습니다. 그러한 파일 디스크립터는 'exec on close'로 표시되므로 bash의 하위 프로세스에 상속되지 않습니다. (필자는 열려 있거나 닫힌 파일 디스크립터 (64 줄의 4 줄)마다'o' 또는'-'를 출력하는 간단한 프로그램 인'fd'를 가지고 있으며,'bash'가 열린 파일 디스크립터를 발견하지 못합니다. 대답의 코드를 검증하는 데 사용했다.) bX의 내부 설명자를 사용하더라도 프로그램 X가 완료된 후 곧바로 덮개 스크립트가 종료되면 문제가 발생하지 않는다고 생각합니다. –

관련 문제