埋め込まれた面接筆記試験の質問 (9 日目)


序文

この記事では、引き続き、埋め込まれた面接筆記試験の質問について説明します。

1. スレッドの同期方法

1.ミューテックス(ミューテックス)

2. セマフォ(条件変数)

3. リードライトロック(リードライトロック)

4. 条件変数(セマフォ)

5. バリア

2. tcp と udp の違いと適用シナリオ

1. 信頼性: TCP は信頼性の高いデータ送信を提供し、シーケンス番号、確認メカニズム、再送信メカニズム、フロー制御などのメカニズムを使用してデータの整合性と順序を保証します。UDP はコネクションレス型プロトコルであり、データの信頼性を提供しないため、データ パケットが失われたり、順序が狂ったりする可能性があります。

2. 通信方式: TCP は、3 方向ハンドシェイクを使用して接続を確立し、4 方向ウェーブを使用して接続を終了する接続指向のプロトコルです。UDP はコネクションレス型プロトコルであり、各データ パケットは独立しており、接続の確立と切断のプロセスはありません。

3. データ伝送効率: TCP はより信頼性の高いメカニズムを提供するため、確認メカニズムや再送メカニズムなどの伝送プロセスでのオーバーヘッドが増加するため、UDP と比較して伝送効率が低くなります。

4. 伝送特性: TCP は、データの順序と整合性を保証するストリーミング伝送を提供し、ファイル転送、電子メール、Web ブラウジングなど、データの整合性と順序を必要とするアプリケーション シナリオに適しています。UDP はデータグラムの形式でデータを送信し、リアルタイムのオーディオやビデオの送信、オンライン ゲームなど、リアルタイム性の要件が高いアプリケーション シナリオに適しています。

3. 物理メモリと仮想メモリの間の以前の関係

物理メモリは、コンピュータ システム内に実際に存在するメモリ ハードウェアであり、RAM (Random Access Memory) で構成されます。物理メモリは、コンピュータがデータの保存とアクセスに使用する物理的な場所であり、データの直接読み取りおよび書き込み機能を提供します。プログラムとオペレーティング システムは、CPU がデータに直接アクセスできるように、データを物理メモリにロードする必要があります。

仮想メモリは抽象的なメモリ概念であり、プログラムにとっては、連続したプライベート アドレス空間のように見えます。仮想メモリのサイズは、通常、実際の物理メモリよりもはるかに大きくなります。仮想メモリはオペレーティング システムによって管理され、プログラムの仮想アドレスが物理メモリ上の物理アドレスにマップされます。

关系:
仮想メモリは、ページ テーブルを通じてプログラムの仮想アドレスを物理メモリの物理アドレスにマップし、より大きなアドレス空間と便利なメモリ管理機能を提供します。

4. mallocで確保したメモリ空間を初期化しないことによる問題

1. 予測不可能な値: 初期化されていないメモリ空間の値は不確実であり、その内容は以前に使用されたデータの残存値であるか、ランダムなガベージ値である可能性があります。これにより、このメモリ空間を使用するときのこれらの値の動作が予測不能になり、プログラムの不確実性や不安定性につながる可能性があります。

2. セキュリティリスク: 初期化されていないメモリ空間に機密情報 (パスワード、キー、その他の機密データなど) がある場合、この情報はメモリ内にまだ存在しており、悪意によって簡単にアクセスまたは漏洩される可能性があります。これにより、セキュリティ上の問題や脆弱性が発生する可能性があります。

3. 不一致な結果: 初期化されていないメモリ空間がデータ構造の記憶領域として使用される場合、その初期値はデータ構造の不一致や誤った計算結果につながる可能性があります。たとえば、初期化されていない配列を操作すると、結果として不正な値、範囲外アクセス、または配列例外が発生する可能性があります。

为了避免未初始化内存带来的潜在问题,推荐在使用malloc分配的内存空间后,使用适当的方法对其进行初始化。可以使用memset、循环赋值或其他合适的方式将初始值分配给内存空间,确保所使用的内存空间处于已定义和一致状态。

5. 組み込み Linux でのデバッグ方法

1. GDB (GNU デバッガー): 組み込み Linux アプリケーション、カーネル モジュール、ドライバーなどのデバッグに使用できる強力なコマンド ライン デバッガーです。実行時の変数の表示と変更、ブレークポイントの設定、コードのステップ実行、関数呼び出しスタックの再トレースなどを行うための一連のコマンドと関数が提供されます。
GDB を使用してアプリケーションをデバッグする場合は、まずデバッグ情報を含めてターゲット コードをコンパイルし、リンクする必要があります (通常は -g オプションを使用します)。次に、ターミナルで gdb <executable> コマンドを実行して、GDB デバッガーを起動します。デバッガーでは、さまざまな GDB コマンドを使用してプログラムの実行を制御し、変数の値を監視できます。
GDB はリモート デバッグやデバッガ スクリプトなどの機能もサポートしているため、組み込みシステムでのリモート デバッグがより便利かつ柔軟になります。

