linux io はファイル操作を指します。Linux では、ファイルは一連のバイナリ ストリームであるため、情報交換中に、これらのストリーム上でデータの送受信操作を実行します。これらの操作は、 Linux は仮想メモリ メカニズムを使用するため、IO 操作を完了するにはシステム コールを通じてカーネルを要求する必要があります。
#このチュートリアルの動作環境: linux5.9.8 システム、Dell G3 コンピューター。
Linux io とは何を指しますか?
Linux の世界では、すべてがファイルであることは誰もが知っています。
そして、ファイルは一連のバイナリ ストリームであり、ソケット、FIFO、パイプ、ターミナルなど、私たちにとってはすべてがストリームです。
情報交換のプロセスでは、私たちは皆、これらのストリーム上でデータの送受信操作 (I/O 操作と呼ばれます) を実行します。
ストリームからデータを読み取るには、システムは Read を呼び出し、データを書き込むには、システムは Write を呼び出します。
通常、ユーザー プロセスの完全な IO は 2 つの段階に分割されます:
ディスク IO:
ネットワーク IO:
オペレーティング システムとドライバーはカーネル空間で実行され、アプリケーションはユーザー空間で実行されます。両者はポインターを使用することはできません。 Linux で使用される 仮想メモリメカニズムは、IO アクションを完了するためにシステム コールを通じてカーネルに要求する必要があるため、データを転送します。
IO にはメモリ IO、ネットワーク IO、ディスク IO の 3 種類があります。通常、ここで言う IO は後者の 2 つを指します。
IO モデルが必要な理由
同期を使用して通信すると、すべての操作が 1 つのスレッドで順番に実行されるため、欠点は次のとおりです。明らか:
IO モデルを表示する必要があります。Linux IO モデルLinux IO モデルを説明する前に、まず Linux システム データを読み取るプロセスを理解しましょう。
##index.html ファイルをリクエストするユーザーを例として使用して説明します
基本概念ユーザー スペースとカーネル空間
オペレーティング システムの中核はカーネルであり、通常のアプリケーションから独立しており、保護されたメモリ空間へのアクセスと、基盤となるハードウェア デバイスにアクセスするためのすべての権限を持っています。プロセスの切り替え
プロセスの実行を制御するには、カーネルが CPU 上で実行中のプロセスを一時停止し、プロセスを再開する機能を備えている必要があります。以前に一時停止されたプロセス。プロセスの実行。この動作はプロセス切り替えと呼ばれます。つまり、どのプロセスもオペレーティング システム カーネルのサポートを受けて実行され、カーネルと密接に関係していると言えます。
プロセスのブロック
システム リソースの要求の失敗、特定の操作の完了の待機など、予期される特定のイベントが発生しないため、実行中のプロセスが新しいデータ まだ到着していない場合、または実行する新しい作業がない場合、システムは自動的にブロッキング プリミティブ (Block) を実行して、実行状態からブロッキング状態に変更します。 プロセスのブロックはプロセス自体の能動的な動作であるため、実行状態 (CPU を取得) にあるプロセスのみがブロック状態にできることがわかります。プロセスがブロッキング状態になると、CPU リソースは占有されません。
ファイル ディスクリプタ
ファイル ディスクリプタはコンピュータ サイエンスの用語で、ファイルへの参照を表現するために使用される抽象概念です。 ファイル記述子は、形式上は負ではない整数ですが、実際には、プロセスごとにカーネルによって維持される、プロセスによって開かれたファイルのレコード テーブルを指すインデックス値です。キャッシュされた IO
ほとんどのファイル システムのデフォルトの IO 操作はキャッシュされた IO です。 読み取りと書き込みのプロセスは次のとおりです:読み取り操作: オペレーティング システムは、カーネル バッファに必要なデータがあるかどうかを確認します。キャッシュされている場合は、キャッシュから直接返されます。キャッシュされていない場合は、キャッシュから直接返されます。ディスク、ネットワーク カードなどから返されます。読み取り、オペレーティング システムのキャッシュにキャッシュされます。
書き込み操作 : ユーザーからデータをコピーします。スペースをカーネルスペースのキャッシュにコピーします。この時点でユーザプログラムの書き込みは完了していますが、いつディスクやネットワークカードなどに書き込むかについては、明示的にsync同期コマンドを呼び出さない限り、OSが決定します。
# カーネル空間キャッシュに必要なデータがないと仮定すると、ユーザー プロセスは次の 2 段階でディスクまたはネットワークからデータを読み取ります。
#フェーズ 1:フェーズ 2:
キャッシュ IO の欠点:
データ送信プロセス中に、アプリケーションのアドレス空間とカーネル空間で複数のデータ コピー操作が必要になります。これらのデータ コピー操作によって発生する CPU とメモリのオーバーヘッドは非常に大きくなります。 同期ブロッキング
ユーザー空間アプリケーションがシステム コールを実行すると、アプリケーションはブロックされ、データの準備ができてデータがカーネルからユーザー プロセスにコピーされるまで何も行われなくなります。データの待機とデータの処理という 2 つの段階の間、プロセス全体がブロックされ、他のネットワーク IO を処理できなくなります。
呼び出し元のアプリケーションは CPU を消費せず、単に応答を待っている状態になるため、処理の観点から見ると、これは非常に効率的です。ノンブロッキング システム コールが呼び出された後、プロセスはブロックされず、カーネルはすぐにプロセスに戻ります。データの準備がまだ整っていない場合は、エラーが返されます。
プロセスが戻った後、システムコールを行う前に他のことを行うことができます。
上記のプロセスを繰り返し、周期的にシステム コールを実行します。このプロセスは、多くの場合、ポーリングと呼ばれます。
ポーリングでは、データの準備ができるまでカーネル データをチェックし、データをデータ処理のためにプロセスにコピーします。
データをコピーするプロセス全体中、プロセスは依然としてブロックされていることに注意してください。
このようにして、プログラミングで
O_NONBLOCKIO 多重化、これはプロセスがカーネルに事前に通知する機能です。カーネルは、プロセスによって指定された 1 つ以上の IO 条件の準備ができていることを検出すると、プロセスに通知します。
擬似コードは IO 多重化を記述します:
while(status == OK) { // 不断轮询 ready_fd_list = io_wait(fd_list); //内核缓冲区是否有准备好的数据 for(fd in ready_fd_list) { data = read(fd) // 有准备好的数据读取到用户缓冲区 process(data) }}シグナル ドライバー
まず、Socket がシグナル駆動型 IO を実行できるようにします。信号処理機能をインストールすると、プロセスはブロックされることなく実行され続けます。
ソケット シグナル ドライバー IO 機能を有効にする
システムコール Sigaction 信号処理関数を実行します (ノンブロッキング、すぐに戻ります)
#非同期ノンブロッキング
##カーネルは、IO の最初のフェーズ、つまりデータの準備を開始します。カーネルは、データの準備ができるまで待機すると、カーネル バッファからユーザー バッファにデータをコピーします。
カーネルはユーザー スレッドにシグナルを送信するか、ユーザー スレッドをコールバックします。ユーザー スレッド 登録されたコールバック インターフェイスは、読み取り操作が完了したことをユーザー スレッドに伝えます
#同期 IO と比較して、非同期 IO は連続して実行されません。
ユーザー プロセスが aio_read
システム コールを実行すると、カーネル データの準備ができているかどうかに関係なく、データはユーザー プロセスに直接返され、その後ユーザー モード プロセスに返されます。他のことができます。
データの準備ができたら、カーネルはデータをプロセスに直接コピーし、カーネルからプロセスに通知を送信します。
信号駆動型 IO と比較した非同期 IO の主な違いは次のとおりです。
非同期 IO は、イベント駆動型 IO とも呼ばれます。Unix では、ファイルへの非同期アクセス用に一連のライブラリ関数が定義され、一連の AIO インターフェイスが定義されています。
aio_read
または aio_write
を使用し、実行中の IO 操作のステータスを確認するには、aio_error
を使用します。 。 Linux における AIO の現在のカーネル実装は、ファイル IO に対してのみ有効です。実際の AIO を実装したい場合は、自分で実装する必要があります。
現在、libevent、libev、libuv など、オープンソースの非同期 IO ライブラリが多数存在します。
関連する推奨事項: 「Linux ビデオ チュートリアル 」
以上がLinux io とはどういう意味ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。