高校情報I 実用的デジタル教科書

第7章 コンピュータの仕組み

7.1 コンピュータの基本構成

🖥️ ハードウェアの構成

コンピュータは「入力装置」「処理装置」「記憶装置」「出力装置」の4つの基本要素から構成されています。

コンピュータの5大機能

  • 入力機能:キーボード、マウス、センサーからデータを受け取る
  • 記憶機能:プログラムやデータを保存する
  • 演算機能:数値計算や論理演算を実行する
  • 制御機能:プログラムの実行順序を管理する
  • 出力機能:処理結果をディスプレイやプリンターに表示する

🧠 CPU(Central Processing Unit)

コンピュータの「脳」として、すべての計算と制御を担当します。

CPUの主要な部品:
制御部:命令を読み取って実行順序を管理する
演算部:計算や論理判断を行う
レジスタ:計算中のデータを一時的に記憶
キャッシュメモリ:よく使うデータを素早く取り出せる記憶場所

命令実行の流れ(4つのステップ)

1. 読み取り
メモリから命令を読み込む

2. 解釈
命令の内容を理解し、何をするかを決める

3. 実行
実際の計算や処理を行う

4. 保存
結果をレジスタやメモリに保存する
⚙️ CPU動作シミュレーター

簡単な計算をCPUがどのように処理するかシミュレートしてみましょう:




7.2 メモリシステム

💾 記憶装置の階層

コンピュータには速度と容量の異なる複数の記憶装置があり、階層構造を形成しています。

記憶装置 アクセス速度 容量 コスト 用途
レジスタ 最高速 64bit × 数十個 最高 計算中の値保存
キャッシュ 高速 MB単位 頻繁使用データ
メインメモリ(RAM) 中速 GB単位 実行中プログラム
SSD 低速 TB単位 ファイル保存
HDD 最低速 TB単位 最低 大容量保存

🚀 キャッシュメモリの仕組み

キャッシュメモリは、よく使うデータを素早く取り出せるようにする仕組みです。

キャッシュが効く理由:
時間的な法則:最近使ったデータはまた使う可能性が高い
空間的な法則:使ったデータの近くにあるデータも使う可能性が高い

キャッシュの成功率:
成功率 = キャッシュで見つかった回数 / 全体のアクセス回数 × 100%
📊 メモリアクセス時間計算機



7.2.5 現代のコンピューティングパラダイム

☁️ クラウドコンピューティング

クラウドコンピューティングは、インターネット経由でコンピュータの機能を使えるサービスです。自分のパソコンに何かをインストールしなくても、必要な時に必要な分だけ使えます。

サービスの種類

🖥️ IaaS(コンピュータの基盤を借りる)
  • 提供されるもの:仮想的なコンピュータ、保存場所、ネットワーク
  • 自分でやること:OS、ソフトウェア、アプリの管理
  • :Amazon EC2、Microsoft Azure VM、Google Compute Engine
  • 良い点:自由度が高い、必要に応じて拡張できる、コスト効率が良い
⚙️ PaaS(開発環境を借りる)
  • 提供されるもの:プログラム開発・実行環境、データベース
  • 自分でやること:アプリケーションの開発・管理
  • :Google App Engine、Microsoft Azure App Service、Heroku
  • 良い点:開発に集中できる、自動でサイズ調整、メンテナンス不要
📱 SaaS(完成したソフトを使う)
  • 提供されるもの:完成したアプリケーション
  • 自分でやること:データ入力、設定のみ
  • :Google Workspace、Microsoft 365、Salesforce
  • 利点:即座に利用可能、自動更新、デバイス非依存

デプロイメントモデル

🌐 パブリッククラウド

一般公開されたクラウドサービス(AWS、Azure、GCP)

🏢 プライベートクラウド

企業専用のクラウド環境(セキュリティ重視)

🔗 ハイブリッドクラウド

パブリックとプライベートの組み合わせ

🤝 マルチクラウド

