1

UNIX ライクな OS のシステム コールは再入可能です (つまり、複数のシステム コールを並行して実行できます)。C/C++11 の事前発生関係という意味で、これらのシステム コールの順序に関する制約はありますか?

たとえば、3 つのスレッド (疑似コード) を持つ次のプログラムを考えてみましょう。

// thread 1
store x 1
store y 2

// thread 2
store y 1
store x 2

// thread 3
Thread.join(1 and 2)
wait((load x) == 1 && (load y) == 1)

ここで、xyが共有の場所であり、すべてのloadstoreの順序が緩和されているとします。(注: アトミック アクセスが緩和されている場合、競合はバグとは見なされません。C/C++11 セマンティクスの意味では意図的store x 1なものです。) このプログラムは終了する可能性があります。(1) コンパイラがandを並べ替えてからstore y 2、(2) 実行する可能性があるためです。 store y 2store y 1store x 2、そしてstore x 1、(3) スレッド 3 はx = 1y = 1を同時に読み取ることができます。

次のプログラムも終了する可能性があるかどうかを知りたいです。ここでは、いくつかのシステム コールsyscall1()&syscall2()がそれぞれスレッド 1 と 2 に挿入されています。

// thread 1
store x 1
syscall1()
store y 2

// thread 2
store y 1
syscall2()
store x 2

// thread 3
Thread.join(1 and 2)
wait((load x) == 1 && (load y) == 1)

プログラムを終了できないようです。ただし、呼び出されるシステム コールの順序の制約がない場合、このプログラムは終了する可能性があると思います。これが理由です。syscall1()とはシリアルsyscall2()化されておらず、並列で実行される可能性があるとします。syscall1()その後、コンパイラは、 andのセマンティクスを完全に認識しているため、&と をsyscall2()並べ替えることができます。store x 1syscall1()store y 2

そこで、異なるスレッドによって呼び出されるシステム コールの順序に関する制約があるかどうかを尋ねたいと思います。可能であれば、この種の質問の信頼できる情報源を知りたいです。

4

1 に答える 1

1

システムコール( syscalls(2) ...にリストされているもの)は、ユーザーランドのアプリケーションプログラムの観点からは基本的な操作です。

各システム コールは (定義により)単一の マシン コード命令 ( SYSENTERSYSCALLINT...)を介してカーネルを呼び出します。詳細は、プロセッサ (その命令セット) と ABI によって異なります。カーネルは(システム コールの処理 - 成功するか失敗するか) を処理しますが、ユーザー プログラムは基本的なステップしか認識しません。場合によっては、そのステップ (カーネルに制御が渡される間) が長時間(数分または数時間) 続くことがあります。

したがって、ユーザーランドのプログラムは、単一の「仮想」システムコール命令(カーネルによって実装されたシステムコールを実行できる)によって強化されたプロセッサのユーザーモードマシン命令によって提供される低レベルの仮想マシンで実行されます。

これは、競合状態のためにプログラムにバグがあることを禁止するものではありません。

于 2016-03-26T13:13:14.777 に答える