Linuxで同じC ++プログラムの複数のインスタンスを実行する簡単な方法はありますか?

Linuxで同じC ++プログラムの複数のインスタンスを実行する簡単な方法はありますか?

各インスタンスが完全に独立したプロセスであり、他のプロセスと通信しないLinuxシステムで並行して実行したいC ++プログラムがあります。以下を行う簡単な方法はありますか?

  1. 現在のマシンのCPUコア数を計算します。
  2. CPUコア数の場合は、プログラムインスタンスを実行し、各インスタンスをコアに割り当てます。
  3. インスタンスがまだ実行中であることを定期的に確認し、必要に応じてインスタンスを再起動します。

答え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

関連情報