複数のクラウドプロバイダーを同時利用

🌐 IoT(Internet of Things)

IoTは、あらゆる物理的デバイスをインターネットに接続し、データ収集・制御を可能にする技術です。従来のコンピュータの概念を大きく拡張します。

IoTシステムアーキテクチャ

📡 デバイス層(Things Layer)
  • センサー:温度、湿度、光、音、振動、位置情報
  • アクチュエータ:モーター、LED、スピーカー、バルブ
  • マイクロコントローラ:Arduino、Raspberry Pi、ESP32
  • 組み込みシステム:専用OS、リアルタイム処理
📶 通信層(Connectivity Layer)
  • 近距離通信:Bluetooth、Wi-Fi、Zigbee、NFC
  • 広域通信:4G/5G、LoRaWAN、Sigfox、NB-IoT
  • プロトコル:MQTT、CoAP、HTTP/HTTPS
  • ゲートウェイ:プロトコル変換、データ前処理
☁️ クラウド層(Cloud Layer)
  • データ収集:ストリーミング処理、バッチ処理
  • データ保存:時系列データベース、NoSQL
  • データ分析:機械学習、AI、ビッグデータ解析
  • デバイス管理:リモート監視・制御、ファームウェア更新
👥 アプリケーション層(Application Layer)
  • ダッシュボード:リアルタイム監視、可視化
  • モバイルアプリ:リモート制御、通知
  • 業務システム連携:ERP、CRM、SCM統合
  • 自動化:ルールベース制御、AI判断

IoTの実用例

🏠 スマートホーム
  • エネルギー管理システム(HEMS)
  • セキュリティシステム(監視カメラ、人感センサー)
  • 環境制御(エアコン、照明の自動調整)
  • 家電の遠隔制御と自動化
🏭 産業IoT(IIoT)
  • 予知保全(設備故障の事前検知)
  • 生産ライン最適化
  • 品質管理の自動化
  • サプライチェーンの可視化
🚗 コネクテッドカー
  • 運転支援システム(ADAS)
  • 車両診断とメンテナンス
  • 交通情報の最適化
  • 自動駐車システム
🏥 ヘルスケア
  • ウェアラブルデバイス(心拍、歩数監視)
  • 遠隔診療システム
  • 薬物投与の自動化
  • 高齢者見守りシステム

⚡ エッジコンピューティング

エッジコンピューティングは、データ処理をデータ生成源の近くで行う分散コンピューティングモデルです。

エッジコンピューティングの利点

  • 低遅延:リアルタイム処理が可能
  • 帯域幅節約:必要なデータのみクラウドに送信
  • プライバシー保護:機密データをローカルで処理
  • 信頼性向上:ネットワーク障害時も継続動作
  • コスト削減:通信コストとクラウド処理コストの削減

7.3 入力・出力装置

⌨️ 入力装置の種類と特徴

主な入力装置

  • キーボード:文字・数字の入力
    • メカニカル、メンブレン、静電容量式
    • 日本語入力方式:ローマ字、かな、音声認識
  • マウス・トラックパッド:ポインティングデバイス
    • 光学式、レーザー式、静電容量式
    • 解像度(DPI: Dots Per Inch)
  • タッチスクリーン:直接操作
    • 抵抗膜式、静電容量式、電磁誘導式
    • マルチタッチ対応
  • センサー:環境情報取得
    • 加速度、ジャイロ、GPS、カメラ
    • 温度、湿度、気圧センサー

🖥️ 出力装置の種類と特徴

ディスプレイ技術

  • 液晶(LCD):バックライト + 液晶パネル
    • TN、IPS、VA方式の違い
    • 応答速度、視野角、色再現性
  • 有機EL(OLED):自発光素子
    • 高コントラスト、薄型
    • 焼き付きリスク
  • 電子ペーパー:低消費電力
    • E-inkテクノロジー
    • 電子書籍、デジタルサイネージ

解像度と色深度

