前回(2003/05/06) 情報の記憶 数の表現の例 2 の補数表示 [Point] N bit の記憶装置では、2^N の状態を表現できる この 2^N の状態と、情報の空間の対応関係を決め手いるだけ.. => どのような対応 ( Mapping ) を行うかは、 その応用によって異なる 「正しい」対応というものはない.. # 都合のよいものはある.. 1 to 1 代数構造がある etc.. 1 to 1 さえ、不要な場合がある => 韭可逆圧縮の場合.. (画像..) # 可逆圧縮方式は、実は、 # 常に圧縮されるわけではない # Fax の例 # ここまでは、論理的な話、今日明日は、その実装 ( Hard ) の話 今回(2003/05/13) 「計算機の仕組(その 1)」 計算機を実装するために必要な機能 ( 2 つで良い ) スイッチ 演算機能 => 他の情報の流れを切り換える メモリ 記憶機能 => 情報を何度も取り出せる # 書きこみも必要 i.e. MD ( 磁気 ) [記憶素子] 状態を保持できる ( 一定時間内.. ) # あまり短時間過ぎると困るが... # 結構短くてもよい # DRAM : コンデンサーの放電時間 # 遅延管でも Okey # cf. テレビのブラウン管も Okey # => 過去に例も.. # 月への電波反射を利用する 結局、DRAM/SRAM が勝残った => 小くすることだけ.. 上記の二つがあれば計算機は作れる この二つは、共に半導体で実現されている # 昔は、半導体以外にもある # 真空管 # リレー # 富士通のリレーコンピュータ # => 日大にあった 計算機は、電源を入れると直に動くが、その原理は.. ? プログラムを作った経験はあるが、あれは、どのような仕組で動く ? 例: 100 円電卓 ( 四則演算しかできない電卓 ) と、PC は 何が違うか ? => プログラムを与えることによって振舞いを変ること ができる。 100 円電卓でも、 演算機能 記憶機能 の二つをもっている => 計算機に必要な機能は揃っている.. 電卓では、「演算の手順」を人間が与える 計算機では、その手順も計算機が ( 保持して.. ) 与える => 計算機が発達した理由 # 今の形と違う計算機 # アナログ計算機 (演習室にある) 計算機の歴史 ENIAC : 最初の計算機とされる.. 実は電卓 => 外から配線としてプログラム EDSAC : 最初のストアードプログラム方式 (ノイマン型) ~=> 現在の計算機の原形 ノイマン型の特徴 プログラムとデータが共にメモリにある => プログラムの改変が可能 !! # 一種の「学習機能」?? => だから、便利 ( 計算機が流行る理由 ) # 計算機の起動 ( Boot ) もノイマン型だから.. ノイマン型計算機 データもプログラムも同時にメモリに入れる => この二つの区別がない 時に応じて使いわける Load => Program を Data として扱う Exec => Program を Program として扱う [例] プログラム演習 Editor で編集 Compile 共に Program を Data として利用している 実行形式 ( a.out, *.exe ) 本当に Program として扱う # 自分で新しい言語 / Compiler が作れる => 扱う立場によって、同じ物がデータ だったり、プログラムだったりする # 実行形式でさえ、Data として扱われることが # ある => Debugger == ストアードプログラム方式 (ノイマン型 ) => プログラムがメモリに入っている必要がある。 計算機の構造 ( アーキテクチャ ) +---------------+ | プロセッサ | +---------------+ ^ | v +---------------+ | | | メモリ | | | <=> I/O | | | | +---------------+ (演算はこれだけで Okey) (人間とのやり取りのため) プログラムの実行 ( 1 + 2 -> 3 ) +---------------+ | プロセッサ | +---------------+ ^ | v +---------------+ | C <- A + B | A と B の値を加えてその結果を | (プログラム) | C に入れなさい。 | | |A 1 | --+ |B 2 | --+ |C | <-+ +---------------+ プログラムは、複数の命令から構成されている i.e. 指定した番地からデータを取り出せ 取り出した値を加えろ 計算結果を指定した番地へ保存しろ ... 計算機 ( CPU ) の振舞い ( プログラムの実行 ) 1. (指定した場所にある..) メモリの内容を取り出す フェッチ ( メモリの内容をプログラムとして取り出す ) # データの場合は「ロード」と呼ぶ 2. 命令 ( メモリの内容は単なる bit 列 ) を解読 デコード 3. その命令を実行する ( 4. 次の場所に進む ) 上記の 1 - 4 を繰り返し実行する.. C <- A + B 1) A からデータをもってくる 2) B からデータをもってくる 3) ( 1) と 2 ) でとってきたデータを ) 加算する 4) 結果を C にしまう o 常に、CPU と Memory は Data がいったりきたり Data は本当にいったりきたり Program は片方向 => この振舞いの違いが設計の時に重要な鍵 # 二項演算が多い # => この事実に合せて設計しな # いと効率が悪くなるか # も.. ICache ( Instraction Cache )/ DCache (Data ..) の違い # これは、すでに、メモリにプログラムが入っていた場合の # プログラム実行の仕組 # => 電源 On の時 ( Boot ) は ? # メモリ ( DRAM ) の内容は電源 Off とすると全て失われる # # DRAM はコンデンサなので、電源がないと情報が失われる 計算機は、プログラム無しではなにもできない # 電源 On 直後は、そのプログラムがないので... Boot Strup ( 昔 ) 電源 on 後の開始 => 最初のプログラム ( IPL ) は、手で入れる # bit 単位 メモリアドレス Switch ( Bit 単位で On/Off <=> 0/1 ) 内容指定 Switch Store Switch ( <= 指定した内容を指定した番地に保存 ) => 全部手でやっていてはたまらない 外部記憶装置 (当時は紙テープ) から、必要のプログラムを 呼出すためのプログラム ( IPL )を入力する => これの Step 数を減らす努力が.. (名人芸) Boot Strup ( 今 : 仕組は昔と同じ.. だが IPL は ROM へ..) IPL ( 昔手で入れた.. ) が ROM に内蔵されている。 # ROM : 読み出しのみ # ROM の内容を RAM に Copy して利用.. # => ROM は遲いので... ROM の内容 IPL BIOS => Boot 先等が変えられる。 IPL が HardDisk から OS (Windows/Linux) を起動 # 実際は、もっと複雑 == [Cache の話] メモリキャッシュ ( L2 とか L3 とか.. ) => なぜ、こんなものが必要 ? 今の CPU の速度 (1G Hz) : 10^(-9) sec = 1 ns (ナノセック) DRAM (Memory~ の速度(早いものでも..) : 50n (ナノ) SRAM : 10n CPU が 100Mz 位ならまあ、10n 位なので SRAM で釣合うが.. => 今 CPU では、全然速度が合わない CPU はどんどん早くなる DRAM の速度は早くならない => 全然はやくなっていない DRAM は、コンデンサなので、電位が失われる => リフレシュが必要 => 早くなれない SRAM なら、リフレシュが不要なので早くできるが.. DRAM は 1 トランジスタで実現可能 SRAM は 4 トランジスタで実現可能 SRAM は DRAM に比較し高価 CPU と DRAM の速度差が大きい => 現在の高速な CPU の課題 記憶装置における、容量と速度のトレードオフ => 速いメモリは容量を殖やせない ( 高価になってしまう.. ) # 容量が大きいとアドレッシングも大変 キャッシュ => CPU (速い) と Memory ( 遲い ) の仲立ちを行う 速度 (速い) CPU > キャッシュ> Memory (遲い) 容量 (少い) CPU < キャッシュ< Memory (多い) # 「2-8 の法則」: 全てのものを平等に扱うと割高 キャッシュそのものも更に複数の段階へ.. CPU <=> L1 <=> L2 <=> L3 ... <=> Memory 階層型メモリ構造 => 高速で大容量 Memory に見せかける # もちろん、「見せかけ」に失敗することもある。 #[Remark] 本当は、「計算機概論」でやる内容 == プログラムには必ずバグがある ( 表面化しないだけ.. ) 絶対間違っていないと思っている所が間違っている