ホームページ 運用・保守 Linuxの運用と保守 IOバッファ管理例を詳しく解説

IOバッファ管理例を詳しく解説

Jun 20, 2017 pm 01:19 PM
バックステージ 管理 バッファ

Linux システム IO の書き込みプロトタイプは ssize_t write(int filedes, const void * buff, size_t nbytes);

write を呼び出してデータを書き込む場合、write は呼び出し完了後に直接戻りますが、ディスクデバイスが遅い場合、オペレーティング システムはデータをカーネル内のバッファに保存し、そのデータをディスクに非同期で書き込む責任を負います。もちろん、このときにシステムがダウンするとデータは失われます。 Write はシステム コールであり、各呼び出しはカーネルをトラップするため、適切なブロック長の buffsize を選択し、その呼び出しを最小限に抑えることで効率を最適化できます。 ANSI C の標準 IO では、printf/fprintf/fputs などを呼び出すと、標準 IO ライブラリが処理するため、write のように buffsize を選択するのではなく、ストリームに書き込むだけで済みます。バッファ割り当て、最適化された長さでの IO の実行など、多くの詳細を提供します。これにより、書き込み/読み取りシステム コールの数が減り、効率が向上します。しかし同時に、データのコピーという別の問題も発生します。たとえば、関数 fgets と fputs を使用する場合、通常は 2 つのバッファを経由する必要があります。1 つは標準の IO バッファで、もう 1 つはカーネル バッファです。読み取りと書き込みを呼び出します。ただし、一般に、標準 IO を使用すると、システム IO よりもインターフェイスが簡単になり、効率も同等になります。

標準 IO は、フル キャッシュ、行キャッシュ、キャッシュなしの 3 種類のバッファを提供します。フル キャッシュは、バッファがいっぱいになった場合にのみアクティブにフラッシュされ、通常はディスク ファイルの IO に使用されます。ライン キャッシュは、バッファ内で改行文字が検出されたときにフラッシュされます。また、入力データを標準入出力から取得する必要がある場合にも、ライン キャッシュは対話型端末で使用されます。キャッシュを使用しない場合は、システム コール出力を直接書き込むことと同じであり、標準エラー ストリーム stderr は通常キャッシュされないため、エラー メッセージをできるだけ早く表示できます。デフォルトのフラッシュ条件に加えて、fflush 関数が明示的に呼び出され、プログラムが正常に終了した場合にもバッファはフラッシュされます。 setbuf/setvbuf を使用してデフォルトのバッファ長を変更できます。APUE セクション 5.4 を参照してください。

標準IOを使用するプログラムでは、標準出力をファイルにリダイレクトするとラインキャッシュがフルキャッシュとなり、場合によってはprintf("***の呼び出しなど)予期しないエラーが発生する可能性があります。 **n")、プログラムが対話的に実行されると通常の出力が発生します。ただし、標準出力がファイルにリダイレクトされると、バッファ領域が完全にキャッシュされ、printf は正常に出力されず、データ行はバッファ内に残ります。このとき子プロセスをフォークすると、データ空間が子プロセスにコピーされるときに、バッファデータも子プロセスにコピーされます。その後、子プロセスで出力が実行されると、バッファー内の以前の内容が更新され、予期しない出力が発生します。

ネットワーク プログラミングでは、システム IO を直接使用する必要があります。標準 IO では、パフォーマンスを向上させるためにバッファリング メカニズムが導入されており、これによりネットワーク アプリケーションが複雑になります。また、標準のIOストリームはある意味全二重であり、入出力を同時に行うことができますが、ストリームの制限とソケットの制限が矛盾する場合があります。 (CSAPP P611 を参照)

一部の高度なネットワーク ライブラリ (Muduo ライブラリなど) は、システム IO の使用に基づいて独自のバッファを作成し、ユーザーがシステム IO の不都合な点 (書き込みを呼び出して送信するなど) をシールドできるようにします。大量のデータがあるため、送信バッファがいっぱいになるとアプリケーション層は待機する必要があり、read がデータを受信するとパケットがスティッキーになり、データの受信が遅くなります。アプリケーション層バッファが追加されると、ネットワーク ライブラリはこれらの実装の詳細を処理して、ユーザーの操作を簡素化します。

