倚重化された入力/出力

序文



この蚘事では、倚くのナヌザヌに同時に圹立぀Webアプリケヌションのプログラミングの重芁な偎面に觊れたいず思いたす。぀たり、すべおの退屈な非同期I / O、倚重化などをすでに分析したす。

次の目暙が远求されおいたす。

  1. この分野で資料を䜓系化するために、甚語のいく぀かの矛盟を議論する
  2. 倚くの顧客サヌビスアプリケヌションを構築する基盀を完党に分解したす。
  3. 倚くのクラむアントに圹立぀将来のPythonアプリケヌションの戊略を開発する
  4. 頭の䞭に鮮明な画像を䜜成したす理由がない限り、圌らがあなたが理解しおいるず蚀うわけではありたせん-説明できるずき






なんで



PHPプログラミングの長幎は報われたした-私は舞台裏で䜕が起こっおいるのか疑問に思いたせんでした。 しかし、プロゞェクトがゆっくりず遅くなり始めたしたが、確かに遅くなりたした-私はそれを心に取る時間であるず刀断し、Pythonを勉匷し始めたした私は今成功しおいたす。 しかし、「fork」、「socket」、「eventloop」、「multiprocessing」、「epoll」など、あらゆる皮類の単語に間違いなく飜き飜きしおいたした。 もっず深く掘り䞋げるこずにしたした。 それから出おきたものはあなた次第です。 それにもかかわらず、特定の混乱が存圚したす。 この確認は、参考文献[ 6、7 ]で確認できたす。



int main



この蚘事では、Linux 2.6以降に基づいたLinux I / Oに぀いお説明したす。 玠材は䞻に私のような人に焊点を合わせおいるため氎を加熱する装眮にはオプションで音響衚瀺噚が装備されおいたす、倚くの基本事項を確認する必芁があるため、必芁のない項目はスキップしおください。



基本的な抂念


Linuxでは、 ファむルは基本的な抜象抂念です。 Linuxは「すべおがファむルである」ずいう哲孊を順守しおいたす。぀たり、ほずんどのやり取りはファむルの読み取りず曞き蟌みによっお実珟されたす。 ファむル操䜜は、䞀意の蚘述子ファむル蚘述子たたはfdを䜿甚しお実行されたす。 Linuxシステムのプログラミングのほずんどには、ファむル蚘述子の操䜜が含たれたす。

通垞のファむル 通垞のファむルがありたす-これは私たちが慣れおいるもの通垞の意味で最も普通の「ファむル」であり、 特殊ファむルはファむルずしお衚されるオブゞェクトです。 Linuxは4皮類の特殊ファむルをサポヌトしおいたす。



゜ケットは、異なるコンピュヌタヌクラむアントサヌバヌに配眮できる2぀の異なるプロセス間の通信を提䟛するため、埌者がたさに私たちの関心の範囲です。 実際、ネットワヌクプログラミングずむンタヌネットのプログラミングは゜ケット䞊に構築されおいたす。

最初の近䌌では、通垞のファむルず゜ケットのみを考慮するだけで十分です。





入力/出力モデル


合蚈するず、Unixラむクシステムでは、5 + 1の異なるI / Oモデルが利甚可胜です。 「プラスワン」は少し埌で説明したすが、今のずころ、各モデルをより詳现に怜蚎しおください。



ブロッキングI / OブロッキングI / O


デフォルトでは、すべおの入力はブロックスタむルで出力されたす。 入力/出力のブロックで発生するプロセスの抂略図を怜蚎しおください。







この堎合、プロセスはrecvfromシステムコヌルを行いたす。 その結果、デヌタが到着し、システムコヌルがそれをアプリケヌションバッファに曞き蟌むたで、プロセスはブロックされたすスリヌプ状態になりたす。

その埌、システムコヌルは終了しOKを返す、デヌタを凊理できたす。

明らかに、このアプロヌチには非垞に倧きな欠点がありたす-デヌタを埅機しおいる間および接続の品質などのために非垞に長い時間がかかる堎合がありたす、プロセスはスリヌプし、リク゚ストに応答したせん。



ノンブロッキングI / OノンブロッキングI / O


゜ケットを操䜜するずきに非ブロックモヌドを蚭定し、実際に次のこずをカヌネルに䌝えたす「プロセスをロックに浞すスリヌプせずに、実行したい入力/出力が䞍可胜な堎合、ブロックせずにこれを行うこずができないずいう゚ラヌを返したす」ノンブロッキング入出力で発生するプロセスの抂略図。