主要解像度規格:
• HD(1280×720): 921,600ピクセル
• Full HD(1920×1080): 2,073,600ピクセル
• 4K UHD(3840×2160): 8,294,400ピクセル
• 8K UHD(7680×4320): 33,177,600ピクセル

色深度:
• 24bit色(True Color): 16,777,216色
• 30bit色(Deep Color): 1,073,741,824色
• HDR(High Dynamic Range)対応

7.4 オペレーティングシステムの基礎

🖥️ OSの概要と役割

オペレーティングシステムは、ハードウェアとアプリケーションソフトウェアを仲介する基本ソフトウェアです。

OSの主要機能

  • プロセス管理:プログラムの実行とスケジューリング
  • メモリ管理:主記憶装置の効率的利用
  • ファイルシステム:データの組織化と管理
  • デバイス管理:入出力装置の制御
  • ネットワーク管理:通信機能の提供
  • セキュリティ管理:アクセス制御と認証
  • ユーザーインターフェース:GUI/CUIの提供

💾 仮想メモリ管理の詳細

仮想メモリは、物理メモリよりも大きなメモリ空間を提供し、効率的なメモリ利用を実現する重要な仕組みです。

仮想メモリの基本概念

  • 論理アドレス:プログラムが認識するアドレス空間
  • 物理アドレス:実際のRAM上のアドレス
  • ページング:メモリを固定サイズのページに分割
  • セグメンテーション:論理的な単位でメモリを分割
  • スワッピング:メモリとストレージ間でのデータ移動

🔄 ページング機構の詳細

ページテーブル管理:
ページ番号:論理アドレスの上位ビット
オフセット:ページ内の位置
ページフレーム:物理メモリの固定サイズ領域
TLB(Translation Lookaside Buffer):アドレス変換の高速化

ページ置換アルゴリズム:
FIFO:最初に読み込まれたページを置換
LRU(Least Recently Used):最も使用されていないページを置換
Clock アルゴリズム:参照ビットを使用した近似LRU
Working Set:プロセスが頻繁に使用するページ群

仮想メモリアドレス変換の実装例

// 仮想メモリアドレス変換のシミュレーション
class VirtualMemoryManager {
    constructor(pageSize = 4096, physicalPages = 1024) {
        this.pageSize = pageSize;
        this.physicalPages = physicalPages;
        this.pageTable = new Map(); // 論理→物理アドレス変換表
        this.tlb = new Map(); // Translation Lookaside Buffer
        this.freePages = Array.from({length: physicalPages}, (_, i) => i);
        this.pageFaultCount = 0;
        this.tlbHitCount = 0;
        this.tlbMissCount = 0;
    }
    
    // 論理アドレスを物理アドレスに変換
    translateAddress(virtualAddress) {
        const pageNumber = Math.floor(virtualAddress / this.pageSize);
        const offset = virtualAddress % this.pageSize;
        
        // TLBを先にチェック(高速化)
        if (this.tlb.has(pageNumber)) {
            this.tlbHitCount++;
            const physicalPage = this.tlb.get(pageNumber);
            return physicalPage * this.pageSize + offset;
        }
        
        this.tlbMissCount++;
        
        // ページテーブルをチェック
        if (!this.pageTable.has(pageNumber)) {
            // ページフォルト発生
            this.handlePageFault(pageNumber);
        }
        
        const physicalPage = this.pageTable.get(pageNumber);
        
        // TLBに追加(キャッシュ)
        if (this.tlb.size >= 64) { // TLBサイズ制限
            const firstKey = this.tlb.keys().next().value;
            this.tlb.delete(firstKey);
        }
        this.tlb.set(pageNumber, physicalPage);
        
        return physicalPage * this.pageSize + offset;
    }
    
    // ページフォルト処理
    handlePageFault(pageNumber) {
        this.pageFaultCount++;
        
        if (this.freePages.length === 0) {
            // ページ置換が必要
            this.evictPage();
        }
        
        const physicalPage = this.freePages.pop();
        this.pageTable.set(pageNumber, physicalPage);
        
        console.log(`Page fault: Loading page ${pageNumber} to frame ${physicalPage}`);
    }
    
