Linux io とはどういう意味ですか?

藏色散人
リリース: 2023-03-24 09:43:50
オリジナル
2414 人が閲覧しました

linux io はファイル操作を指します。Linux では、ファイルは一連のバイナリ ストリームであるため、情報交換中に、これらのストリーム上でデータの送受信操作を実行します。これらの操作は、 Linux は仮想メモリ メカニズムを使用するため、IO 操作を完了するにはシステム コールを通じてカーネルを要求する必要があります。

Linux io とはどういう意味ですか?

#このチュートリアルの動作環境: linux5.9.8 システム、Dell G3 コンピューター。

Linux io とは何を指しますか?

Linux の世界では、すべてがファイルであることは誰もが知っています。

そして、ファイルは一連のバイナリ ストリームであり、ソケット、FIFO、パイプ、ターミナルなど、私たちにとってはすべてがストリームです。

  • 情報交換のプロセスでは、私たちは皆、これらのストリーム上でデータの送受信操作 (I/O 操作と呼ばれます) を実行します。

  • ストリームからデータを読み取るには、システムは Read を呼び出し、データを書き込むには、システムは Write を呼び出します。

通常、ユーザー プロセスの完全な IO は 2 つの段階に分割されます:

ディスク IO:

Linux io とはどういう意味ですか?

ネットワーク IO:

Linux io とはどういう意味ですか?

オペレーティング システムとドライバーはカーネル空間で実行され、アプリケーションはユーザー空間で実行されます。両者はポインターを使用することはできません。 Linux で使用される 仮想メモリメカニズムは、IO アクションを完了するためにシステム コールを通じてカーネルに要求する必要があるため、データを転送します。

IO にはメモリ IO、ネットワーク IO、ディスク IO の 3 種類があります。通常、ここで言う IO は後者の 2 つを指します。

IO モデルが必要な理由

同期を使用して通信すると、すべての操作が 1 つのスレッドで順番に実行されるため、欠点は次のとおりです。明らか:

  • 同期通信操作は同じスレッド上の他の操作をブロックするため、この操作が完了した後にのみ後続の操作を完了できるため、## が表示されます #同期ブロック マルチスレッド (各 Socket はそれに対応するスレッドを作成します) が、システム内のスレッドの数は限られており、スレッドの切り替えは時間の無駄であるため、Socket が少ない状況に適しています。
IO モデルを表示する必要があります。

Linux IO モデル

Linux IO モデルを説明する前に、まず Linux システム データを読み取るプロセスを理解しましょう。

Linux io とはどういう意味ですか?

##index.html ファイルをリクエストするユーザーを例として使用して説明します

Linux io とはどういう意味ですか?

基本概念

ユーザー スペースとカーネル空間

オペレーティング システムの中核はカーネルであり、通常のアプリケーションから独立しており、保護されたメモリ空間へのアクセスと、基盤となるハードウェア デバイスにアクセスするためのすべての権限を持っています。

    カーネルのセキュリティを確保するため、ユーザープロセスはカーネルを直接操作できず、オペレーティングシステムは仮想空間をカーネル空間とユーザー空間の2つに分割します。

プロセスの切り替え

プロセスの実行を制御するには、カーネルが CPU 上で実行中のプロセスを一時停止し、プロセスを再開する機能を備えている必要があります。以前に一時停止されたプロセス。プロセスの実行。

この動作はプロセス切り替えと呼ばれます。

つまり、どのプロセスもオペレーティング システム カーネルのサポートを受けて実行され、カーネルと密接に関係していると言えます。

プロセスのブロック

システム リソースの要求の失敗、特定の操作の完了の待機など、予期される特定のイベントが発生しないため、実行中のプロセスが新しいデータ まだ到着していない場合、または実行する新しい作業がない場合、システムは自動的にブロッキング プリミティブ (Block) を実行して、実行状態からブロッキング状態に変更します。

プロセスのブロックはプロセス自体の能動的な動作であるため、実行状態 (CPU を取得) にあるプロセスのみがブロック状態にできることがわかります。

プロセスがブロッキング状態になると、CPU リソースは占有されません。

ファイル ディスクリプタ

ファイル ディスクリプタはコンピュータ サイエンスの用語で、ファイルへの参照を表現するために使用される抽象概念です。

ファイル記述子は、形式上は負ではない整数ですが、実際には、プロセスごとにカーネルによって維持される、プロセスによって開かれたファイルのレコード テーブルを指すインデックス値です。

    プログラムが既存のファイルを開くか、新しいファイルを作成すると、カーネルはファイル記述子をプロセスに返します。

キャッシュされた IO

ほとんどのファイル システムのデフォルトの IO 操作はキャッシュされた IO です。

読み取りと書き込みのプロセスは次のとおりです:

  • 読み取り操作: オペレーティング システムは、カーネル バッファに必要なデータがあるかどうかを確認します。キャッシュされている場合は、キャッシュから直接返されます。キャッシュされていない場合は、キャッシュから直接返されます。ディスク、ネットワーク カードなどから返されます。読み取り、オペレーティング システムのキャッシュにキャッシュされます。

  • 書き込み操作 : ユーザーからデータをコピーします。スペースをカーネルスペースのキャッシュにコピーします。この時点でユーザプログラムの書き込みは完了していますが、いつディスクやネットワークカードなどに書き込むかについては、明示的にsync同期コマンドを呼び出さない限り、OSが決定します。

# カーネル空間キャッシュに必要なデータがないと仮定すると、ユーザー プロセスは次の 2 段階でディスクまたはネットワークからデータを読み取ります。

