ラベル x86 の投稿を表示しています。 すべての投稿を表示
ラベル x86 の投稿を表示しています。 すべての投稿を表示

7/29/2015

キャッシュの話

昔、キャッシュで苦労したことを思い出して、記事にしようと思い立つ。

まず、キャッシュとは何ぞやという話から。

今日のコンピュータシステム、PCやスマホも含め、各々役割を持ったチップ間のデータ転送によって動いています。このうち、根幹を成す構成部品としてはCPU、メモリ、ストレージ(SSDやハードディスク)があり、例えば、特定のアプリケーションを実行しようとした場合、ストレージに沢山保存されているアプリケーションプログラムやデータの中から、必要なものをメモリにロードし、CPUがメモリからその瞬間に処理すべきコードを逐次読み込み、実行するという階層構造になっています。

つまり、ストレージは動作が遅いけども、プログラムやファイル等のデータを沢山保存できる。メモリはストレージほど沢山データを蓄えることはできないが、ストレージよりも高速に動作します。しかし電源を切ると内容は消えてしまう一時的な作業場のようなものです。CPUは高速にプログラムを実行したりデータを計算したりしますが、その瞬間に扱う位の小さなデータしか保持していられない。
この一連の流れを料理に例えるなら、ストレージは食材を保存しておく冷蔵庫、メモリは食材を調理するためのまな板、CPUはコックさんという感じです。


というわけで、CPU、メモリ、ストレージ間で、階層的なデータのやり取りがあるわけですが、その間には著しい動作速度の差があり、コンピュータシステム全体のパフォーマンスに大きく影響しています。どんなにCPUが高性能でもストレージが遅ければ、そこがボトルネックになってしまうわけです。

で、コンピュータは、これだけではなく、様々な速度差のある半導体の集合から成っており、各々の速度差を緩和しようという仕組みがキャッシュなわけです。具体的には、速度差をある程度、吸収する小さな一時記憶を設けるのです。

で、このキャッシュ。動作の仕方に大きく分けて2つの方式があり、今回はこれをまとめておこうという話です。


1. ライトスルー(Write Through)

データを転送する場合、書き込みと読み込みの2方向が発生します。この方式では、よく読み込まれるデータをより高速な記憶媒体に置き、書き込み方向の動作はキャッシュしません。キャッシュはキャッシュラインという単位で扱われ、一度アクセスがあったデータをキャッシュ領域に保持し、同じデータの読み込みがあったらキャッシュ領域から読み込むことで読み込みを高速化します。しかし、キャッシュ領域はより小さいので、使われないデータほど入れ替わっていきます。この入れ替わり方にもいくつかの方式があるのですが、それはまた今度まとめます。


2.ライトバック(Write Back)

この方式では、ライトスルーの動作に加え、書き込みもキャッシュされます。キャッシュラインに書き込み、どっかのタイミング(実装による)で非同期的に、実際の記憶域に書き込みが行われます。パフォーマンス的にはライトスルーよりも良いのですが、これが結構複雑な問題を生みます。つまり、書き込んだ側は、書き込みが終わったと思って処理を進めますが、書き込まれた側は、一時的に記憶しているだけです。実際の記憶域とのデータに差が生まれます。一対多の通信の場合、別の装置が同じ場所のデータを読み込んだ場合に不整合を処理する機構が必要になったり、(これをコヒーレンシとか言う)実際の記憶域に書き込む前に接続が切れたり、電源が落ちた場合に、データに不整合が生じます。なので、話はライトスルーよりも格段に複雑になり、トラブルも起こりやすいです。


今回は、こんなとこです。あと、インテルチップでライトコンバインとかのキャッシュ動作もあったりします。グラフィック系のデータで、一画面分とか、かなりまとまったデータを扱う場合に有効とかなんとか。次はもうちょっと突っ込んだ話を書きたいと思っています。





12/08/2012

x86アーキテクチャを語る 〜ハードウェア編 その1〜

久々に続き書く気になりました。よって書きます。


今日は、ハードウェア構成の歴史的な遷移を語ろうかなと思います。

最近のPCの構成要素はCPU、PCHの2つのチップが中心となる構成になっています。
つい2年くらい前まではCPU、MCH(ノースブリッジ)、ICH(サウスブリッジ)の3チップ構成でした。

でもね、シリコンの集積技術の向上でチップの統合が進んでますが、元祖PC/ATは、もう何チップあるのか数えるのがメンドクサイくらいチップ乗ってます。もうゲジゲジ(DIP)だらけです。

で、例えば、現在はPCHに内蔵されている割り込みコントローラ(8259A)やDMAコントローラ(8237A)、タイマー(8253)、ディスクコントローラは全部別チップだったのです。
CPUの数値演算コプロセッサ(80287)も別チップだし。

今日のポイントはここんとこです。
つまり、当時のチップの互換性を維持してPCHに統合されているんです。そうしないとDOSとかブートローダとか古い仕組みに依存しているソフトは動きませんからね。

当時の設計者が別々のチップを組み合わせてPC/ATを設計したわけですが、これが互換性維持のために約30年もの間、継承されているというわけです。うーーん興味深いですねえ。
なので現在のチップセットでシステム設計とかやってる人は、そこんとこを考慮に入れておくべきです。