2. printf デバッグ: コードに print ステートメントを挿入することによって、変数の値、プログラムの実行ステータス、およびその他のデバッグ情報を出力する基本的なデバッグ手法です。これらの出力は、開発者が検査および分析できるようにターミナルまたはシステム ログに表示されます。
組み込み Linux 開発では、開発者は主要な場所に printf ステートメントを挿入して、対象の変数の値やデバッグ情報を出力できます。出力結果を比較することで、コードの正しさを検証したり、プログラムの実行パスを追跡したり、状態の変化を観察したりすることができます。
運用環境で printf を頻繁に使用すると、パフォーマンスに影響し、リソースの消費が増加するため、通常、デバッグの完了後にこれらのデバッグ ステートメントをコードから削除するか無効にする必要があることに注意してください。

3.syslog: syslog は Linux システムのログ メカニズムであり、システムの実行時にデバッグ情報を含むさまざまな情報を記録するために使用できます。組み込み Linux システムは、syslog ライブラリを使用してカスタム デバッグ情報をシステム ログに出力し、システム ログ ファイルを表示してデバッグできます。

4.printk: printk は、printf 関数に似た Linux カーネルの関数で、印刷情報をシステム コンソールまたはログ ファイルに出力できます。組み込み Linux の開発では、カーネル モジュールまたはドライバーで printk 関数を使用してデバッグ情報を出力でき、デバッグやトラブルシューティングに便利です。

5. トレース ツール: Linux カーネルは、システムの動作を追跡および分析するための ftrace やtrace-cmd などのいくつかのトレース ツールを提供します。これらのツールは、システム内のさまざまなソフトウェアおよびハードウェア イベントのシーケンスとタイムスタンプを記録し、問題の特定に役立てることができます。

6. ハードウェア デバッガ: 一部の組み込みプラットフォームは、JTAG または SWD インターフェイスなどのハードウェア デバッグをサポートする機能を提供する場合があります。ハードウェア デバッガと接続すると、組み込みシステムでブレークポイントの設定、レジスタの表示と変更、コード実行の追跡などを行い、ボトムレベルのハードウェア レベルのデバッグを実現できます。

7. 実行時分析ツール: strace や ltrace などの一部の実行時分析ツールは、組み込み Linux システムで使用して、プロセスのシステム コールとライブラリ関数呼び出しを追跡および分析できます。これらのツールは、システム コール エラーやライブラリ関数の不適切な使用を特定するのに役立ちます。

6. ミューテックスロックの簡単な紹介

Mutex Lock は、共有リソースへの相互排他的アクセスを実現するために、マルチスレッドまたはマルチプロセス プログラミングで使用される一般的な同期メカニズムです。これは、常に 1 つのスレッドまたはプロセスのみがロックを保持できるようにすることで共有リソースを保護するメカニズムを提供し、それによって競合状態やデータの不整合を回避します。

7. QT のシグナルとスロット

シグナルとスロットは、オブジェクト間の通信と対話を実装するために使用される Qt フレームワークのメカニズムです。これは、オブジェクトが分離された方法で応答し、相互に対話できるようにするイベントベースのプログラミング パターンです。

8. 標準入出力

Linux では、標準入力 (stdin)、標準出力 (stdout)、および標準エラー (stderr) は通常、特定のファイル記述子によって表されます。対応するファイル記述子のマクロ定義は、<unistd.h> ヘッダー ファイルにあります。

STDIN_FILENO: 標準入力のファイル記述子、通常は 0。
STDOUT_FILENO: 標準出力のファイル記述子、通常は 1。
STDERR_FILENO: 標準エラーのファイル記述子、通常は 2。
これらのマクロ定義を使用すると、ファイル記述子の操作を実行するときや低レベルのシステム コールを使用するときなど、プログラムを作成するときに標準入出力ファイル記述子を明示的に指定して使用できます。

#include <stdio.h>
#include <unistd.h>


int main(void)
{
    
    
    char buf[1024];
    int len = 0;

    len = read(STDIN_FILENO, buf, 1024);

    write(STDOUT_FILENO, buf, len);


    return 0;
}

要約する

この記事ではここで説明します。

おすすめ

転載: blog.csdn.net/m0_49476241/article/details/132239830