より速くメモリを使わない安全なコードを書くために
英語版3rdを使用。
Question
P60 Amdahl's law 改善率
・60%カバーの場合、全体のパフォーマンスを1.25×から1.67×に上げるだけでも、カバー範囲を2×改善する必要がある。
・90%カバーの場合でも、全体のパフォーマンスを4×に上げるには、カバー範囲を6×改善する必要がある。
まとめ
・コンピュータは色んな部品からできている。より早く計算するため、より多く計算するため、色んな手法が生み出された。
・すべての元はビットであり、使う場所によって表現が違う。プログラムはテキストやバイトコードに翻訳される。
・ソースプログラムはプリプロセッサ→コンパイラ→アセンブラ→リンカを経て実行可能プログラムになる。
・CPU(PC, ALU, RegisterFile)とMainMemory, I/ODevice間でBUSによるデータの引き渡しが行われ、プログラムを実行している。(例:HelloWorldをキーボード打ち込み→RegisterFileに登録→DiskにあるファイルをMainMemoryに読み出し→CPUがMainMemoryを読む→グラフィックに出力)。データが何回も移動するので時間がかかる。
・スペースが大きくなるほど読み取りに時間がかかる。つまりRegisterFileは速いけど小さい、MainMemoryは遅いけど大きい。このスピード差を埋めるためのCache技術。RegisterFile用にCacheMemoryを設け、将来使いそうなデータをあらかじめ格納しておく。
・DiskもMainMemoryのためのCacheになる。こうしてより速い、スペースが小さいメモリのためのメモリが用意され、MemoryHierarchyの概念ができる。一般的にRegisterが頂点となり、例:L1→L2→L3(ここまでSRAM)→MainMemory(DRAM)→Disk→RemoteStorage
・Softwareであるプログラムは直接HardwareであるCPUやMainMemory,I/ODeviceにアクセスしていない。実行ステップ間にはOSの制御ステップが差し込まれる。
・OSはAbstractionsと呼ばれる概念でSoftwareとHardwareを結び付け、管理している。ProcessesはProcessor, MainMemory, I/O Devicesからなり、VirtualMemoryはMainMemory, I/O Devicesからなり、FilesはI/O Devicesからなる。
・ProcessはContextSwitchをして複数のタスクを同時にやっているように見せる。切り替え時はKernelCodeが動いている。
・今だとProcess内で複数持つことができるThreadのほうが優先して使われている。複数Threadのほうがデータ共有が簡単でネットワークサーバの要求を満たし、プログラム実行も速い。
・VirtualMemoryはアドレススペースを番号が若い順からプログラムの使用に使い、終わりの方でKernelのVirtualMemoryに使う。
・並列処理。①スレッドレベル並列処理:シングルチップに複数CPUを載せている。それぞれのCPUがL1, L2等のCacheを持ち、L3は共有Chache(図例)。スレッドが複数使える。②Instructionレベル並列処理:パイプ処理。③SIMD並列処理
・Networkもシステムのある一部から見るとI/O Deviceのようなもの。