각 인스턴스가 완전히 독립적인 프로세스이고 다른 프로세스와 통신하지 않는 Linux 시스템에서 병렬로 실행하고 싶은 C++ 프로그램이 있습니다. 다음을 수행하는 쉬운 방법이 있습니까?
- 현재 머신의 CPU 코어 수를 계산합니다.
- CPU 코어 수의 경우 프로그램 인스턴스를 실행하고 각 인스턴스를 코어에 할당합니다.
- 인스턴스가 여전히 실행 중인지 주기적으로 확인하고 필요한 경우 인스턴스를 다시 시작하십시오.
답변1
현재 머신의 CPU 코어 수를 계산합니다.
많이있다특수 파일 및 명령이 정보를 제공하면 몇 가지 방법이 있습니다.프로그래밍 방식으로. 마지막 링크는 CPU 선호도 설정을 고려하므로 아마도 최선의 선택일 것입니다.
CPU 코어 수의 경우 프로그램 인스턴스를 실행하고 각 인스턴스를 코어에 할당합니다.
이건 사이클 같은데fork
그리고exec
.
인스턴스가 여전히 실행 중인지 주기적으로 확인하고 필요한 경우 인스턴스를 다시 시작하십시오.
당신은 그것을 사용할 수 있습니다wait
하위 프로세스가 종료되었는지 확인하기 위한 시스템 호출, 종료된 경우 새 인스턴스를 시작합니다.
위의 솔루션을 사용하면 몇 가지 추가 C/C++ 코드를 작성하여 요구 사항을 충족할 수 있습니다. 쉘 스크립트에도 동일한 원칙을 적용할 수 있습니다. 다음 스크립트는 sleep
코어당 한 번씩 매우 흥미로운 명령을 실행합니다. 실행 중인 명령 수를 sleep
일정하게 유지하려면 명령이 종료될 때 새 명령을 시작해야 합니다.
#!/bin/bash
numprocs=$(nproc)
echo "There are $numprocs cores available"
while true; do
sleep $(( RANDOM % 10 )) &
(( running++ ))
echo "running=$running"
if (( running >= $numprocs )); then
wait -n -p pid
(( running-- ))
echo "$pid stopped"
fi
done
sleep
비슷한 작업을 수행하여 명령을 실행하려는 명령으로 바꿀 수 있습니다 .
답변2
yes 3 | parallel sleep
sleep 3
이는 동일한 수의 프로세서에 대해 무기한 실행됩니다.
또는 다른 답변의 정신으로 더 간단합니다.
for ((i=$(nproc);i>0;i--)) ; do
while true ; do
sleep $(( 1+RANDOM%10 ))
done &
done