参考リンク:
カーネルIDR()は、Linuxの詳細なメカニズムhttps://blog.csdn.net/weixin_37867857/article/details/85028303?depth_1-utm_source=distribute.pc_relevant.none-task
IDRのLinuxカーネル学習(a)の https://www.cnblogs.com/zero-jh/p/5184836.html
データ構造は、バインディングは、(キー、値)にマッピングされます。また、連想配列としても知られています。これは、一意のキーの集合から成るとみなすことができます。各キーは、この値に対応します。
従来のマッピングハッシュテーブルとバイナリ、およびバイナリの変種があり実現しています。
違いの
比較的良好な平均時間の複雑さを持つハッシュテーブル。バイナリツリーは、より良い最悪の時間複雑性を有します。
ハッシュ関数を介して、ハッシュテーブルは、キーの異なるタイプにマッピングすることができます。ノーバイナリハッシュ、同じキーのためのより多くの。
ハッシュテーブルは、容易にするために乱れ、ルックアップポイント後のハッシュキー(のLinkedHashMapがポインタを添加した)です。見つけるのは簡単保証範囲を満たすためにバイナリ順。
ハッシュテーブルの有効なデータメモリが比較的小さいために占めてもメモリから言えば、それは、その後、メモリの無駄を拡張を縮小するだけでなく、あまりにも時間の縮小操作の無駄です。
バイナリリリースおよびメモリ内のユニークな自然の利点を拡張。
IDR
AN IDR:UIDと結合マッピングデータのアドレスのいずれかに使用されます。ファイルのパス:/ linuxの/ idr.h含ま
特殊性に起因は、UID:固定された範囲内で構成要素を。通常のバイナリツリー、基数木(Redix)と比較すると、明らかに、より適しています。
IDRとidr_layer:IDRは、2つのデータ構造を持っています
データ構造と類似LIST_HEAD IDR。ツリー全体のためのIDR情報管理。最も重要なの一つは、トップです。それはidr_layerルートノードを指します。
IDR {構造体
構造体idr_layer __rcu *ヒント; / *最後の層* /から割り当てられた
構造体*トップidr_layer __rcu; // IDRトップ(ルート)
int型のレイヤー; / *のみ有効W / O同時変更* /
int型CUR。 / *現在周期の割り当てのためのPOS * /
spinlock_tロック;
INT id_free_cnt、
構造体idr_layer * id_free;
};
idr_layer各ツリーは、各ノードのデータ構造です。各ノード256は、(= 8 IDR_BITS、64ビット)ポインタのアレイを有し、図中のスロットがあります。スロットマップは、素早く、すでに使用中のものへのポインタの配列を見つけるために使用されます。これは、256ビットで構成されています。X番目のポインタのアレイが使用され、次いで、x番目のビットが1に設定されています。
次の層のidr_layerへのポインタの各配列。Idr_layer下位層もその親へのポインタを持っています。
idr_layer {構造体
INTプレフィックス; / *このプレフィックスidr_layer * /のID
INT層とリーフ*距離/からの/ *最初の層
構造体idr_layer __rcu *進[IDR_BITS << 1。]; / *この層8 IDR_BITS = 256ポインタ256 * idr_layer /
INT COUNT; / ZERO *、WE * IT CANリリース/
連合{
/ * A ZERO「ビット手段"宇宙こちら壁紙" * /
DECLARE_BITMAP(ビットマップ、IDR_SIZE); / * *スロット図。 /
構造体rcu_head rcu_head;
};
};
二層のデータ構造を示すIDRであるよう:(ほんの一例)。ARRY UID組成の値にそれぞれ対応する添字。
[1]第ARRY後、アレイ[2]。UID1ので、ポインタは私の愛は、このテキスト・ポインタは、昨日より少し、あなたのためのVALUE1で、マップキー1は0x0102です。
第二の文ARRY後に[255]、配列[0]。したがってUID2、すなわちマップKEY2のは0xFF00であり、値2は、このテキストに少し明日より。ポインタへのポインタです。
文字列=&検索(UID1)+&Lookuo(UID2)ですから。文字列を取得するには
あなたのための私の愛、より昨日より少し少ない明日より少し。