IOの基本原則を実装する方法

IOの基本原則を実装する方法

最近、IO の基本的な実装原則を学ぶために、JAVA NIO について読んでいます。

IO に関連する基本的な概念は次のとおりです。

1) バッファ操作。 2) カーネル空間とユーザー空間。 3) 仮想メモリ。 4) ページング技術。

1. 仮想メモリ

仮想メモリは、ハードウェア例外 (ページ フォールト例外)、ハードウェア アドレス変換、メイン メモリ、ディスク ファイル、およびカーネル ソフトウェアの完全な相互作用であり、各プロセスに大規模で一貫性のあるプライベート アドレス空間を提供します。

仮想メモリの 3 つの主な機能: 1. メイン メモリをディスク上に保存されたアドレス空間のキャッシュとして扱います。 ②各プロセスに一貫したアドレス空間を提供する。 ③各プロセスのアドレス空間が他のプロセスによって破壊されないように保護する。

仮想メモリの 2 つの主な利点: ① 複数の仮想アドレスが同じ物理メモリ アドレスを指すことができます。 ② 仮想メモリ空​​間は、実際に使用可能なハードウェアメモリよりも大きくなる可能性があります。

[[207226]]

第二に、ユーザー空間とカーネル空間

仮想アドレスが 32 ビットであると仮定すると、仮想アドレス空間の範囲は 0 ~ 4G になります。オペレーティングシステムは 4G を 2 つの部分に分割し、最大の 1G バイト (仮想アドレス範囲: 0xC0000000-0xFFFFFFFF) をカーネルの使用に使用します。これをカーネル空間と呼びます。下位 3G バイトは各プロセスによって使用され、ユーザー スペースと呼ばれます。

カーネルはすべてのプロセスによって共有されるため、各プロセスはシステム コールを通じてカーネルに入ることができます。特定のプロセスごとに 4G の仮想アドレス空間が認識されます。これは、各プロセスが 4G の仮想アドレス空間を持つのと同じです。

3. IO操作

一般的な IO バッファ操作:

1) ユーザープロセスは、read() システムコールを使用して、ユーザー空間バッファを埋めるように要求します。

2) カーネルはディスク コントローラ ハードウェアにコマンドを送信し、ディスクからデータを読み取ります。

3) ディスク コントローラは DMA を使用してデータをカーネル バッファにコピーします (データは CPU を通過しません)。

4) カーネルは、ユーザー プロセスが read() 呼び出しを開始したときに指定されたユーザー バッファーにカーネル バッファーからデータをコピーします。

上の図からわかるように、ディスク内のデータは最初にカーネル バッファーに読み込まれます。次に、カーネルのバッファからユーザーのバッファにコピーされます。なぜこのようなことが起こるのでしょうか?

ユーザー空間プロセスはハードウェアに直接アクセスできない(ディスク コントローラーを操作できない)ためです。ディスクは、一度に固定サイズのブロックで動作するブロックベースのストレージ ハードウェア デバイスですが、ユーザー要求では任意のサイズのデータ​​ ブロックを要求する場合があります。したがって、データはディスクからユーザー空間に渡され、カーネルがデータの分解と再構成を担当します。

メモリマップ IO: 複数の仮想アドレスを再利用して、同じ物理メモリ アドレスを指します。カーネル空間(カーネルアドレス空間)のバッファアドレスは物理メモリアドレス領域にマッピングされ、ユーザー空間(ユーザーアドレス空間)のバッファアドレスも同じ物理メモリアドレス領域にマッピングされます。したがって、カーネル バッファーによってマップされた物理メモリ アドレスからユーザー バッファーによってマップされた物理メモリ アドレスにデータを移動する必要はありません。

要件: ① ユーザー バッファーとカーネル バッファーは同じページ サイズを使用してアラインメントされている必要があります。 ②バッファのサイズは、ディスク コントローラのブロック サイズ (512 バイトのディスク セクター) の倍数である必要があります。これは、ディスクがブロック ストレージ ベースのハードウェア デバイスであり、一度に固定サイズのデータ​​ ブロックのみを操作できるためです。

ユーザー バッファーはページ境界に配置され、IO 効率が向上します。このため、JAVA で新しいバイト配列を作成するときに指定するサイズは 2 の倍数 (4096) になります。

4 番目に、JAVA の IO は基本的に、データをバッファ内またはバッファ外へ移動することです。

read() および write() システム コールは、カーネル バッファーによってマップされた物理メモリ空間内のデータを、ユーザー バッファーによってマップされた物理メモリ空間にコピーするために使用されます。

したがって、メモリマップド IO を使用する場合、ユーザープロセスはファイルデータを直接メモリとして扱うと考えられ、read() または write() システムコールを使用する必要はありません。

