各インスタンスが完全に独立したプロセスであり、他のプロセスと通信しない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