    // ページ置換(簡単なFIFO実装)
    evictPage() {
        const [oldestPage] = this.pageTable.entries().next().value;
        const freedFrame = this.pageTable.get(oldestPage);
        
        this.pageTable.delete(oldestPage);
        this.tlb.delete(oldestPage);
        this.freePages.push(freedFrame);
        
        console.log(`Evicted page ${oldestPage} from frame ${freedFrame}`);
    }
    
    // 統計情報表示
    getStatistics() {
        const totalAccesses = this.tlbHitCount + this.tlbMissCount;
        const tlbHitRate = totalAccesses > 0 ? (this.tlbHitCount / totalAccesses * 100).toFixed(2) : 0;
        
        return {
            pageFaults: this.pageFaultCount,
            tlbHitRate: `${tlbHitRate}%`,
            tlbHits: this.tlbHitCount,
            tlbMisses: this.tlbMissCount,
            allocatedPages: this.pageTable.size
        };
    }
}

// 使用例
const vmm = new VirtualMemoryManager();

// アドレス変換のテスト
const addresses = [0x1000, 0x2000, 0x1040, 0x3000, 0x1080];
addresses.forEach(addr => {
    const physical = vmm.translateAddress(addr);
    console.log(`Virtual: 0x${addr.toString(16)} → Physical: 0x${physical.toString(16)}`);
});

console.log('Statistics:', vmm.getStatistics());

🔄 プロセス間通信(IPC)の詳細

複数のプロセスが協調して動作するために、効率的な通信メカニズムが必要です。

IPC手法の比較

手法 速度 容量 同期 用途
パイプ 高速 小容量 同期 親子プロセス間
名前付きパイプ 高速 小容量 同期 無関係プロセス間
共有メモリ 最高速 大容量 非同期 高速データ交換
メッセージキュー 中速 中容量 非同期 構造化メッセージ
ソケット 低速 大容量 両方 ネットワーク通信

共有メモリとセマフォの実装例

// プロセス間通信のシミュレーション
class SharedMemorySegment {
    constructor(size) {
        this.buffer = new ArrayBuffer(size);
        this.view = new DataView(this.buffer);
        this.size = size;
        this.writeIndex = 0;
        this.readIndex = 0;
    }
    
    write(data) {
        if (this.writeIndex + data.length <= this.size) {
            const bytes = new Uint8Array(data);
            for (let i = 0; i < bytes.length; i++) {
                this.view.setUint8(this.writeIndex + i, bytes[i]);
            }
            this.writeIndex += bytes.length;
            return true;
        }
        return false; // バッファフル
    }
    
    read(length) {
        if (this.readIndex + length <= this.writeIndex) {
            const result = new Uint8Array(length);
            for (let i = 0; i < length; i++) {
                result[i] = this.view.getUint8(this.readIndex + i);
            }
            this.readIndex += length;
            return result;
        }
        return null; // データ不足
    }
}

// セマフォ(排他制御)
class Semaphore {
    constructor(initial = 1) {
        this.count = initial;
        this.waitQueue = [];
    }
    
    async acquire() {
        return new Promise((resolve) => {
            if (this.count > 0) {
                this.count--;
                resolve();
            } else {
                this.waitQueue.push(resolve);
            }
        });
    }
    
    release() {
        if (this.waitQueue.length > 0) {
            const resolve = this.waitQueue.shift();
            resolve();
        } else {
            this.count++;
        }
    }
}

// プロデューサー・コンシューマー問題の解決例
class ProducerConsumerExample {
    constructor() {
        this.sharedMemory = new SharedMemorySegment(1024);
        this.mutex = new Semaphore(1); // 排他制御
        this.empty = new Semaphore(10); // 空きスロット数
        this.full = new Semaphore(0);  // データ数
        this.items = [];
    }
    
