2016-07-19 7 views
-1

uniprocessor (UP) systemにはCPUコアが1つしかないため、一度に実行できるスレッドは1つだけです。この実行スレッドは同期的です(キュー内の命令のリストを取得し、それを1つずつ実行します)。コードを書くと、CPU命令のセットにコンパイルされます。シンクロナスなシングルコアCPU上でasyncronusのコードはどのようになりますか?

UPマシンのソフトウェアで非同期動作を実行するにはどうすればよいですか?すべてがOSによって選択された固定順序で実行されているわけではありませんか?

CPUでも、out-of-order execution CPUは、プログラム命令で実行中の命令の錯覚を与えます。

+0

スレッド、その他のプロセス、blah blah blah。シンプルなプログラムが連続して実行されているからといって、すべてのプログラムが同じように動作するわけではありません。 –

+1

OSは[CPUを中断する](https://en.wikipedia.org/wiki/Interrupt)(「命令アドレス」などのCPU状態を保存する)、「同期」ビットの変更* *ビットコードの実行。これは、プログラムの非常に多くの小さな「同期」部分を交互に実行することで、同時実行の全体的な効果をもたらします。これは、OSによって利用され、並行スレッドおよび/またはIO処理に必要なものを含むプロセスを提供します。これらのプロセスは、ランタイムが非同期動作を提供するために利用されます。 (もちろん、いくつかのプロセッサは実際には*独立したCPUのパッケージです。) – user2864740

+0

@ user2864740 OSはCPU上でも動作しています。私たちは、単一のスレッドCPUを持っていると仮定すると、実際の非同期コードを持つことはできません。 – Arashsoft

答えて

4

割り込みハンドラは、コードの残りの部分と非同期的に実行されるコードで、CPU外部のデバイスからの割り込みに応答して発生する可能性があります。ユーザ空間では、シグナルハンドラは同等のセマンティクスを持ちます。

到着したネットワークパケットからの割り込みやディスクI/Oが完了するなどのイベントは、CPUが割り込み前に行っていたことに関して非同期的に発生します。

非同期は、の同時実行を意味するものではなく、コードの残りの2つのマシン命令の間で実行できます。ユーザ空間プログラムのシグナルハンドラは、任意の2つのマシン命令の間で実行できるため、メインプログラム内のコードは、このようなことが発生した場合でも途切れることなく動作する必要があります。

シグナル・ハンドラを持つプログラムは、現在のスタック・ポインタの下のスタック上のデータ(つまり、スタックの予約されていない部分)に関するデータを仮定することはできません。 x86-64 SysV ABIのは、シグナルハンドラに制御を移すときにカーネルがそれを尊重することができるため、このルールに対するユーザー空間の変更のみです。カーネル自体は赤いゾーンbecause hardware interrupts write to the stack outside of software control, before running the interrupt handlerを使用できません。 I/Oの完了を(POSIX非同期I/Oを持つIE)POSIX信号の送達をもたらすことができるOSで


、信号のタイミングを容易にハードウェア割り込みのタイミングによって決定することができますユーザ空間コードは、コンピュータの外部のものによって決定されたタイミングと非同期に実行されます。カーネルの問題だけではありません。


マルチコアシステムでは、明らかに、さまざまな順序でより多くの事柄が発生する可能性があります。

+0

あなたの答えは、I/O割り込みのようなハードウェアからCPUへの割り込みに関するものです。私は他のハードウェアがCPUに非同期で仕事をしているので、問題はありません。私の質問は、CPUで実行するコードの2つの平和についてです。 – Arashsoft

+0

@Arashsoft:割り込みハンドラは、残りのコードと非同期に実行されるコードです。ユーザ空間では、シグナルハンドラは同等のセマンティクスを持ちます。非同期とは同時ではなく、残りのコードの2つのマシン命令の間で実行できることを意味します。 –

0

多くのプロセッサはマルチスレッド化が可能であり、多くのオペレーティングシステムでマルチスレッド化をシミュレートできます(これは、システム内の他のコアまたはデバイスによって観測されるmemory reorderingとは異なります)。シングルスレッド・プロセッサでは、プロセッサの内外でタスクをスワップします。

+0

OSが同じCPU上で実行されていることを考慮すると、異なるタスクからCPUを与えてマルチスレッドをシミュレートしても、実際の非同期実行ではありません(タスクは同時に実行されません)。 – Arashsoft

+0

おそらく、ほとんどの場合、非同期の「十分」です。真の非同期処理が必要な場合は、Beowulfクラスターなどを設定することができます。 –

+1

@Arashsoft asynchronyでは、タスクを同時に実行する必要はありません。 –

関連する問題