例えば割り込みコントローラとか、当時は1つのチップでは事足りなかったので8259Aを2つ使って合計16本の割り込みを扱えるように設計してました。ですが、実はIRQ2はカスケード接続に使っていて、デバイス用には使えなかったりします。
さらに、当時の設計でタイマーはIRQ0とかキーボードはIRQ1とかに繋いでいたので、これを変えると古いソフトが動かなくなるちゅうわけで、現在でも踏襲されていたりします。
で、これがこのまんま現在のPCHに入っています。現在の技術を使えばカスケード接続なんて回りくどいことをせんでも、いくらでもシンプルかつ高機能にできるのに、当時の仕様のまま入ってるんです。

なので、x86でハード見るときは、なんだ、このアホ仕様と思うことも多いと思いますが、そんなときは、古いハード仕様に立ち返って理解して行きましょう。というはなし。
割り込み周りはかなり複雑なのでまたそのうち詳しく語ろうと思います(未定)。


今日はここまでにしときます。なんかいまひとつまとまりに欠ける気もするけど、To Be Continued.
ああ、あと、なんか特定のテーマについて語ってほしいリクエストがあれば優先的に書くかもですので、気軽にコメントください。

10/08/2012

x86アーキテクチャを語る 〜歴史編〜

 さて、まずはx86アーキテクチャの歴史から語るとします。
現在のCPUでも過去の互換性を維持するため、過去のCPUの非効率かつ回りくどい仕様が多くの残っています。
 そのおかげで、最新のCPUでもDOSとかの古いOSが動作するわけですが、その代償として複雑なアーキテクチャとなっています。
 これらは古いCPUの仕様を知らなければ理解に苦しむ部分が多々あるかと思います。そんなわけで、まずx86の歴史的経緯を知っておくことが重要だと思います故、ここから話を始めます。


歴史編



 まずx86はPCの歴史と密接に関わっています。x86の進化の大部分はPCの高性能化のためといっても過言ではありません。 そのルーツは1981年のIBM PCにIntel 8088が採用されたところから始まります。この意思決定は、その後のPCシリーズにx86を採用する第一歩として重要な出来事です。
 8088について簡単に紹介しますと、8086の廉価版で、8086では内部、外部共に16ビットですが、8088は内部16ビット、外部バスが8ビットになっています。

 ちなみに、8086以前は8ビットCPUの8080やその互換プロセッサのZ80とか神話の時代がありますが、まあ、それは主題に対してさほど重要ではないので、まあいっか。

そんで、1983年にIBM PCの後継機PC/XTが発表され、1984年に現在主流となっているパーソナルコンピュータのベースとなったPC/ATが発表されました。このマシンはIntel 80286を搭載していて、このCPUはフル16ビットでプロテクトモードが搭載されていました。(プロテクトモードについては、そのうち詳しく語ります)
 で、そんなことより、重要なのはPC/ATは、なんと仕様が公開されたのです。 これにより、他のベンダーが互換機を作ったり、拡張ボードが豊富になったりと素敵なことになりました。そう、今でもよくPCをPC/AT互換機といったりするのは、そんな経緯からなんですねえ。

 その後、IBMはPC/ATの後継機としてPS/2(プレイステーション2じゃないよ)を発表したんですが、IBMのおじさんたちは、ちょっと欲張ってしまったのか、PS/2では仕様を公開せずロイヤリティー戦略にしたのです。
 それが皮肉にも運命の分かれ道となりました。PS/2は残念ながら、あまり受け入れられず、世の中的にはPC/AT互換機をベースに進化していくこととなりました。

 というわけで、現在のPC、Corei7とかのやつでもなんと、30年も前のアーキテクチャがベースになっていて、PCI Expressだとか、64ビットだとかデュアルコアだとかを後付けして進化してきているのです。しかも互換性をほぼ維持したまま。もう、半端ない辻褄あわせが行われていることは想像に難くないと思います。


今回はここまでにしときます。ちょっとずつ掘り下げていきます。

10/02/2012

x86アーキテクチャを語る 〜はじめに〜

私は、これまでx86アーキテクチャに携わって来ましたが、脳みそがボケる前に情報をブログに残しておこうと思い立ちました。x86系の開発者や、PCマニア諸兄に有益な情報源となれればいいなーと思います。
暇をみてチマチマ書いていこうと思います。途中で挫折したらごめんなさい。


はじめに

x86アーキテクチャはPCの歴史と共に過去の互換性を維持しつつ、時代の要求に応えて進化し続けているアーキテクチャです。

しかしながら、アーキテクチャを理解するにあたって、まとまった情報が不足しているようにも思います。CPUのデベロッパーマニュアルや、データシートは過去から変わっていない基本的な設計思想は知ってる体で書かれていたり、情報の羅列だったりします。これを読みこなすには、それなりに予備知識が必要になってきます。
それにはまず、x86アーキテクチャの歴史を知る必要がありますが、インターネットのない時代に誕生したCPUです。情報源は古い書籍や、御老体方の武勇伝くらいしかありません。
さらに、古い書籍は当然、古いCPUについて書かれていて、現在のCPUの進化した部分の情報はありません。それらを踏まえて理解することは、私のような、三度の飯よりPC好きな方や、ギークさんたちにとっては楽しい作業かもしれませんが、並の開発者の多くは情報量の多さに吐き気を催す可能性大です。

というわけで、私のx86アーキテクチャ探究記的な感じ書いていこうと思います。

能書きはこれくらいにしておきます。