Linux は、メモリのコピーを削減し、効率を向上させるゼロコピー テクノロジも提供しています。読み取り/書き込みを使用してディスクからネットワーク カードにデータを送信すると、次の 4 つのコピー操作が実行されることがわかっています。カーネルは、同じファイルへの以前のアクセスにより、データがオペレーティング システムのカーネル アドレス空間のバッファに格納されているかどうかを最初に確認します。データがカーネル バッファに見つからない場合は、 Linux オペレーティング システム カーネルは、まずこのデータをディスクから読み取り、オペレーティング システム カーネルのバッファに置きます。このデータ読み出し動作が DMA によって完了する場合、CPU は DMA によるデータ読み出しのプロセス中にバッファ管理を実行し、DMA を作成および処理するだけで済み、その他の多くの変更を行う必要はありません。つまり、DMA はデータ読み取り操作を実行した後、さらなる処理を行うようオペレーティング システムに通知します。 Linux オペレーティング システムは、ユーザーがデータに対する操作を完了した後、読み取りシステム コールで指定されたアプリケーション アドレス空間のアドレスに基づいて、このデータを要求したアプリケーションのアドレス空間にこのデータを保存します。オペレーティング システムは、ユーザー アプリケーションのアドレス空間のバッファからネットワーク スタックに関連するカーネル バッファにコピーを作成する必要があります。このプロセスにも CPU 使用率が必要です。データのコピー操作が完了すると、データはパッケージ化されてネットワーク インターフェイス カードに送信されます。上記の説明からわかるように、この従来のデータ転送プロセスでは、DMA を使用してハードウェアと通信する場合でも、データは少なくとも 4 回コピーされます。CPU は依然としてデータに 2 回アクセスする必要があります。

(追記: 以前、printf 出力プロセスが複数のバッファーを通過するというインタビューの質問を読んだ記憶があります。今では誰もがそれを理解しています!)

ゼロコピー テクノロジを使用すると、システム内のデータのバッファリングを回避できますカーネルアドレス空間領域とユーザーアプリケーションアドレス空間バッファーがコピーされます。場合によっては、アプリケーションはデータ送信プロセス中にデータにアクセスする必要がなく、送信されたデータをユーザー アプリケーション領域にコピーする必要がなく、カーネルを通じてネットワーク カードに直接送信できるため、パフォーマンスが向上します。現時点ではゼロコピー技術が必要です。 Linux では、mmap、sendfile、splice を使用してゼロコピーを実現できます。

以上がIOバッファ管理例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

バックグラウンドログインの問題の解決策を明らかにする バックグラウンドログインの問題の解決策を明らかにする Mar 03, 2024 am 08:57 AM

Discuz のバックグラウンド ログイン問題の解決策が明らかになりました。特定のコード サンプルが必要です。インターネットの急速な発展に伴い、Web サイトの構築がますます一般的になってきました。Discuz は、一般的に使用されるフォーラム Web サイト構築システムとして、次のユーザーに好まれています。多くのウェブマスター。しかし、その強力な機能ゆえに、Discuz を使用する際にバックグラウンドでのログインの問題などの問題が発生することがあります。本日は、Discuz のバックグラウンド ログインの問題の解決策を明らかにし、具体的なコード例を提供します。

Redis を使用して分散トランザクション管理を実装する方法 Redis を使用して分散トランザクション管理を実装する方法 Nov 07, 2023 pm 12:07 PM

Redis を使用して分散トランザクション管理を実装する方法 はじめに: インターネットの急速な発展に伴い、分散システムの使用がますます普及しています。分散システムでは、トランザクション管理が重要な課題です。従来のトランザクション管理方法は分散システムに実装するのが難しく、非効率的です。 Redisの特性を利用して、分散トランザクション管理を容易に実現し、システムのパフォーマンスと信頼性を向上させることができます。 1. Redis の概要 Redis は、効率的な読み取りおよび書き込みパフォーマンスと豊富なデータを備えたメモリベースのデータ ストレージ システムです。

Javaで生徒の成績管理機能を実装するにはどうすればよいですか? Javaで生徒の成績管理機能を実装するにはどうすればよいですか? Nov 04, 2023 pm 12:00 PM

Javaで生徒の成績管理機能を実装するにはどうすればよいですか?現代の教育システムでは、生徒の成績管理は非常に重要な課題です。生徒の成績を管理することで、学校は生徒の学習進度をより適切に監視し、生徒の弱点と長所を理解し、この情報に基づいてより的を絞った指導計画を立てることができます。この記事では、Java プログラミング言語を使用して生徒の成績管理機能を実装する方法について説明します。まず、生徒の成績のデータ構造を決定する必要があります。通常、学生の成績は次のように表すことができます。