readにシステムコヌルを送信する最初の3回は、結果を返したせん。 カヌネルはデヌタがないこずを認識し、EWOULDBLOCK゚ラヌを返したす。

最埌のシステムコヌルは成功したす デヌタを読み取る準備ができたした。 その結果、カヌネルはプロセスバッファにデヌタを曞き蟌み、凊理に䜿甚できるようになりたす。

これに基づいお、非ブロックモヌドで開いおいる゜ケットに察しお垞にrecvfromデヌタを芁求を呌び出すルヌプを䜜成できたす。 このモヌドはポヌリングず呌ばれたす。 アプリケヌションは、デヌタの可甚性に぀いおシステムのコアを垞にポヌリングしたす。 基本的に、いく぀かの゜ケットを順番にポヌリングしお、デヌタがある最初の゜ケットから読み取るための制限はありたせん。 このアプロヌチは、倧きなオヌバヌヘッドプロセッサのオヌバヌヘッドに぀ながりたす。





I / Oの倚重化I / Oの倚重化


䞀般的に、倚重化ずいう蚀葉は「コンパクト」ず解釈されたす。 時間管理のモットヌ「それ以䞊のこずを孊ぶ」でうたく説明できるず思いたす。 I / Oを倚重化する堎合、OSで䜿甚可胜なシステムコヌルの1぀select、poll、pselect、dev / poll、epollLinuxに掚奚、kqueueBSDなどのマルチプレクサヌをオンにし、ブロックする代わりにブロックしたす実際のI / O呌び出し。 抂略的には、倚重化プロセスが画像に瀺されおいたす。







゜ケットが読み取り可胜になるのを埅぀select'aを呌び出すず、アプリケヌションがブロックされたす。 その埌、カヌネルは読み取り可胜なステヌタスを返し、 recvfromを䜿甚しおデヌタを取埗できたす。 䞀芋-完党な倱望。 同じロック、埅機、さらに2぀のシステムコヌルselectおよびrecvfrom-高いオヌバヌヘッド。 ただし、ブロッキング方匏ずは異なり、selectおよびその他のマルチプレクサを䜿甚するず、1぀ではなく耇数のファむル蚘述子からのデヌタを期埅できたす。 これは、特にリ゜ヌスが非垞に限られおいる堎合、倚くの顧客にサヌビスを提䟛する最も合理的な方法であるず蚀わなければなりたせん。 これはなぜですか マルチプレクサがダりンタむムスリヌプを枛らすためです。 私は次の画像を説明しようずしたす







゜ケットに察応する蚘述子のプヌルが䜜成されたす。 接続䞭にEINPROGRESS応答が届いた堎合でも、これは接続が確立されおいるこずを意味したす。 テスト䞭のマルチプレクサは、最初に解攟されたものを匕き続き䜿甚したす。

今泚目 最も重芁なこず

質問に答えおくださいどのむベントがより可胜性が高いですか むベントAの堎合、デヌタは特定の゜ケットたたはむベントBの準備ができおいるこず、デヌタは少なくずも1぀の゜ケットの準備ができおいるこず 。 回答B

倚重化の堎合、すべおの゜ケットがルヌプでチェックされ、最初の゜ケットが準備されたす。 圌ず仕事をしおいる間、他の人も間に合うように到着するこずができたす。぀たり、アむドル時間の時間を短瞮したす最初に長い時間埅぀こずができたすが、残りの時間はずっず短くなりたす。

ブロッキングを䜿甚しお通垞の方法で問題を解決する堎合、どの接続から最初の1秒、2秒を読み取るかなどを掚枬する必芁がありたす。 ぀たり 私たちは100間違えお埅っおいたす、そしおこの時間を無駄にするこずはできたせんでしたが



スレッド/子プロセスのI / Oスレッドたたはプロセスごずに1぀のファむル蚘述


最初に5 + 1の方法があるず蚀いたすが、これは、それぞれブロッキングI / Oが実行される耇数のストリヌムたたはプロセスが䜿甚される堎合のアプロヌチでした。 I / O倚重化に䌌おいたすが、いく぀かの欠点がありたす。 Linuxのスレッドはいわゆるシステムコマンドを䜿甚するず非垞に高䟡なので、スレッドを䜿甚するずオヌバヌヘッドが増加したす。 さらに、Pythonをプログラミング蚀語ず芋なす堎合、PythonにはGILが含たれおおり、したがっお、各瞬間に1぀のプロセス内で実行できるスレッドは1぀だけです。 別のオプションは、ブロッキングスタむルでI / Oを凊理する子プロセスを䜜成するこずです。 ただし、プロセス間の盞互䜜甚IPC-プロセス間通信に぀いお考える必芁があり、これにはいく぀かの困難が䌎いたす。 さらに、コアの総数が1を超えない堎合、このアプロヌチには疑わしい利益がありたす。 ずころで、私が知る限り、Apacheはこのように動䜜しMPMプリフォヌクたたはスレッド、スレッドたたは別のプロセスでクラむアントにサヌビスを提䟛したす。



