YungTatyu / webserv

HTTP/1.1 server written in cpp.
1 stars 0 forks source link

writeディフェンス用文句 #205

Closed ayase-mstk closed 4 months ago

ayase-mstk commented 5 months ago

pollingしてないwriteがブロックしないこと、課題で言われていることの範囲外だから的な。

ayase-mstk commented 4 months ago

そもそもなぜポーリングを行うのか?

polling apiは、I/O多重化を利用して、複数のファイルディスクリプタ(通常はソケット)に対して同時に待機できるかどうかを監視するために使用されます。polling apiを使用することで、シングルスレッドで複数のクライアントとの通信を非同期に処理することができます。

ソケットをノンブロッキングにしたうえで、さらにerrnoではなくpolling apiを使うことの優位性は何か?

errnoの結果をみて操作を行うこともできるが、その場合はpollingするときに比べ、 イベントが発生していない時にも常にwrite/readを試みなければならずリソースの無駄遣いになる。 複数のソケットの状態を順番に見る必要があり一度にイベントが発生したものだけを見ることができない。 タイムアウトの管理が煩雑になる。 条件分岐が複雑になる。 ー>これらがpolling apiだと起こらない。また、イベントが発生したもののみに対してi/o操作するためリアルタイム性の要件を満たすことができる。

上記を踏まえて、なぜsocket i/oに対してはpolling apiを使い、log file i/oに対してはpolling apiを通さなくてもよいか?

ソケット通信はリアルタイム性が重要な場合が多い。ポーリングを使用することで、クライアントからの新しい接続やデータの到着を即座に検知し、迅速に処理することが可能である。一方、ログファイルへの書き込みは通常、リアルタイム性が求められることは少なく、そのためにポーリングを行う必要はない。 また、ソケット通信は多数のクライアントからの接続やデータのやり取りが発生することがあります。ポーリングを使用することで、これらのイベントを効率的に監視し、マルチタスク環境でのリソースの最適な利用が可能になる。一方で、ログファイルへの書き込みは比較的低頻度であり、ポーリングによるリソースの浪費を避けることができる。