ホームページ  >  記事  >  コンピューターのチュートリアル  >  Linux ゼロコピー テクノロジをわかりやすく説明する 6 枚の写真

Linux ゼロコピー テクノロジをわかりやすく説明する 6 枚の写真

WBOY
WBOY転載
2024-02-22 18:40:02666ブラウズ

Linux ゼロコピー テクノロジをわかりやすく説明する 6 枚の写真

皆さん、こんにちは。今日は Linux のゼロコピー テクノロジについて話しましょう。 sendfile システム コールをエントリ ポイントとして使用して、ゼロコピー テクノロジの基本原理を深く調査します。ゼロコピーテクノロジーの中心的な考え方は、データ伝送経路を最適化することでメモリ間のデータのコピーを最小限に抑え、データ伝送の効率とパフォーマンスを向上させることです。

1. ゼロコピー テクノロジーの概要

Linux ゼロコピー テクノロジは、データ転送を最適化するために使用されるテクノロジであり、カーネル モードとユーザー モード間のデータ コピーの数を削減することで、データ転送の効率を向上させます。

データ送信のプロセス中、通常、送信を完了する前に、データをカーネル バッファからアプリケーション バッファにコピーし、次にアプリケーション バッファからネットワーク デバイスのバッファにコピーする必要があります。

ゼロコピー テクノロジの利点は、中間のコピー手順を必要とせずにデータを直接送信できることであり、これによりデータ送信の効率が向上します。

Linux ゼロコピー テクノロジの実装:

  • sendfile システム コール: sendfile システム コールは、ファイルの内容をカーネル状態のネットワーク デバイスのバッファに直接送信し、ユーザー状態とカーネル状態の間でのデータのコピーを回避できます。
  • splice システム コール: splice システム コールは、中間のコピー プロセスを回避して、あるファイル記述子から別のファイル記述子にデータを直接転送したり、あるファイル記述子からネットワーク デバイスのバッファにデータを転送したりすることもできます。
  • mmap および write システム コール: mmap システム コールは、ファイルをメモリにマップし、次に write システム コールを使用してメモリ内のデータをネットワーク デバイスのバッファに直接送信し、ユーザー状態とデータの間のデータを回避します。カーネルの状態をコピーします。
  • DMA (ダイレクト メモリ アクセス): DMA は、メモリからネットワーク デバイスのバッファにデータを直接転送できるハードウェア テクノロジで、CPU の介入を回避し、データ転送の効率を向上させます。

2.sendfile システムコール

sendfile システム コールは、あるファイル記述子から別のファイル記述子の送信バッファにデータをコピーすることにより、カーネル空間内でファイル データを直接転送できます。このようにして、データはネットワーク プロトコル スタックを介して直接送信され、ユーザー空間とカーネル空間の間で頻繁に行われるデータ コピー操作を回避できます。

これにより、カーネルとユーザー空間の間でのデータのコピーが回避され、送信効率が向上します。

sendfile システムコール関数プロトタイプ:

リーリー

3.sendfile 実装原則

3.1 従来の方法でファイルを送信する

従来の方法を使用してソケット経由でファイルを送信するには、比較的長いパスを実行する必要があります。

パス: ディスク -> ファイル ページ キャッシュ -> ユーザー バッファ -> ソケット バッファ -> ネットワーク カード。

コンテキスト切り替えとメモリコピーの条件は以下のとおりです。

  • コンテキストスイッチ: 4 回 (読み取り呼び出し、読み取り戻り、書き込み呼び出し、書き込み戻り)
  • DMAコピー:2回
  • CPU コピー: 2 回 (ファイル ページ キャッシュ -> ユーザー バッファ、ユーザー バッファ -> ソケット バッファ)
###写真###

3.2 sendfile はファイルを送信します

sendfile を使用してファイルを送信すると、相対的にパス全体が短くなります。

パス: ディスク -> ファイル ページ キャッシュ -> ソケット バッファ -> ネットワーク カード。

コンテキスト切り替えとメモリコピーの条件は以下のとおりです。

コンテキストスイッチ: 2回(sendfile呼び出し、sendfileリターン)

DMAコピー:2回

CPU コピー: 1 回 (ファイル ページ キャッシュ -> ソケット バッファ)

###写真###

3.3 Sendfileの実装原則

sendfile 実装の中核はパイプです。パイプは、パイプを介したプロセス間通信など、Linux システムで広く使用されています。

ファイル データをソケット バッファにコピーする必要がある場合、パイプ (リング バッファ) が一時的に作成され、最初にファイル データがパイプにコピーされ、その後パイプ データがソケット バッファに移行されます。データ移行はデータのコピーではなく、ポインタがメモリ アドレスを指すだけです。

###写真###

3.4 セクション

sendfile を使用してファイルを送信すると、2 つのコンテキスト スイッチと 1 つの CPU コピーを削減できます。実際のアプリケーション シナリオで多数のファイルを送信する必要がある場合、sendfile を使用するとシステム パフォーマンスが大幅に向上します。

4. パイプライン

4.1 パイプラインの紹介 パイプは Linux システムで広く使用されています。パイプを使用したゼロコピー テクノロジに加えて、プロセス間通信でもパイプが使用されます。では、パイプとは正確には何でしょうか? ###写真###

パイプラインとは何ですか?

パイプは実際にはリング バッファであり、これを通じてあるファイルから別のファイルにデータをコピーできます。

パイプは struct Pipe_inode_info 構造によって定義されます。このデータ構造には 4 つの重要なメンバーがあります:

  • pipe_buffer: パイプ バッファー配列、固定長配列。各配列メンバーはバッファーであり、struct Pipe_buffer 構造体に対応します。
  • head: 現在の書き込み可能なバッファの場所を示すヘッドのシリアル番号。マスクと組み合わせて使用​​する必要があります。
  • tail: 現在読み取り可能なバッファの位置を示す末尾のシリアル番号。マスクと組み合わせて使用​​する必要があります。
  • ring_size: パイプ バッファー配列の長さ、ring_size – 1 はマスクを計算し、head とマスクは現在の書き込み可能なバッファー配列の添字を取得し、tail とマスクは現在の読み取り可能なバッファー配列の添字を取得します。

パイプ バッファーは struct Pipe_buffer によって定義され、これには 3 つの重要なメンバーがあります。

  • page: ページポインタ
  • offset: ページ内のデータ オフセット
  • len:データ長

パイプがいっぱいか空かを判断しますか?

パイプライン完全判定:

head – tail >=ring_size、パイプがいっぱいであることを示します。

パイプが空かどうかの判定:

head == tail、パイプが空であることを示します。

以上がLinux ゼロコピー テクノロジをわかりやすく説明する 6 枚の写真の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はmryunwei.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。