2

読み取り操作が完了したときに aio がプログラムに通知するようにしたいと思います。このページによると、そのような通知は、カーネルから送信されたシグナル、またはユーザー関数を実行するスレッドの開始によって受信できます。の正しい値を設定することで、どちらの動作も選択できますsigev_notify

試してみると、シグナルで通知を受け取るように設定しても、別のスレッドが作成されていることがすぐにわかりました。

(gdb) info threads
  Id   Target Id         Frame 
  2    Thread 0x7ffff7ff9700 (LWP 6347) "xnotify" 0x00007ffff7147e50 in gettimeofday () from /lib64/libc.so.6
* 1    Thread 0x7ffff7fc3720 (LWP 6344) "xnotify" 0x0000000000401834 in update (this=0x7fffffffdc00)

ドキュメントには、次のようにも記載されています。これらの関数の実装は、カーネルのサポート (利用可能な場合) を使用するか、ユーザーレベルのスレッドに基づく実装を使用して行うことができます。スレッドをまったく使用したくないのですが、これは可能ですか?

カーネルをチェックしたところ、問題ないようです。

qdii@localhost /home/qdii $ grep -i aio /usr/src/linux/.config
CONFIG_AIO=y

(もちろん、メインスレッドは別として)(ユーザーランド)スレッドなしでaioを実行することは可能ですか?

編集:私はそれをより深く掘り下げました。librt は aio 関数のコレクションを提供しているようです: glibc のソースを調べると、怪しいものが露出しました: 内部 /rt/aio_read.c は関数スタブです:

int aio_read (struct aiocb *aiocbp)
{
  __set_errno (ENOSYS);
  return -1;
}

stub_warning (aio_read)

サブディレクトリ sysdeps/pthread で最初の関連する実装を見つけました__aio_enqueue_request(..., LIO_READ)。これは を直接呼び出し、次に pthread を作成しました。しかし、なぜその場合にスタックが発生するのか疑問に思っていたので、おそらくスタブは Linux カーネル自体によって実装される可能性があり、その pthread 実装はある種のフォールバック コードになるのではないかと考えました。

/usr/src/linux ディレクトリをgrep するとaio_read、多くの結果が得られます。これについては、現在理解しようとしています。

4

1 に答える 1

1

aio実際には 2 つのまったく異なるライブラリがあることがわかりました。1 つは librt に含まれるglibcの一部であり、pthreads を使用して非同期アクセスを実行します。もう 1 つの aio ライブラリは、最初のものと同じインターフェイスを実装していますが、Linux カーネル自体に基づいて構築されており、シグナルを使用して非同期で実行できます。

于 2012-02-29T14:13:52.793 に答える