    async producer(data) {
        await this.empty.acquire();  // 空きを待つ
        await this.mutex.acquire();  // 排他開始
        
        // クリティカルセクション
        this.items.push(data);
        console.log(`Produced: ${data}`);
        
        this.mutex.release();        // 排他終了
        this.full.release();         // データ追加を通知
    }
    
    async consumer() {
        await this.full.acquire();   // データを待つ
        await this.mutex.acquire();  // 排他開始
        
        // クリティカルセクション
        const item = this.items.shift();
        console.log(`Consumed: ${item}`);
        
        this.mutex.release();        // 排他終了
        this.empty.release();        // 空きを通知
        
        return item;
    }
}

// 使用例
const pc = new ProducerConsumerExample();

// プロデューサー
for (let i = 0; i < 5; i++) {
    pc.producer(`Item-${i}`);
}

// コンシューマー
setTimeout(async () => {
    for (let i = 0; i < 3; i++) {
        await pc.consumer();
    }
}, 100);

⚡ 割り込み処理システム

割り込みは、CPUが現在の処理を一時停止して、緊急度の高い処理を実行するメカニズムです。

割り込みの種類と特徴

  • ハードウェア割り込み:外部デバイスからの信号(キーボード、マウス、タイマー等)
  • ソフトウェア割り込み:プログラムからのシステムコール
  • 例外割り込み:ゼロ除算、不正アドレスアクセス等のエラー
  • NMI(Non-Maskable Interrupt):無視できない最優先割り込み

🎯 割り込み処理の流れ

1. 割り込み発生
ハードウェアまたはソフトウェアから割り込み信号

2. 状態保存
現在のレジスタ値、プログラムカウンタをスタックに保存

3. 割り込みハンドラ実行
割り込みベクタテーブルから適切なハンドラを実行

4. 状態復元
保存した状態を復元し、元の処理に戻る

優先度制御:
割り込み優先度:複数同時発生時の処理順序
割り込みマスク:一時的な割り込み禁止
ネスト処理:割り込み処理中の更なる割り込み

割り込み処理システムのシミュレーション

// 割り込みシステムの実装例
class InterruptController {
    constructor() {
        this.interruptTable = new Map(); // 割り込みベクタテーブル
        this.priorityLevels = 8; // 優先度レベル数
        this.interruptMask = 0; // 割り込みマスク
        this.pendingInterrupts = new Set(); // 待機中の割り込み
        this.currentPriority = 0; // 現在の実行優先度
        this.cpuContext = null; // CPU状態保存
    }
    
    // 割り込みハンドラの登録
    registerHandler(interruptType, priority, handler) {
        this.interruptTable.set(interruptType, {
            priority: priority,
            handler: handler,
            enabled: true
        });
    }
    
    // 割り込み要求の発生
    requestInterrupt(interruptType) {
        const interrupt = this.interruptTable.get(interruptType);
        if (!interrupt || !interrupt.enabled) {
            return false;
        }
        
        // 割り込みマスクチェック
        if (this.interruptMask & (1 << interrupt.priority)) {
            return false;
        }
        
        // 現在より低い優先度は無視
        if (interrupt.priority <= this.currentPriority) {
            this.pendingInterrupts.add(interruptType);
            return false;
        }
        
        this.handleInterrupt(interruptType);
        return true;
    }
    
    // 割り込み処理の実行
    handleInterrupt(interruptType) {
        const interrupt = this.interruptTable.get(interruptType);
        
        console.log(`Interrupt ${interruptType} (priority ${interrupt.priority}) triggered`);
        
        // CPU状態保存
        this.saveContext();
        
        // 優先度更新
        const oldPriority = this.currentPriority;
        this.currentPriority = interrupt.priority;
        
        try {
            // 割り込みハンドラ実行
            interrupt.handler(interruptType);
        } catch (error) {
            console.error(`Interrupt handler error:`, error);
        }
        
        // 状態復元
        this.currentPriority = oldPriority;
        this.restoreContext();
        
        // 待機中の割り込みをチェック
        this.checkPendingInterrupts();
    }
    