WordPress バックエンドのコードの文字化けが心配ですか?これらの解決策を試してください WordPress バックエンドのコードの文字化けが心配ですか?これらの解決策を試してください Mar 05, 2024 pm 09:27 PM

WordPress バックエンドのコードの文字化けが心配ですか?これらの解決策を試してください。具体的なコード例が必要です。Web サイト構築で WordPress が広く使用されるようになったことで、多くのユーザーが WordPress バックエンドでコードが文字化けする問題に遭遇する可能性があります。このような問題が発生すると、バックグラウンドの管理インターフェースが文字化けして表示され、ユーザーに多大な迷惑をかけてしまいます。この記事では、WordPress バックエンドでの文字化けのトラブルを解決するための一般的な解決策をいくつか紹介します。 wp-config.php ファイルを変更し、wp-config を開きます。

Laravel 拡張機能パッケージ管理: サードパーティのコードと機能を簡単に統合 Laravel 拡張機能パッケージ管理: サードパーティのコードと機能を簡単に統合 Aug 25, 2023 pm 04:07 PM

Laravel 拡張機能パッケージ管理: サードパーティのコードと関数を簡単に統合する はじめに: Laravel 開発では、プロジェクトの効率と安定性を向上させるためにサードパーティのコードと関数をよく使用します。 Laravel 拡張パッケージ管理システムを使用すると、これらのサードパーティのコードと機能を簡単に統合できるため、開発作業がより便利で効率的になります。この記事では、Laravel 拡張機能パッケージ管理の基本概念と使用法を紹介し、読者がそれをより深く理解し、適用できるようにいくつかの実践的なコード例を使用します。ララとは

Windows 10で右クリックメニュー管理が開けない場合の対処方法 Windows 10で右クリックメニュー管理が開けない場合の対処方法 Jan 04, 2024 pm 07:07 PM

win10システムを使用している場合、マウスを使用してデスクトップを右クリックしたり、右クリックメニューを実行したりすると、メニューが開かなくなり、コンピュータを正常に使用できなくなります。問題を解決するシステム。 Win10 の右クリック メニュー管理を開くことができません: 1. まずコントロール パネルを開き、クリックします。 2. 次に、「セキュリティとメンテナンス」の下をクリックします。 3. 右側をクリックしてシステムを復元します。 4. それでも使用できない場合は、マウス自体に問題がないか確認してください。 5. マウスに問題がないことを確認したら、+ を押して Enter を押します。 6. 実行が完了したら、コンピュータを再起動します。

バックグラウンドログインに失敗しましたか?簡単に解決する方法を教えます! バックグラウンドログインに失敗しましたか?簡単に解決する方法を教えます! Mar 02, 2024 pm 06:03 PM

バックグラウンドログインに失敗しましたか?簡単に解決する方法を教えます! Discuz は人気のあるフォーラム プラットフォームとして、Web サイトの構築と管理に広く使用されているため、バックエンドでのログイン障害が発生することがあります。これは問題です。今日は、Discuz バックエンドのログイン失敗の原因となる可能性のある問題について説明し、いくつかの解決策を提供し、具体的なコード例を添付します。この記事が、同様の問題に遭遇したウェブマスターや開発者の助けになれば幸いです。 1. トラブルシューティングは、Discuz バックグラウンド ログインの失敗の問題を解決することです。

ThinkPHP6 バックエンド管理システム開発: バックエンド機能の実現 ThinkPHP6 バックエンド管理システム開発: バックエンド機能の実現 Aug 27, 2023 am 11:55 AM

ThinkPHP6 バックエンド管理システム開発: バックエンド機能の実装 はじめに: インターネット技術の継続的な発展と市場の需要に伴い、ビジネス データの管理と運用管理を行うために、効率的で安全かつ柔軟なバックエンド管理システムを必要とする企業や組織がますます増えています。この記事では、ThinkPHP6 フレームワークを使用して、権限制御、データの追加、削除、変更、クエリなどの基本機能を含む、シンプルだが実用的なバックエンド管理システムを開発する方法を例を通して説明します。環境の準備 始める前に、PHP、MySQL、Comをインストールする必要があります

See all articles