io_getevents
通知機構は一見したところではかなり見えるので、私はそれを使用することができます。まだ何も見つかりませんでした。 Windowsの場合は簡単です:TransmitFile
しかありませんが、必要に応じて非同期に(重複して)動作し、通知メカニズム(IOCP、イベント)で動作します。 Linuxには同等のものが必要ですね。あるいは、私の質問をいくつかの文脈に入れて、Linux上で効率的なファイルサーバを作るにはどうすればよいでしょうか?Linuxにsendfileの非同期バージョンはありますか?
答えて
悲しいかな、あなたはLinux上で何も簡単ではなく、間違った状況でブロックすることはほとんどありません(even io_submit
)。ご質問への答えでは(タイトルに、メインテキスト内):
- いいえ、
sendfile
のない非同期バージョンは、Linuxにありません。 LinuxはWindows(またはFreeBSD)ではありません... - Windowsと比較してLinux上で効率的なファイルサーバーを作成するには、別の考え方が必要です。関連するトレードオフについては、this NGINX blog post about what they do to make things fast on LinuxまたはScylla blog post about different I/O access methods for Linuxをご覧ください。
ソケットが非ブロッキングである場合は、それらが壊れ...
あなたがリンクしたブログ投稿は、ユーザー空間のスレッドプールでのブロック操作をオフロードすることを示唆しているようですが、これはarvidが[2012年のlibtorrent](https://blog.libtorrent)で行ったのと同じことです。org/2012/10/asynchronous-disk-io /)を使用してください。これはまさに私がいくつかのより効率的なAPIのために避けたいのと同じことです。私は、Linuxが6年以上の間に改善されることを期待していました。私はFreeBSDがそれを正しく得ることができたら、なぜLinuxはできないのでしょうか?両方ともPOSIXなので、同じようなハンディキャップを共有しているように感じます。 – purefanatic
また、io_submitは、I/O要求キューや完了キューの充填などの極端な状況下でのみブロックすると考えています。その場合、事実を完了するまで待つ必要があります。 – purefanatic
@purefanatic非常に普及している非同期I/Oフレームワークの欠如は、Linuxの欠点にすぎません。 POSIXはこれに直交するように非同期フレームワークを強制しませんでした。 キャッシュされていないバッファされた読み込みをブロックすることができます。これは、そのようなものではなく、極端ではありません。 – Anon
- 1. Linuxの非同期memcpy?
- 2. Linuxの非同期タイマー
- 3. Webpackローダーに非同期のメリットはありますか?
- 4. Google APIの非同期バージョンですか?
- 5. WebResponseをまだ非同期に呼び出すMVC非同期コントローラはありますか?
- 6. ASP.NET 4の非同期コントローラは意味がありますか?
- 7. <image>タグの非同期リクエストはありますか?
- 8. 非同期I/OベースのAws Javaクライアントはありますか?
- 9. Ruby用の非同期ロギングライブラリはありますか?
- 10. メインキューに非同期はありませんか?
- 11. Android NDKに非同期ファイルI/Oがありますか?
- 12. mallocは非同期ではありませんか?
- 13. この非同期アクター初期化イディオムの名前はありますか?
- 14. 「非同期キーワード非同期」関数を「非同期キーワード非同期」関数に変換できますか?
- 15. 同期メソッドの非同期バージョンを作成する
- 16. ダーツの非同期は本当に非同期ですか?
- 17. 非同期バージョンを作成するときに、必ず同期バージョンのメソッドを含める必要がありますか?
- 18. CloudBlockBlobアップロードの非同期バージョンは非推奨です
- 19. 非同期に非同期デリゲートを呼び出しますか?
- 20. クロージャを自動的に非同期にする関数はありますか?
- 21. setState(React)を非同期にするコードはどこにありますか?
- 22. Linuxで非同期信号はどのように処理されますか?
- 23. WSDLには非同期Webメソッドの概念がありますか?
- 24. 非同期メソッドを待つ必要がありますか?
- 25. 非同期メソッドを待つ必要がありますか?
- 26. @AsyncはGroovyでは非同期ではありません
- 27. バックボーンのトリガー()は同期または非同期ですか?
- 28. 非同期のFuncはデッドロック状態になりますか?
- 29. IListを非同期的にフィルタリングする方法はありますか?
- 30. XPServerCollectionSourceを非同期にロードする方法はありますか?
だ、以上は 'sendfile'(それは、ソケットの「バッファ」に送信することが予定されていたどのくらいのデータを報告しません)しますどちらも。 'sendfile'操作(' epoll'を参照)を続けることができるかどうかを見るためにソケットをポーリングする必要があります。もっと良い方法ですが、これを行うライブラリを使用してください。 – Myst
@Myst Mh、私が非同期I/Oを考えるとき、私は任意の時点で開始し、終了時に通知を受け取る操作を考える。 epoll + sendfileでは、まず送信バッファが利用可能になるまで待つ必要があります。sendfileを呼び出すと、ある量のデータがバッファに(同期的に!)、リンス、リピートされます。 – purefanatic
また、私はsendfileがブロックされていないソケットで使用されていてもブロックされている可能性があり、 'readahead'を使って回避できることを読んでいます:http://brad.livejournal.com/2228488.html これは、実際に作業を行う前に必要なコンテキストスイッチの数が多いため、設計が複雑で待ち時間が長くなります。私は本当に "ノンブロッキング"のアプローチを満足するものではありません。 – purefanatic