唐突に気づいたのですが、クラーク像は「札幌じゃなくて北広島にある。」って、色んな人に吹聴した気がする。壮絶な嘘です。クラーク像はどちらも(※1)ちゃんと札幌市にあります。嘘を教えてしまった方々には深くお詫び致します。
無知も良いところでした。今度実家に帰ったとき、ちゃんと見てきた方が良いですかねえ…。
(※1)胸像と全身像があります。胸像は北海道大学(札幌キャンパス、札幌市北区北8条〜24条)に、全身像は羊ヶ丘展望台(北海道札幌市豊平区羊ヶ丘1番地)に建っています。
北広島市と勘違いしていた理由も調べました。クラーク博士がアメリカに帰るとき「Boys be ambitious…」と言って去った有名なエピソード、この舞台が現在の北広島市にあるのです。像とBoys be ambitiousの話とがごっちゃになったようです。
ついでに例のフレーズは「Boys, be ambitious like this old man.」(小供等よ、此老人の如く大望にあれ。)と続く(※2)ことも知りました。
クラーク博士ってばまるで映画の主人公のようですが、歴史が美化されるのはお約束ですから怒っても仕方ないのさ。
(※2)英文および訳文は北海道大学付属図書館W.S.クラーク博士関係文献目録の一部である、こちらのページから引用しました。
グリーンピースがまた犯罪行為してます。目立とうとしすぎて犯罪団体になっています。さすがに拉致、放火、殺人はやらないと信じたいですけど…。とにかく捕鯨船乗組員の安全を祈るばかりです。
そういえばグリーンピース・ジャパンのページを見ると、
Q. 鹿やカンガルーのように鯨も間引くという考えはないのか。
A. 鹿やカンガルーは「捕食される側」の動物だから、間引かれるべき。鯨は「捕食する側」だから間引くのはおかしい。
という問答があります。つまり鹿やカンガルーは多すぎだから逝って良しってことでFAらしい。これが環境保護か。
窃盗までして捕鯨を責める暇と金と時間があるなら、
環境を蘇らせる技術の研究所を世界各地の大学に作って、全面バックアップしました!!
とか、
ど田舎の土地を日本の国土面積の数倍規模でがっつり買い取って、全部環境保護区にしました!!
こんなことをやって欲しいです。一面にこんな見出しが躍ってたら痺れます。
グリーンピースには世界各地の企業、財団からの大量の寄付(うちは環境に配慮してますよ、という姿勢のため)で潤ってるはずなので、資金はあると思います。が、残念ながら、どんなに資金があってもやらないでしょう。グリーンピースがスポンサーを取り続けるには、とにかく目立つしかありませんから、結局は環境なんか二の次で「目立つ(つまり儲かる)こと」を選ぶのです。
また、スポンサー企業を敵に回すような活動はできません。グリーンピース以外にも環境団体はいくらでもありますから、そちらに流れられたら一巻の終わりです。
例えば石油を消費するとCO2が増えて環境に悪いです。しかし石油製品の不買運動なんて運動はさっぱり見かけません。だってそんなことしたら金づ…じゃなかった、石油関連企業からそっぽ向かれますから。
その点、捕鯨反対なら心配ありません。鯨を食べる国は圧倒的に少なく反感を買いませんし、大きな生き物を殺す抵抗感にも訴えられます。さらに日本船が相手なら超ラッキー!機関砲かロケットランチャーぶちこまれるまで反撃しない国ですからね。
カモがネギ背負って鍋担いでガスコンロとボンベにマッチまで持ってるんですから、おいしくいただかない理由はありません。というわけで捕鯨反対はやめられない止まらないのです。
今週一週間で、月の残業時間の半分を使ってしまった。またか、またなのか!
付け方を控えめにしてるつもりなのにねえ…。
所属していた研究室のSkepeチャットで、変なキーボードの話をしていました。聞けばほぼ正方形のスペースキーを搭載した変なキーボードがあると言うではないですか。写真も見せてもらいましたが、本当に正方形です。変なの!
…やややや、まてよ?このキーボードどこかで見たことないか?と思い、会社のメインキーボード(DELL SK-8135日本語配列)を見たら、スペースキーが正方形じゃないですか…。そりゃ見たことあるわけだよ、既に使ってたんだもん。
見た目はかなり変テコですが、使い心地は普通です。スペースキーが小さい分、微妙にデカい無変換キー(普通はAltより細い)を誤打するくらいで、すぐに慣れてしまいます。
このキーボードのおかげなのか、家のキーボードでスペースキーを叩くときもキー一つ分(幅としてはSK-8135の無変換キー分くらい)を無意識に避けて押しています。
今回の日記を書いているときに初めて気づいたので、いつからこうなってたのかはわかりませんけども。
ぜひ皆様にどんなキーボードか見ていただきたくて、型番でGoogle検索したらこんな写真をブログに貼っている人がいました。
うは、まさにこれだ。スペースキーが正方形なのさ。
目次: Linux
以前からLinuxのページディスクリプタ(要はstruct page)って何なの?という疑問が晴れないまま居ました。特に実際のページフレームとの対応をどうやって取っているのかが全くわからん。どこかに対応が書いてあるにしては、それらしい場所がない…。
分からんながらも、機会を見つけては調べたり考えたりしていたら、なんとなーく分かった気がする。
分かった気がすることを書き散らしますが、間違っててもご勘弁下さい。自信ないです。
前提知識として簡単に説明します。Linuxではメモリ領域をゾーンという固まりで管理しています。ゾーンはページフレーム(普通は4KBのメモリ領域)をいくつかまとめた固まりです。ページフレームがずらーっと並んでいるようなイメージ。
厳密にはもっと書くべきことがあるのでしょうが、今回はこのくらいの理解で進めるはず。たぶん。
では本題に入ります。
まず私の疑問点は「ページディスクリプタ(以下、struct page)のポインタをもらったとき、どうやって対応するページフレームを得るのか?」です。
ここでstruct pageのメンバに直接書いてあれば話は早いのですが、struct pageにページフレーム番号を示す情報などはありません。残念。
実はstruct pageは中身も大事ですが、ポインタ値が非常に重要な意味を持ちます。というのも実メモリのページフレームとの対応を取るために、ポインタの計算を行うからです。計算についてはまた説明します。
ページフレームを求めるためには、
ページディスクリプタ -> ゾーン -> ページフレーム
の順に求めます。まどろこしいですが、直接求められないのです。
ページディスクリプタが対応するページフレーム、こいつが属するゾーンを求めます。自分でも何言ってるのかわかんないけど、まあいいや。
まずstruct pageにpage_flags_t flagsというメンバを見ます。こいつはその名の通りページの属性や状態を示すフラグを格納する変数なのですが、上位3ビット(または8ビット)だけは意味が違っていて(※1)、このページが所属するゾーンを表す数値が入っています。
なのでflags >> NODEZONE_SHIFTによってページが何番目のゾーンに所属しているのかがわかります。例えば1だとしたら、ゾーンの配列zone_table[1](グローバル変数)を見ればゾーンの情報が見られます(※2)。
(※1)不思議な設計に見えますが、むやみにメンバを増やすとstruct pageだけで相当量のメモリを圧迫(struct pageはページフレームの数だけ存在する)してしまいます。
(※2)最近のLinuxではゾーンの一覧(zone_table)はグローバル配列ではありません。struct pglist_dataという構造体(ゾーンが必要ならnode_dataというグローバル配列(アーキテクチャ依存)、ゾーンが不要ならcontig_page_dataという変数)経由でゾーンを見るようになっています。ゾーンが要らないというアーキテクチャを考慮したのでしょう。
長くなってきましたが、本題のページフレームの求め方に行きます。先ほど苦労して求めたゾーンにはzone_mem_mapというメンバが居て、ゾーンに属するstruct pageの一覧を持っています(※3)。
上の絵で注目して欲しいのはzone_mem_mapと、ページディスクリプタのポインタ(pとします)がわかれば、zone_mem_mapの何番目にpが存在しているかわかるということです。上の絵では5番目に位置しています。
薄い水色の四角内で具体的な数値(数値は適当ですが)を当てはめてpのアドレスからzone_mem_mapのアドレスを引くことで、pがzone_mem_mapの何番目にいるか求められる様子を示しています。
これでstruct pageがゾーンの先頭から何番目のページなのかがわかりました。あとはページフレームを求めるだけです。ゾーンの構造体のメンバzone_start_pfnがゾーンの開始ページフレーム番号を表しているので、そこへ先ほどの数字(5)を足します。
これにてstruct pageと対応するページフレームが求められました。
もし物理アドレスに興味があるのならば、ページフレームの番号にページフレームのサイズ(普通は4KBのはず)を掛けてあげればよいです。
高位メモリや非連続なメモリモデルを持つアーキテクチャだと、単純に掛けるだけではダメかもしれません。
(※3)最近のLinuxにはありません。恐らくzone_pgdat->node_mem_mapが等価だと思われます。たぶん…。
有給をとって休みました。お休みを病欠で消費するとすごくもったいない気がするのです…。
上の一文をどこかで見た気がすると思ったら、去年の6月11日(2007年6月11日の日記参照)にも風邪で有給を取って休んでいて、同じようなこと書いていました。ああ、進化してない。
昔からこの時期(4月末〜5月末)はほぼ確実に風邪を引いている。時期に何か秘密があるのかなあ?季節の変わり目にしては遅いような気がするんだけど。
熱は下がったけど、喉がヤバいことに変わりなし。起きている間に良化 -> 寝ている間に悪化を繰り返しているみたい。部屋の空気が乾燥しているとかかなあ?
昨日はご飯食べるの忘れてたので、今日はきちんと食べました。
おとなしく寝てました。熱もあるんだろうけど、鼻〜喉がヤバい。焼け付くような感じがする。
5/7にWindows XP SP3がリリースされました。デスクトップに早々とインストールしたものの、ノートのことをすっかり忘れていました。
これまた寝る前に始めたのが良くなかった。朝までノートを動かす羽目になりました。寝るときノートの液晶画面が眩しい、かといて閉じるとスリープする…とお悩みの方。スリープしないよう設定変更するのも手ですけど、単に輝度を最低に落とすだけでも割と良い感じですよ。
会社でもSeaMonkeyを使っています。通常のブラウジングには苦労しませんが、会社の変なシステムがIE6専用でして、全く動きません。しかもやたら別ウインドウを開きたがる悪い癖のあるシステムなのでウインドウだらけになる。IE系のタブブラウザでも動くかなあ、動くようなら導入しようかな。
5/6から引きずってた風邪がここにきて悪化してきた。頭がガンガンする。飲み会に行きたかったけど、諦めて寝よう。
Windows XP用のメイリオフォントが公開されたので入れてみたら、IT Mediaのビジネスニュースサイト Business Media誠の表示がメイリオで出るようになってしまった。見づらい。
調べたら、スタイルシートでフォントが指定("メイリオ","Hiragino Kaku Gothic Pro","ヒラギノ角ゴPro W3","MS Pゴシック",Osakaの順だった)されていたためでした。今までは優先度4の MS Pゴシックが選ばれていたのに、メイリオを入れたことによって優先度1のメイリオが選ばれるようになったわけです。
Webページでフォント指定するなよ、全くもってダサイな…。SeaMonkeyの設定で、Allow documents use other fontsをOFFに、ついでにMinimum Font Sizeも10くらいに上げておきました。ん、見やすい見やすい。
いつからか我が家のVAIO type Gのファンがぶんぶん回りっぱなしになっています。冬の間は「うるせえなあ…」と思う程度で済んだのですが、改めて本体を触るとかなり熱い。
これから夏を迎えるに当たって温度が心配になってきましたので、原因を探ってみました。
さて負荷をどうやって調べるかが問題です。ファンがブンブンしている状態でタスクマネージャを見ても0% のままで、負荷がかかっているのかすらわかりません。というわけで 1秒おきにrdtsc命令を発行し、その差分を表示するプログラムを書き(※)ました。
このプログラムが表示する値を理解するには、まずCPUの動作周波数がどうやって決まるか、rdtsc命令の返す値は何を表すか、を説明しなければなりません。付け焼き刃の知識で頑張って説明します。
(※)本来なら自分で書かなくても、Crystal CPUIDのReal Time Clock表示機能を使うべきです。しかしCrystal CPUIDは無駄に表示が凝っており、表示の負荷でシステムクロック周波数が上がる(rdtscの変化分が300MHzくらいまで)本末転倒状態だったので、没にしました。
まずCPUバスクロック(CPU <-> ノースブリッジバス)の説明から入ります。CPUバスクロックはシステムバスクロックの半整数倍です。VAIO君の場合はシステムクロック = 133MHz、CPUバスクロック = システムクロック(133MHz)x 4倍 = 533MHzのようです。
システムクロックはマザーボード上の水晶振動子(安い10MHz〜30MHzくらい?)を原発振としたPLL(Phase Locked Loop)で供給されます。PLLって何?と聞かれても詳しくは知らんので勘弁して下さい。
CPUバスはIntelの伝統でFSB(Front Side Bus)と呼ばれ(※)ますが、今回はCPUバスで通します。
ノースブリッジにはメモリコントローラが載っていてSDRAMが繋がっています。比較的高速のバス(AGPバス、PCI-e x16バス)などをノースブリッジに繋げることが多いようです。
ノースブリッジの先にはサウスブリッジが居て、PCIバス、PCI-e x1, x4バスなど、比較的低速のデバイスを繋ぐことが多いようです。
CPU <- (1) -> ノースブリッジ <- (2) -> サウスブリッジ
| | (PCIバス)
DDR SDRAM PCIデバイス
(1) FSB(Front Side Bus, Intel系), HyperTransport(AMD系)
(2) DMI(Direct Media Interface, Intel系), HyperTransport(AMD系)
別にこの2つでなければならないことはないです。
他の方式で接続するシステムも有るはず。
重要な点として、(1)、(2) のクロックとDDR SDRAMやPCIのクロックは全て同期しています。でないとデータのやりとりができないからだと思うんですが…。
そのためCPUバスと同様に、システムクロックから生成したバスクロックを用います。PCIバスだと33MHzを欲しがるので、システムクロック133MHz x 1/4 = 33MHzとします。
(※)"Front" Side Busに対して "Back" Side Busもあるのか?
BSBもあります、いや…ありました。BSBはCPU <-> 2次キャッシュのバスです。しかし最近はCPUに2次キャッシュも混載されているのでBSBは不要です。ですから「最近のシステムにはありません」という方が正しそう。
rdtsc命令とはCPU内部のタイムスタンプカウンタを読み出す命令です。Core系以前のCPUではrdtscのカウントアップ周波数 = CPU動作周波数でしたので、SpeedStepなどで倍率を変化させるとrdtscの増分も変化していました。しかしCore系では常に一定の周波数(Core Solo 1500Uの場合は最大動作周波数1330MHz)でカウントアップされます。
(hdk氏、ご指摘&情報提供ありがとうございます)
つまり、
過去のCPU: システムクロックx動作倍率(可変)
Core系: システムクロックx一定値
です。
じゃあ最初に書いたrdtscを見るプログラムって意味無くね?と思うのはまだ早いんだ、これが。
VAIO上で先ほどのプログラムを使ってrdtscの増分を見ると、システムの負荷によって変化します。rdtscの増分はシステムクロックx一定値、のはずですから、変化しているのはシステムクロック側と予想されます。
システムクロックを上げれば茨の道のオーバークロック(※)ですが、下げる方向に使えば省エネです。VAIOではCPUの省エネ機能(Enhanced SpeedStep)に飽きたらず、システムクロックも下げさらに省エネしようという設計なのでしょう。
(※)規定値よりシステムクロックを上げることをオーバークロックといいます。今までの説明からも類推できるように、システムクロックをメチャクチャ上げるとCPUバスクロック、さらにはPCIバス(1/4倍 = 33MHz)やAGPバス(1/2倍 = 66MHz)まで上がり、いずれバスに繋がっているデバイスの許容値を超えて異常動作したり動作しなくなります。
この問題の解決にはシステムクロックと周辺バスクロックの比率を変える必要があります。オーバークロックを売りにしているマザーボードだと比較的柔軟みたいです。
システムに負荷をかけると、システムクロックが最大値に張り付いてrdtscの増分も最大値である1330MHzに張り付きます。負荷が低いと50MHz程度(※)まで落ちます。
さて、今のVAIOを見ると 1330MHzに張り付きっぱなしです。ファンがずっとブンブンしているのはこのせいでしょう。
ファンのスピードはシステム負荷に連動しているようなので、rdtsc値の増分を下げる方向 = システムクロックを下げる方向へ改善することで「ファンがブンブン言う問題」は解決すると思われます。VAIOがシステム負荷をどうやって測定しているのかまではわかりませんでした。
(※)負荷が低いときはCPU内部動作周波数倍率は6.0倍まで落ちますので、rdtscカウンタの増分x 6/10が本来のシステムクロックです。まあ、その辺の細かい値は今回どうでもいいので、高い、中間、低い、くらいが見えればOKです。
というわけで犯人捜しです。片っ端からケーブルを引っこ抜いてみると、USB HDDを引っこ抜いた段階で50MHzくらいまで下がりました。犯人はこれかあ。手始めに、デバイスの取り外しで無効化してみたものの全く負荷が下がりません。
USB 2.0コントローラが有効な状態で一度USB HDDを認識させてから、USB 2.0コントローラ(Intel USB2 EHCI)を無効にすることで、USB 1.1の機器として再認識させると、負荷が下がりました。
これで解決ですね……って、こんなん毎回やってられんよ。面倒くさくて死にそう。
ひょっとするとHDDケース(センチュリーのやつだった気がする)がおかしいのかもしれません。こやつは Windows XPの起動時に電源ONだと100%BoDするという、怪しさ爆発デバイスです。
というわけで別のUSB HDDを繋いで、再度実験。やはり負荷が上がってダメです。さらに手持ちのデバイスで実験。
うーむ、どうもUSB Mass StrageがNGっぽいですね。WindowsのUSB EHCIドライバか、USB Mass Strageドライバのどちらかが常に負荷をかける作りになっているんでしょうか?これはノートPCの設計者に優しくない作りだなあ…。
まとめといた。
< | 2008 | > | ||||
<< | < | 05 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
合計:
本日: