第7章 コンピュータの仕組み
7.1 コンピュータの基本構成
🖥️ ハードウェアの構成
コンピュータは「入力装置」「処理装置」「記憶装置」「出力装置」の4つの基本要素から構成されています。
コンピュータの5大機能
- 入力機能:キーボード、マウス、センサーからデータを受け取る
- 記憶機能:プログラムやデータを保存する
- 演算機能:数値計算や論理演算を実行する
- 制御機能:プログラムの実行順序を管理する
- 出力機能:処理結果をディスプレイやプリンターに表示する
🧠 CPU(Central Processing Unit)
コンピュータの「脳」として、すべての計算と制御を担当します。
• 制御部:命令を読み取って実行順序を管理する
• 演算部:計算や論理判断を行う
• レジスタ:計算中のデータを一時的に記憶
• キャッシュメモリ:よく使うデータを素早く取り出せる記憶場所
命令実行の流れ(4つのステップ)
メモリから命令を読み込む
2. 解釈
命令の内容を理解し、何をするかを決める
3. 実行
実際の計算や処理を行う
4. 保存
結果をレジスタやメモリに保存する
簡単な計算を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:時間分割で順番に実行
• 優先度スケジューリング:優先度の高い順
プロセス情報
📁 ファイルシステム
ファイルシステムはデータを階層的に組織化し、効率的な保存・検索を可能にします。
主要ファイルシステム比較
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の役割と機能を理解する
✅ 性能評価の指標を学ぶ