    // CPU状態の保存
    saveContext() {
        this.cpuContext = {
            registers: {
                ax: Math.floor(Math.random() * 65536),
                bx: Math.floor(Math.random() * 65536),
                cx: Math.floor(Math.random() * 65536),
                dx: Math.floor(Math.random() * 65536)
            },
            programCounter: Math.floor(Math.random() * 1048576),
            statusFlags: Math.floor(Math.random() * 256)
        };
        console.log('CPU context saved:', this.cpuContext);
    }
    
    // CPU状態の復元
    restoreContext() {
        if (this.cpuContext) {
            console.log('CPU context restored:', this.cpuContext);
            this.cpuContext = null;
        }
    }
    
    // 待機中割り込みの処理
    checkPendingInterrupts() {
        const sortedPending = Array.from(this.pendingInterrupts)
            .map(type => ({
                type,
                priority: this.interruptTable.get(type).priority
            }))
            .sort((a, b) => b.priority - a.priority);
            
        for (const pending of sortedPending) {
            if (pending.priority > this.currentPriority) {
                this.pendingInterrupts.delete(pending.type);
                this.handleInterrupt(pending.type);
                break;
            }
        }
    }
    
    // 割り込みマスクの設定
    setInterruptMask(mask) {
        this.interruptMask = mask;
        console.log(`Interrupt mask set to: 0b${mask.toString(2).padStart(8, '0')}`);
    }
}

// 使用例
const ic = new InterruptController();

// 各種割り込みハンドラの登録
ic.registerHandler('TIMER', 7, (type) => {
    console.log(`Timer interrupt handled - system tick`);
});

ic.registerHandler('KEYBOARD', 5, (type) => {
    console.log(`Keyboard interrupt handled - key pressed`);
});

ic.registerHandler('DISK', 3, (type) => {
    console.log(`Disk interrupt handled - I/O complete`);
});

ic.registerHandler('NETWORK', 4, (type) => {
    console.log(`Network interrupt handled - packet received`);
});

// 割り込みシミュレーション
console.log('=== Interrupt Simulation ===');
ic.requestInterrupt('KEYBOARD');
ic.requestInterrupt('TIMER');
ic.requestInterrupt('DISK');
ic.requestInterrupt('NETWORK');

🔌 I/Oシステムと装置管理

入出力システムは、CPUと外部装置間の効率的なデータ転送を管理する重要なサブシステムです。

I/O制御方式の比較

方式 CPU負荷 転送速度 コスト 用途
プログラムI/O 非常に高い 低速 単純な装置
割り込みI/O 中程度 中速 キーボード、マウス
DMA 低い 高速 ディスク、ネットワーク
チャネルI/O 最低 最高速 最高 メインフレーム

🚀 DMA(Direct Memory Access)の仕組み

DMAの動作原理:
1. 初期化:CPUがDMAコントローラに転送設定
2. 転送実行:DMAコントローラが直接メモリアクセス
3. 完了通知:割り込みでCPUに転送完了を報告

DMAの利点:
• CPU使用率の大幅削減(90%以上の削減も可能)
• 高速大容量データ転送
• マルチタスク性能の向上
• システム全体のスループット向上

DMAシステムのシミュレーション

// DMAコントローラのシミュレーション
class DMAController {
    constructor() {
        this.channels = Array(8).fill(null).map((_, i) => ({
            id: i,
            busy: false,
            sourceAddress: 0,
            destinationAddress: 0,
            transferCount: 0,
            direction: 'read', // 'read', 'write', 'memory-to-memory'
            priority: 0,
            callback: null
        }));
        this.memory = new ArrayBuffer(1024 * 1024); // 1MB メモリ
        this.memoryView = new DataView(this.memory);
        this.transferQueue = [];
    }
    
