コア(またはCPU)は、コードを実行するコンピューターの物理要素です。通常、各コアには、計算、レジスタファイル、割り込みラインなどを実行するために必要なすべての要素があります。
ほとんどのオペレーティングシステムは、アプリケーションをプロセスとして表します。これは、アプリケーションが独自のアドレス空間(==メモリのビュー)を持っていることを意味します。OSは、このビューとそのコンテンツが他のアプリケーションから分離されていることを確認します。
プロセスは1つ以上のスレッドで構成され、CPU上でマシンコードを実行することによってアプリケーションの実際の作業を実行します。オペレーティングシステムは、どのスレッドがどのCPUで実行されるかを決定します(負荷分散、エネルギー消費などを改善するための巧妙なヒューリスティックを使用することにより)。アプリケーションが単一のスレッドのみで構成されている場合、マルチCPUシステム全体は、アプリケーションに1つのCPUしか使用しないため、あまり役に立ちません。(ただし、OSが他のCPUで他のアプリケーションを実行するため、最初のアプリケーションと混ざらないため、全体的なパフォーマンスは向上する可能性があります)。
今あなたの特定の質問に:
1)OSでは通常、特定のスレッドを実行するコアについて少なくともヒントを与えることができます。OpenMPが行うことは、一定量のスレッドを生成するコードを生成して、プログラムのループから共有計算作業を複数のスレッドに分散することです。OSのヒントメカニズム(スレッドアフィニティを参照)を使用してこれを行うことができます。ただし、OpenMPアプリケーションは引き続き他のアプリケーションと同時に実行されるため、OSはスレッドの1つを自由に中断し、CPUで他の(潜在的に無関係な)作業をスケジュールできます。実際には、状況に応じて適用できるさまざまなスケジューリングスキームがありますが、これは非常に具体的であり、ほとんどの場合、OSが正しいことを実行していることを信頼できるはずです。
2)マルチコアCPUでシングルスレッドアプリケーションを実行している場合でも、他のCPUも同様に機能していることに気付きます。これは、a)その間にOSがその仕事をしていること、およびb)アプリケーションが単独で実行されることはないという事実から生じます。実行中の各システムは、同時に実行される一連のタスクで構成されます。Windowsのタスクマネージャー(またはLinuxの場合はps / top)をチェックして、何が実行されているかを確認します。