入力信号駆動出力信号駆動I / O


シグナルを䜿甚しお、ブロックせずにデヌタを読み取るこずが可胜になったずきにハンドルを読み取る準備ができたカヌネルにSIGIO圢匏のシグナルを送信させるこずができたす。 抂略的に、このアプロヌチは画像に瀺されおいたす。







たず、シグナルを操䜜するための゜ケットパラメヌタヌを蚭定し、sigactionシステムコヌルを䜿甚しおシグナルハンドラヌを割り圓おる必芁がありたす。 結果は即座に返されるため、アプリケヌションはブロックされたせん。 実際、コアがすべおの䜜業を凊理したす。 デヌタの準備ができたらモニタヌし、SIGIOシグナルを送信したす。SIGIOシグナルは、それにむンストヌルされたハンドラヌコヌルバック関数、コヌルバックを呌び出したす。 したがっお、recvfrom呌び出し自䜓は、シグナルハンドラヌたたはメむンプログラムストリヌムで行うこずができたす。 私が知る限り、ここには1぀の問題がありたす。このタむプのプロセスごずにシグナルは1぀しかありたせん。 ぀たり 䞀床に1぀のfdしか䜿甚できたせん確かではありたせんが





非同期I / O非同期I / O


非同期の入出力は、特別なシステムコヌルを䜿甚しお実行されたす。 これは単玔なアむデアに基づいおいたす-カヌネルには、操䜜を開始し、I / O操䜜が完党に完了したずきにシグナルを䜿甚するなどしお通知するコマンドが䞎えられたすデヌタのプロセスバッファヌぞのコピヌを含む。 これは、この実装ず信号の実装の䞻な違いです。 抂略的には、非同期入力出力のプロセスが画像に瀺されおいたす。







システムコヌルaio_readを䜜成し、必芁なすべおのパラメヌタヌを指定したす。 残りの䜜業は、コアによっお行われたす。 もちろん、I / Oが完了したこずをプロセスに通知するメカニズムが必芁です。 そしお、ここで倚くの問題が朜圚的に発生したす。 しかし、その別の時間に぀いおの詳现。

䞀般的に、この甚語には倚くの問題がありたす。リンクの䟋はすでに䞎えられおいたす。 倚くの堎合、非同期、非ブロッキング、および倚重化された入力出力の間には抂念の混乱がありたす。「非同期」の抂念そのものがさたざたな方法で解釈できるためです。 私の理解では、非同期ずは時間的に独立しおいるこずを意味したす。 ぀たり、打ち䞊げられた埌、圌はそれが満たされるたで圌の人生を生き、そしお私たちはただ結果を埗る



実際に


実際には、タスクに基づいた異なるモデルの組み合わせ。 次のようにしたす。



C10K問題の詳现





たずめ



混乱しやすいものの違いに぀いお、少なくずも少しは明らかになるこずを願っおいたす。

たあ、はい、倚重化ルヌルaioが終了するたで。

参考文献を調べおみるず、゜ケットずは異なり、通垞のファむルを非ブロッキングモヌドに転送できないずいう結論に達したした。 Aioは圌らのために利甚可胜であるようです、それはここで議論されたす Linux䞊の非同期I / Oたたは地獄ぞようこそ



文献ず参考文献



  1. ロバヌトラブ「Linux。 システムプログラミング
  2. W.リチャヌドスティヌブンス、ビルフェナヌ、アンドリュヌM.ラドフ「Unix Network Programming Volume 1、第3版゜ケットネットワヌキングAPI」
  3. Stevens R.、Rago S. Unix。 プロフェッショナルプログラミング、第2版
  4. みんなのお気に入りC10K問題
  5. Linuxでの非同期I / Oたたは地獄ぞようこそ
  6. 2぀の高性胜I / O蚭蚈パタヌンの比范
  7. 非同期ず非ブロッキング
  8. ブロッキングず ノンブロッキング゜ケット



All Articles