二分探索木と平衡二分木との関係は何ですか?
平衡二分木は平衡二分探索木とも呼ばれ、二分探索木のアップグレード版です。二分探索木とは、ノードの左側のすべてのノードがそのノードより小さく、右側のすべてのノードがノードよりも小さいことを意味します。平衡二分木とは、探索木は二分探索に基づいており、ノードの左側と右側の部分木の高さの差の絶対値が 1 を超えてはいけないことも規定されています。
強いバランスの二分木と弱いバランスの二分木の違いは何ですか?
強いバランスの二分木 AVL ツリー、弱いバランスの二分木はいわゆる赤黒ツリーです。
- AVLツリーは赤黒ツリーよりもバランス度が厳しく、同じノードの場合、AVLツリーの高さは赤黒ツリーよりも低くなります。
- 赤黒ツリーにノードカラーの概念を追加
- AVL ツリーの回転操作は、赤黒ツリーの回転操作よりも時間がかかります。
B ツリーと B+ ツリーの違い、MySQL が B+ ツリーを使用する理由
B ツリーの特徴:
- ノードのソート
- ノードには複数の要素を格納でき、複数の要素もソートされます。
B+ツリーの特徴:
- B-treeの特性を持つ
- リーフノード間にポインタがあります
- 非リーフ ノードの要素はリーフ ノード上で冗長です。つまり、すべての要素がリーフ ノードに格納され、順番に配置されます。
MySQL インデックスは B+ ツリーを使用します。インデックスはクエリを高速化するために使用され、B+ ツリーはデータを並べ替えることでクエリの速度を向上させることができ、複数の要素を 1 つのノードに格納できるため、B+ ツリーの高さは異なります。 MySQL では、InnoDB ページは B+ ツリー ノードです。InnoDB ページはデフォルトで 16kb です。したがって、一般に 2 層の B+ ツリーには約 2,000 万行のデータを保存できます。リーフ ノード すべてのデータが保存および並べ替えられ、リーフ ノード間にはポインタがあり、テーブル全体のスキャンや範囲検索などの SQL ステートメントを適切にサポートできます。
epollとpollの違い
- select model: ソケット接続ファイル記述子を格納するために配列が使用されます。容量は固定されており、IO イベントが発生したかどうかを判断するにはポーリングが必要です。
- ポーリング モデル: リンクはソケット接続ファイル記述子の保存に使用されます。容量は固定されていません。IO イベントが発生したかどうかを判断するためにもポーリングが必要です。
- epoll モデル: epoll と poll は完全に異なります。epoll はイベント通知モデルです。IO イベントが発生すると、アプリケーションは IO 操作のみを実行します。poll モデルのようにアクティブにポーリングする必要はありません。
スレッドプールの原理を簡単に説明すると、FixedThreadPoolで使用されるブロッキングキューとは何かご存知ですか?
スレッド プールは、キュー + スレッドを通じて内部的に実装されます。スレッド プールを使用してタスクを実行すると、次のようになります。
- この時点でスレッド プール内の数が corePoolSize 未満の場合、スレッド プール内のすべてのスレッドがアイドル状態であっても、追加されたタスクを処理するために新しいスレッドが作成されます。
- この時点でスレッド プール内の数が corePoolSize に等しいが、バッファ キュー workQueue がいっぱいでない場合、タスクはバッファ キューに配置されます。
- このとき、スレッド プールの数が corePoolSize 以上で、バッファ キュー workQueue がいっぱいで、スレッド プールの数が maxPoolSize 未満の場合、追加されたタスクを処理するために新しいスレッドが作成されます。
- この時点でスレッド プール内の数が corePoolSize より大きく、バッファ キュー workQueue がいっぱいで、スレッド プール内の数が MaximumPoolSize に等しい場合、このタスクはハンドラによって指定された戦略に従って処理されます。
- スレッド プール内のスレッドの数が corePoolSize よりも大きい場合、スレッドが keepAliveTime よりも長くアイドル状態になると、スレッドは終了されます。このようにして、スレッド プールはプール内のスレッドの数を動的に調整できます。
FixedThreadPool は固定長のスレッド プールを表し、最下層は無制限のブロッキング キューを表す LinkedBlockingQueue を使用します。
Synchronized と ReentranLock の違いをご存知ですか?
- Synchronized はキーワードであり、ReetrantLock は Java クラスです。
- Synchronized では自動的にロックとロックの解放が行われますが、ReetrantLock ではプログラマが手動でロックとロックの解放を行う必要があります。
- Synchronized の最下層は JVM レベルのロックで、ReentranLock は API レベルのロックです。
- Synchronized は不公平なロックであり、ReentrantLock は公平なロックか不公平なロックを選択できます。
- 同期ロックはオブジェクトをロックし、ロック情報はオブジェクトのヘッダーに格納されます。ReetrantLock は、コード内の int 型の状態識別子によってロック状態を識別します。
- Synchronized の下部にロックのアップグレード プロセスがあります。
同期スピン ロック、バイアス ロック、軽量ロック、重量ロックがそれぞれ導入され、接触されます。
- バイアスロック: 現在ロックを取得しているスレッドIDをロックオブジェクトのオブジェクトヘッダに記録し、次回再度ロックを取得する場合、スレッドが直接ロックを取得できるようにします。
- 軽量ロック: バイアス ロックからアップグレードされます。スレッドがロックを取得すると、ロックはバイアス ロックになります。2 番目のスレッドがロックを競合すると、バイアス ロックは軽量ロックにアップグレードされます。ロックが軽量と呼ばれる理由軽量ロックの最下層はスピンによって実装され、スレッドをブロックしません。
- スピンを繰り返してもロックが取得されない場合は、ヘビーウェイト ロックにアップグレードされます。ヘビーウェイト ロックはスレッドのブロックを引き起こします。
- スピン ロック: スピン ロックとは、ロックを取得するプロセス中にスレッドがスレッドをブロックしないことを意味します。そのため、スレッドをウェイクアップする必要はありません。ブロックとウェイクアップの 2 つのステップをオペレーティング システムが実行する必要があります。 Spin ロックは、スレッドが CAS を通じて取得する予定のマークです。取得できなかった場合は、ループで取得を続けます。取得できた場合は、ロックが取得されたことを意味します。このプロセスではスレッドが実行されており、比較的多くのオペレーティング システム リソースを使用せず、比較的軽量です。
HTTPS が安全な送信を保証する仕組み
HTTPS は、対称暗号化、非対称暗号化、デジタル証明書などを使用して、データの安全な送信を保証します。
- クライアントがサーバーにデータを送信する前に、最初に TCP 接続を確立する必要があります。TCP 接続が確立された後、サーバーはまず公開キーをクライアントに送信し、クライアントはデータを暗号化した後、サーバーはデータを受信するときに秘密キーを使用してデータを復号化し、非対称暗号化を通じてデータを送信します。
- ただし、非対称暗号化は対称暗号化よりも低速であるため、非対称暗号化を直接データの送信に使用することはできません。そのため、対称暗号化キーを非対称暗号化によって送信し、対称暗号化を使用してリクエスト データを送信することができます。
- ただし、非対称暗号化と対称暗号化だけでは、サーバーがクライアントに公開キーを送信するときに傍受される可能性があるため、データ送信の絶対的なセキュリティを保証するには十分ではありません。
- したがって、公開鍵を安全に送信するにはデジタル証明書が必要です。デジタル証明書は誰もが認める信頼性があり、サーバーがクライアントに公開鍵を送信するときに、公開鍵とサーバー関連情報を使用できます。ハッシュ アルゴリズムを通じてメッセージ ダイジェストを生成します。その後、メッセージ ダイジェストは暗号化され、デジタル証明書によって提供される秘密キーを使用してデジタル署名が生成されます。ハッシュ アルゴリズムを使用してデジタル証明書を形成する前の情報とデジタル署名が結合されます。最後に、デジタル証明書がクライアントに送信され、デジタル証明書を受信したクライアントは、デジタル証明書が提供する公開鍵を使用してデジタル証明書を復号化し、非対称暗号化に使用される公開鍵を取得します。
- このプロセスでは、仲介者がサーバーから送信されたデジタル証明書を傍受したとしても、それを復号して非対称暗号化に使用される公開鍵を取得することはできますが、クライアントはデジタル証明書を偽造してクライアントに送信することはできません。埋め込まれたデジタル証明書は世界的に信頼できます。Web サイトが https をサポートしたい場合は、デジタル証明書の秘密キーを申請する必要があり、仲介者がクライアントによって解析できるデジタル証明書を生成したい場合は、秘密キーも申請する必要があります。より安全です。
この記事の特典として、無料の C/C++ 開発学習教材パッケージ、技術ビデオ/コード、主要メーカーからの 1,000 件のインタビュー質問 (C++ の基礎、ネットワーク プログラミング、データベース、ミドルウェア、バックエンド開発/オーディオなど) を受け取ることができます。およびビデオ開発/Qt 開発/ゲーム開発/Linuxn カーネルなどの高度な学習教材と最適な学習ルート) ↓↓↓↓以下を参照↓↓記事の下部をクリックして無料で入手してください↓↓