    // DMA転送要求
    requestTransfer(config) {
        const availableChannel = this.channels.find(ch => !ch.busy);
        
        if (!availableChannel) {
            // 全チャネルがビジー:キューに追加
            this.transferQueue.push(config);
            return null;
        }
        
        return this.setupTransfer(availableChannel, config);
    }
    
    // DMA転送の設定
    setupTransfer(channel, config) {
        Object.assign(channel, {
            busy: true,
            sourceAddress: config.source,
            destinationAddress: config.destination,
            transferCount: config.count,
            direction: config.direction,
            priority: config.priority || 0,
            callback: config.callback
        });
        
        console.log(`DMA Channel ${channel.id} setup:`, {
            source: `0x${config.source.toString(16)}`,
            destination: `0x${config.destination.toString(16)}`,
            count: config.count,
            direction: config.direction
        });
        
        // 非同期でDMA転送を実行
        this.executeTransfer(channel);
        
        return channel.id;
    }
    
    // DMA転送の実行(シミュレーション)
    async executeTransfer(channel) {
        const transferTime = channel.transferCount * 0.001; // 転送時間シミュレーション
        
        console.log(`DMA Channel ${channel.id} starting transfer...`);
        
        // 転送シミュレーション(実際のハードウェアでは並列実行)
        await new Promise(resolve => setTimeout(resolve, transferTime));
        
        // データ転送の実行(簡略化)
        if (channel.direction === 'memory-to-memory') {
            for (let i = 0; i < channel.transferCount; i++) {
                const data = this.memoryView.getUint8(channel.sourceAddress + i);
                this.memoryView.setUint8(channel.destinationAddress + i, data);
            }
        }
        
        console.log(`DMA Channel ${channel.id} transfer complete`);
        
        // 転送完了処理
        this.completeTransfer(channel);
    }
    
    // 転送完了処理
    completeTransfer(channel) {
        // コールバック実行(割り込みハンドラのシミュレーション)
        if (channel.callback) {
            channel.callback(channel.id, 'success');
        }
        
        // チャネル解放
        channel.busy = false;
        
        // キューの次の転送を開始
        if (this.transferQueue.length > 0) {
            const nextTransfer = this.transferQueue.shift();
            this.requestTransfer(nextTransfer);
        }
        
        // システムに転送完了を通知(割り込み)
        this.notifyTransferComplete(channel.id);
    }
    
    // 転送完了割り込み
    notifyTransferComplete(channelId) {
        console.log(`DMA interrupt: Channel ${channelId} transfer completed`);
        
        // 実際のシステムでは、ここで割り込みコントローラに信号送信
        // この例では単純にログ出力
    }
    
    // DMA統計情報
    getChannelStatus() {
        return this.channels.map(ch => ({
            id: ch.id,
            busy: ch.busy,
            transferCount: ch.transferCount
        }));
    }
    
    // システム全体の効率測定
    calculateEfficiency() {
        const busyChannels = this.channels.filter(ch => ch.busy).length;
        const utilization = (busyChannels / this.channels.length) * 100;
        
        return {
            channelUtilization: `${utilization.toFixed(1)}%`,
            activeChannels: busyChannels,
            queuedTransfers: this.transferQueue.length
        };
    }
}

// I/O装置シミュレーション
class IODevice {
    constructor(name, type) {
        this.name = name;
        this.type = type; // 'disk', 'network', 'graphics'
        this.busy = false;
        this.transferRate = this.getTransferRate(type);
    }
    
    getTransferRate(type) {
        const rates = {
            'disk': 150,      // MB/s (SSD)
            'network': 125,   // MB/s (1Gbps)
            'graphics': 500   // MB/s (PCIe)
        };
        return rates[type] || 50;
    }
    
    // デバイス固有のI/O操作
    performIO(operation, dataSize) {
        return new Promise((resolve) => {
            this.busy = true;
            const transferTime = (dataSize / this.transferRate) * 1000; // ms
            
            console.log(`${this.name} ${operation}: ${dataSize}KB transfer started`);
            
            setTimeout(() => {
                this.busy = false;
                console.log(`${this.name} ${operation}: completed`);
                resolve();
            }, transferTime);
        });
    }
}