read() システム コールが開始されると、読み取るデータの場所に応じて仮想アドレスが生成され (ユーザー プロセスは仮想アドレスを使用します)、MMU によって物理アドレスに変換されます。カーネル内に対応するデータがない場合、ページ フォールト要求が生成されます。カーネルは、ディスクからカーネル バッファーによってマップされた物理メモリにデータを読み込むためのページ ロードを担当します。ユーザー プログラムにとって、これはすべて無意識のうちに起こります。

つまり、基本的には、ページング技術によってデータがディスクからメモリにページ単位でロードされます。

5. JAVA NIO における直接キャッシュと非直接キャッシュ

ダイレクト キャッシュ: ヒープ上に割り当てられたストレージではなく、JVM の外部に配置されます。これは JAVA の GC によって管理されず、カーネル バッファと同等です。非直接キャッシュ: JAVA ヒープ上に構築され、JVM によって管理されるキャッシュ。ユーザー バッファーと同等です。

上記の 3 番目のポイントによると、直接キャッシュにデータをチャネルに書き込む方が、非直接キャッシュにデータを書き込むよりも高速です。チャネルに接続されているもう一方の端は、何らかの形式のハードウェアであるファイル (ディスク、FileChannel) またはネットワーク (ソケット チャネル) であるためです。したがって、非直接キャッシュの場合、データはカーネル バッファーを介してバッファーからハードウェアに転送されます。ダイレクト キャッシュはカーネル バッファに直接マップされるため、これは必要ありません。

<<:  58.com の高可用性 Docker コンテナ クラウド プラットフォームの技術的進化

>>:  クラウドスタックの3つの主要サービスモデルの分析

推薦する

競合他社のウェブサイトを分析する5つのステップ

SEO 最適化のプロセスでは、ウェブマスターは自分のサイトの長所と短所を理解するだけでなく、競合サイ...

Kubernetes オペレーターは何ができますか?

Kubernetes は、複雑なクラウド インフラストラクチャの作成を自動化し、クラウド展開の管理プ...

百度で48時間以内に上位3位に入った広告の分析と解釈

最近、注意深い友人は、48 時間以内に Baidu のトップ 3 にランクされた広告がいくつかの大手...

百度が週次トレンド分析を更新:中秋節と国慶節期間中は更新なし

本日、百度は金曜日の予定通り月例アップデートを行いました。お祭りごとに家族を恋しく思う気持ちが募り、...

ポップマート:流行のおもちゃ市場のスーパーIP?

最近、香港株式市場に上場している流行玩具メーカーのポップマートが最新の半期報告書を発表した。データに...

アプリ運用初心者の方へ:これらのアプリプロモーションチャネルを試しましたか?

アプリ運用の初期段階で、アプリプラットフォームを公開し、より多くのユーザーを獲得するにはどうすればよ...

Longhorn クラウド ネイティブ コンテナ分散ストレージ - Python クライアント

[[421320]]この記事はWeChatの公開アカウント「Hacker Afternoon Tea...

SEO補助技術:Baiduスナップショット苦情実践

Baidu ウェブ苦情は、ユーザーが問題を報告したり、ヘルプを要求したりできるようにするためにウェブ...

2020年のクラウドコンピューティング産業チェーンの現状と発展動向

中国のクラウド コンピューティング市場は急速な発展段階にあり、コンテナーやマイクロサービスなどのテク...

茶包装ステーションの最適化プロセス中に発生した問題の原因の簡単な分析

私が最適化を始めたお茶のパッケージを販売するサイトは、4月8日にオンラインになってから安定したインク...

ハイブリッド クラウドとパブリック クラウド: クラウド コンピューティングの最終形態はどちらでしょうか?

世界最大の 2 つのパブリック クラウド プラットフォームの収益は急増していますが、国際調査機関 R...

クラウド コンピューティング テクノロジーはビジネスの世界にどのような影響を与えるでしょうか?

クラウド コンピューティング テクノロジーは、個人の趣味や専門的な仕事など、人々の生活のあらゆる側面...

Tuanbao.comのCEOである任春雷氏は逃亡し、北京本社は現在無人となっていると言われている。

1月24日、ネットユーザーらは、Tuanbao.comのCEOである任春雷氏が「逃亡」し、北京本社は...

RabbitMQ を使い始める: 完全にマスターするのに役立つ 1 つの記事

RabbitMQ は、軽量で信頼性の高いメッセージングを介してサーバー間で通信するためのオープンソー...

dignusdata: 香港のハイエンド VPS (直接ルート接続)、月額 28 ユーロ、4G メモリ/8 コア/120g SSD/10T トラフィック

Dignusdata、このマケドニアの会社、Hostcatは6月に台湾VPSを一度導入しました(50...