Skip to content

Week 3: メモリ管理

日程概要

  • Day 1: メモリモデルとメモリレイアウト
  • Day 2: スタックとヒープ
  • Day 3: 動的メモリ管理の詳細
  • Day 4: メモリリークとデバッグ技術
  • Day 5: 実践演習と高度なメモリ管理テクニック

Day 1: メモリモデルとメモリレイアウト

1.1 コンピュータメモリの基本

  • ビット、バイト、ワード
  • メモリアドレスの概念

1.2 Cプログラムのメモリレイアウト

  • テキストセグメント(コード領域)
  • データセグメント(初期化済みデータ)
  • BSSセグメント(未初期化データ)
  • ヒープ
  • スタック

1.3 変数のストレージクラス

  • auto, static, extern, register キーワード
  • それぞれのストレージクラスのメモリ上の位置と寿命

演習

  1. 各ストレージクラスの変数を使用したプログラムの作成と動作確認
  2. メモリレイアウトを可視化する簡単なプログラムの実装

Day 2: スタックとヒープ

2.1 スタックの詳細

  • 関数呼び出しとスタックフレーム
  • ローカル変数のライフサイクル
  • スタックオーバーフローの原因と対策

2.2 ヒープの詳細

  • 動的メモリ割り当ての仕組み
  • フラグメンテーションの問題
  • メモリアロケータの基本概念

2.3 スタックとヒープの比較

  • 使用シナリオ
  • パフォーマンスの違い
  • メモリ管理の責任

演習

  1. 再帰関数を使用したスタックの動作の観察
  2. カスタムメモリアロケータの基本実装
  3. スタックとヒープのパフォーマンス比較実験

Day 3: 動的メモリ管理の詳細

3.1 malloc, calloc, realloc の詳細

  • 各関数の内部動作
  • 適切な使用シナリオ
  • エラーハンドリング

3.2 カスタムメモリ管理

  • メモリプール
  • オブジェクトプーリング
  • アリーナアロケーション

3.3 ガベージコレクション

  • マーク・アンド・スイープアルゴリズム
  • 参照カウンティング
  • CでのガベージコレクションFNの実装の概要

演習

  1. メモリプールを使用した効率的なメモリ割り当てシステムの実装
  2. 簡単なガベージコレクタのプロトタイプ実装
  3. 大規模な動的配列操作のパフォーマンス最適化

Day 4: メモリリークとデバッグ技術

4.1 メモリリークの原因と影響

  • 一般的なメモリリークのパターン
  • メモリリークがシステムに与える影響

4.2 メモリデバッグツール

  • Valgrind の使用方法
  • AddressSanitizer の概要
  • カスタムメモリプロファイラの作成

4.3 メモリリーク防止テクニック

  • RAII (Resource Acquisition Is Initialization) の概念
  • スマートポインタの基本的な実装
  • エラー処理時のリソース解放

演習

  1. 意図的にメモリリークを含むプログラムの作成とデバッグ
  2. Valgrind を使用したメモリリークの検出と修正
  3. 簡単なスマートポインタクラスの実装

Day 5: 実践演習と高度なメモリ管理テクニック

5.1 メモリマッピングファイル

  • mmap 関数の使用方法(POSIX システム)
  • メモリマッピングファイルを使用した高速ファイルI/O

5.2 共有メモリ

  • プロセス間通信のための共有メモリの使用
  • セマフォを使用した同期

5.3 メモリ最適化テクニック

  • データ構造のパッキング
  • アライメントの最適化
  • キャッシュフレンドリーなデータ構造設計

5.4 実践演習:高性能データベースエンジンの基本実装

  • メモリマッピングファイルを使用したデータストレージ
  • カスタムメモリアロケータの使用
  • キャッシュ最適化されたデータ構造の設計

演習

  1. メモリマッピングファイルを使用した大規模ファイル処理プログラムの実装
  2. 共有メモリを使用した簡単なチャットアプリケーションの作成
  3. パフォーマンスクリティカルなアルゴリズムのメモリ最適化

まとめ

  • メモリ管理の重要性と基本原則の理解
  • 動的メモリ割り当ての高度な使用方法の習得
  • メモリリーク検出とデバッグ技術の実践
  • 高性能アプリケーション開発のためのメモリ最適化技術の理解

次週の予告

Week 4では、ビット操作とレジスタレベルのプログラミングに焦点を当て、組み込みシステム開発により近い低レベルプログラミング技術を学びます。