// 使用例
const dma = new DMAController();
const disk = new IODevice('SSD-0', 'disk');
const network = new IODevice('NIC-0', 'network');

// 大容量ファイル読み込みのDMA転送
dma.requestTransfer({
    source: 0x100000,      // ディスクバッファアドレス
    destination: 0x200000, // メインメモリアドレス
    count: 1024 * 1024,    // 1MB転送
    direction: 'read',
    priority: 5,
    callback: (channelId, status) => {
        console.log(`File read completed on channel ${channelId}: ${status}`);
    }
});

// ネットワークパケット送信のDMA転送
dma.requestTransfer({
    source: 0x300000,      // メインメモリアドレス
    destination: 0x400000, // ネットワークバッファアドレス
    count: 64 * 1024,      // 64KB転送
    direction: 'write',
    priority: 7,
    callback: (channelId, status) => {
        console.log(`Network send completed on channel ${channelId}: ${status}`);
    }
});

// システム効率の監視
setInterval(() => {
    console.log('DMA Efficiency:', dma.calculateEfficiency());
}, 2000);
🖥️ 仮想メモリシミュレーター

仮想メモリアクセスパターンのテスト




⚡ マルチタスクとスケジューリング

現代のOSは複数のプログラムを同時に実行する機能を持っています。

スケジューリングアルゴリズム:
FCFS(First Come First Served):到着順
SJF(Shortest Job First):実行時間の短い順
Round Robin:時間分割で順番に実行
優先度スケジューリング:優先度の高い順
⏱️ スケジューリングシミュレーター

プロセス情報

プロセスA: 実行時間 5秒, 優先度 3
プロセスB: 実行時間 3秒, 優先度 1
プロセスC: 実行時間 8秒, 優先度 2

📁 ファイルシステム

ファイルシステムはデータを階層的に組織化し、効率的な保存・検索を可能にします。

主要ファイルシステム比較

FS OS 最大ファイルサイズ 特徴
NTFS Windows 16TB 暗号化、圧縮、アクセス制御
ext4 Linux 16TB ジャーナリング、高性能
APFS macOS 8EB スナップショット、暗号化
FAT32 互換性重視 4GB 高い互換性、古い規格

7.5 コンピュータの性能評価

📊 性能指標の種類

主要性能指標

  • クロック周波数:CPU動作速度(Hz)
  • IPC(Instructions Per Clock):1クロックあたりの実行命令数
  • スループット:単位時間あたりの処理量
  • レイテンシ:処理開始から完了までの時間
  • FLOPS:浮動小数点演算回数/秒
  • ベンチマーク:標準化された性能測定

⚖️ 性能向上技術

並列処理

並列処理の種類:
マルチコア:1つのCPUに複数の演算コア
マルチプロセッサ:複数のCPUを搭載
GPU並列処理:大量の単純計算を並列実行
分散処理:複数のコンピュータで協調処理

パイプライン処理

命令パイプライン例:
時刻  1  2  3  4  5  6  7
命令1 F  D  E  W
命令2    F  D  E  W
命令3       F  D  E  W
命令4          F  D  E  W

F: フェッチ, D: デコード, E: 実行, W: ライトバック
                

パイプライン化により、4命令を7クロックで実行(非パイプラインでは16クロック)

🚀 性能計算ツール

CPU性能計算





📝 第7章まとめ

理解度確認テスト

問1: CPUの命令実行サイクルの正しい順序は?

問2: 最も高速なメモリは?

問3: OSの主要機能に含まれないものは?

🎯 学習のポイント:
✅ コンピュータの基本構成を理解する
✅ CPUの動作原理を把握する
✅ メモリ階層の特徴を知る
✅ OSの役割と機能を理解する
✅ 性能評価の指標を学ぶ