#フェーズ 1:
    カーネル プログラムは、ディスク、ネットワーク カードなどからカーネル空間キャッシュにデータを読み取ります;
  • フェーズ 2:
  • ユーザー プログラムは、カーネル空間キャッシュからユーザー空間にデータをコピーします。
  • キャッシュ IO の欠点:
データ送信プロセス中に、アプリケーションのアドレス空間とカーネル空間で複数のデータ コピー操作が必要になります。これらのデータ コピー操作によって発生する CPU とメモリのオーバーヘッドは非常に大きくなります。

同期ブロッキング

ユーザー空間アプリケーションがシステム コールを実行すると、アプリケーションはブロックされ、データの準備ができてデータがカーネルからユーザー プロセスにコピーされるまで何も行われなくなります。データの待機とデータの処理という 2 つの段階の間、プロセス全体がブロックされ、他のネットワーク IO を処理できなくなります。

呼び出し元のアプリケーションは CPU を消費せず、単に応答を待っている状態になるため、処理の観点から見ると、これは非常に効率的です。

    これも最も単純な IO モデルで、通常 FD が少なく準備が早い場合に使用しても問題ありません。

同期ノンブロッキング

Linux io とはどういう意味ですか?ノンブロッキング システム コールが呼び出された後、プロセスはブロックされず、カーネルはすぐにプロセスに戻ります。データの準備がまだ整っていない場合は、エラーが返されます。

プロセスが戻った後、システムコールを行う前に他のことを行うことができます。

  • 上記のプロセスを繰り返し、周期的にシステム コールを実行します。このプロセスは、多くの場合、ポーリングと呼ばれます。

  • ポーリングでは、データの準備ができるまでカーネル データをチェックし、データをデータ処理のためにプロセスにコピーします。

  • データをコピーするプロセス全体中、プロセスは依然としてブロックされていることに注意してください。

  • このようにして、プログラミングで

    O_NONBLOCK
  • を Socket に設定することができます。
IO 多重化

Linux io とはどういう意味ですか?IO 多重化、これはプロセスがカーネルに事前に通知する機能です。カーネルは、プロセスによって指定された 1 つ以上の IO 条件の準備ができていることを検出すると、プロセスに通知します。

プロセスが一連のイベントを待機できるようにします。

IO 再利用の現在の実装方法には、主に Select、Poll、Epoll が含まれます。

擬似コードは IO 多重化を記述します:

while(status == OK) { // 不断轮询 ready_fd_list = io_wait(fd_list); //内核缓冲区是否有准备好的数据 for(fd in ready_fd_list) {  data = read(fd) // 有准备好的数据读取到用户缓冲区  process(data) }}
ログイン後にコピー
Linux io とはどういう意味ですか?シグナル ドライバー

まず、Socket がシグナル駆動型 IO を実行できるようにします。信号処理機能をインストールすると、プロセスはブロックされることなく実行され続けます。

データの準備ができると、プロセスは SIGIO 信号を受信し、信号処理関数の I/O 操作関数を呼び出してデータを処理できます。

プロセスは次のとおりです:

ソケット シグナル ドライバー IO 機能を有効にする

  • システムコール Sigaction 信号処理関数を実行します (ノンブロッキング、すぐに戻ります)

  • #データの準備が整い、Sigio 信号を生成し、信号コールバックを介してデータを読み取るようにアプリケーションに通知します

  • #この IO 方式には大きな問題があります: Linux のシグナルキューには制限があり、この数を超えるとデータを読み取れなくなります。
  • #非同期ノンブロッキング

非同期 IO プロセスは次のとおりです:

Linux io とはどういう意味ですか?

ユーザー スレッドが

aio_read

システム コール。すぐに開始できます。他のことを行うために、ユーザー スレッドはブロックしません。

##カーネルは、IO の最初のフェーズ、つまりデータの準備を開始します。カーネルは、データの準備ができるまで待機すると、カーネル バッファからユーザー バッファにデータをコピーします。

  • カーネルはユーザー スレッドにシグナルを送信するか、ユーザー スレッドをコールバックします。ユーザー スレッド 登録されたコールバック インターフェイスは、読み取り操作が完了したことをユーザー スレッドに伝えます

    #ユーザー スレッドはユーザー バッファー内のデータを読み取り、後続のビジネス操作を完了します
  • #同期 IO と比較して、非同期 IO は連続して実行されません。
  • ユーザー プロセスが aio_read システム コールを実行すると、カーネル データの準備ができているかどうかに関係なく、データはユーザー プロセスに直接返され、その後ユーザー モード プロセスに返されます。他のことができます。

    データの準備ができたら、カーネルはデータをプロセスに直接コピーし、カーネルからプロセスに通知を送信します。

    信号駆動型 IO と比較した非同期 IO の主な違いは次のとおりです。

    • 信号ドライバーは、IO 操作がいつ開始できるかを知らせます。カーネルに保存される (データはカーネル バッファに保存される) のに対し、非同期 IO は IO 操作が完了したときにカーネルによって通知されます (データはすでにユーザー空間にあります)。

    非同期 IO は、イベント駆動型 IO とも呼ばれます。Unix では、ファイルへの非同期アクセス用に一連のライブラリ関数が定義され、一連の AIO インターフェイスが定義されています。

    • 非同期 IO 操作を開始するには、aio_read または aio_write を使用し、実行中の IO 操作のステータスを確認するには、aio_error を使用します。 。

    Linux における AIO の現在のカーネル実装は、ファイル IO に対してのみ有効です。実際の AIO を実装したい場合は、自分で実装する必要があります。

    現在、libevent、libev、libuv など、オープンソースの非同期 IO ライブラリが多数存在します。

    Linux io とはどういう意味ですか?

    関連する推奨事項: 「Linux ビデオ チュートリアル

以上がLinux io とはどういう意味ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート