Linuxカーネルの歴史

カーネル:オペレーティングシステムカーネル

fd:ファイル記述子。Linuxのすべてはファイルであり、テキストファイルであろうとネットワークソケットであろうと、ファイル記述子があります。実際、これはファイルのインデックス値であり、どのプロセスにもファイル記述子があります

、、 BIO

クライアントは、ファイル記述子fd 8であると想定して、接続します。読み取りfd 8をブロックし、処理を待機するために使用されるユーザースペースのスレッド。データがある場合は処理され、データがない場合はブロックされます。この欠点は明らかです。スレッドはアイドル状態で無駄になる可能性があります。リソース。この期間中、ソケットはブロックされています

image.png

二、NIO

リソースの浪費を避けるために、CPUが1つだけで、複数のクライアントが接続する場合(ファイル記述子が異なり、すべてがLinuxのファイルである)、ユーザースペースでプロセスがポーリングしてすべてを表示できると仮定します。ファイル記述子はありますかファイルの一部に処理するデータがありますか?読み取るものがある場合は、どのファイル記述子を読み取るかをカーネルに指示します。上記と比較すると、このスレッドは待機をブロックしませんが、多くのクライアントをポーリングして処理できます。、これはノンブロッキング

では、同期と非同期とは何ですか?実際、ここのユーザースペースは常にこのスレッドで作業しており、すべてを独自に実行する必要があります。これは同期です。同期と非同期は、スレッドが1つのことを実行することを意味します。他の人にやらせるために呼ばれます。、または自分でやる

ここでのポーリングはブロッキングの問題を解決しますが、それでも明らかな欠陥があります。つまり、このスレッドは疲れすぎて、常にポーリングするとCPUリソースが消費されます。

image.png

3、多重化

無限ループによるパフォーマンスの消費を回避するために、ユーザースペースはファイル記述子をカーネルカーネルスペースのセレクターに一度に渡します。このセレクターは、読み取る必要のあるfdをフィルタリングし、それを書き戻す役割を果たします。ユーザースペースはカーネルにこれらのfdを読み取る必要があることを通知し、カーネルはファイル記述子を読み取ります。これは多重化されています(epoll-event poll)

この多重化には明らかな欠点もあります。つまり、ファイル記述子をユーザーモードとカーネルモードの間でベイク処理する必要があり、これには時間がかかります。

image.png

4つの共有スペース

問題は、コピーに時間がかかることです。解決策は、カーネルモードとユーザーモードの間でスペースを共有することです。ファイル記述子はすべて赤黒木に配置され、カーネルは読み取る必要のあるものをに入れます。リンクリスト。

image.png


ゼロコピー

ここでの共有スペースはゼロコピーと同等ではありません。ゼロコピーとは、別のシステムコールであるsendfile(out、in)を指します。

sendfileが現れる前に、2つのシステムコールがありました。1つはread(fd)で、もう1つはwrite(fd)でした。これで、カーネルに2つのソケットが接続されます。必要なのは、カーネルを介してネットワークカードにディスクファイルを書き込むことです。それらのfdはfd4とfd3です。このプロセスは次のようになります。ユーザースペースはreadfd3を呼び出し、カーネルは最初にファイルをカーネルバッファーバッファーに取り込み、fd3をユーザースペースに読み取り、次にfd4を書き込んでカーネルにコピーして戻し、次にネットワークに書き込みます。カード。これが再びコピーするプロセスです

sendfileの改善はゼロコピーです。ユーザースペースがsendfileを呼び出し、カーネルがファイルをバッファーに取り込み、ネットワークカードに直接書き込みます。

image.png

ベストプラクティスカフカ

Kafkaは、ScalaとJavaを組み合わせて作成され、バイトコードにコンパイルされ、JVMで実行されます。

データはネットワークカードを通過し、Linuxカーネルに入り、次にKafkaに入ります。mmapメモリマッピングを介して、Kafkaはデータをファイルにすばやく書き込むことができます。コンシューマー(クライアント)はsendfileを呼び出し、データをすばやく読み取ることもできます

image.png

おすすめ

転載: blog.csdn.net/qq_38238041/article/details/114557210