Nicotto Town



その例え、おかしくなイカ?

 メモリは机でHDDは本棚。
 わかりやすいけど、近代的なシステムではメモリ管理という観点では正直嘘だと思うんだよね。一次記憶(主記憶)、二次記憶という点では間違っていないと思うけど。
 スワップファイル(ページファイル)は仮想記憶の一部であって、オーバーレイとかそういうレベルで話をするって一体いつの時代の人なんだろう?間違っても一時ファイルじゃないんだけどね。
 人に教える前に自分が勉強する必要があるんじゃないか?仮想メモリって名称も用語としては存在するけど人に教えるには紛らわしいのでどうかと。

 レイヤーが深くなってまじめに説明すると判り難いので簡略化するというのは方針として間違ってないが「違うものを混ぜて語る」のは「解った気になる」だけで「解ってない」し「嘘」だぞ。

 近代的なOSでは仮想記憶という形をとるので、アプリケーションから「リアルなメモリ」を制御するわけじゃない。
 全体を細かく分割し、一覧表の様になったテーブルに使う部分をOSにちょーだいと頼むわけだ。その表には実は予約済みのところなんかも有ったりするわけで、世間の人や、その嘘っぱち説明でイメージされるようにベタには利用されていない。
 それもプロセス単位で自由にもらえるように「見える」様になっている。
 アプリケーションからは「くれ」といった空間がフラットに予約、提供されたように見える。
 OSは実際に実装された空間に対してそのブロックを割り当て、実行させるわけ…なんだけど、「どれでも選んで」といった空間は実は「全て土地があるとは限らない」わけだ。場所が飛び石でも大穴が空いていても「アプリケーションからは要求したように連続して確保されているように見える」のが仕組みの肝だったりするわけだ。

 実行中に未実装などそういう場所があったときに「穴あいてるぜ」とシステムはCPUの肩をたたく。これがページ違反という割り込み。
 で、肩を叩かれたCPUは、見せられた「ページ違反の札」を見ながら予め用意されている手順に従って「空間を割り当て」る。このとき「要らない、重要度が低い」のを一時的にどける場所が「ページファイル(スワップファイル)」だ。
 このファイルもイメージのように連続して使われるわけでもないので、世間のイメージとはちと違う。ベタなファイルとして扱うわけではない。
 つまり「アプリケーションが作りかけを自分でおいとく」一時ファイルと「アプリケーションは自覚していない」ページファイルはぜんぜん違うものなのだよ。
 まぁ、「CPUの肩をベシベシ叩きまくって」間に合ううちはいいのだけど、たまーに穴に落ちちゃうことがある。場合によっては「もっとくれ」といわれるし、「どけた物が要るんだけど」といわれて引っ張り出したりする事もあり、空間を割り当てるだけですまないときには大忙しになる。
 そうすると顔を真っ青にしてギブアップ…なんてことがWindows9xの頃はよくありました。

 実際には色んな仕組みが噛んでいるので「物理的な実装」と「システムとしてみたときのイメージ」って違うんだよね。
 これでも仕組みをずいぶんと省いているし、いくつかの要素が混ざっているのだけど、起動した順番にメモリにみっちり並ぶみたいなイメージ。ましてやそれがファイル単位であるようなイメージは正しくない。
 まぁ、この説明でも、前提となるシステムによっては随分と怪しい。
 というより、一次記憶よりもまえにその空間の持ち主の話をしない時点で順番が間違っているのだよな。
 彼にとってどうだと楽か?がパフォーマンス向上の要であって、手間がかかるほど、遠くにあるほどペナルティーが大きいから。
 二次記憶に追い出されることのペナルティーの発生もその順番じゃわからんし自覚できぬよ。

 と、ただの素人が大きなハテナマークを提示してみる。
 難しいことを難しく語ることは易しく、簡単なことを簡単に語ることも易しい。
 が、難しいことを正しく簡単に伝えることはとても難しい。
 教えた気になりたいだけならそんなことを気にすることは無いし、知った気になりたいだけの時にもどうでもいいことだ。
 でも、本当に知りたいのなら、でっちあげの模型を鵜呑みにしてはいけない。

#日記広場:パソコン/インターネット

アバター
2011/03/05 08:29
初めまして
~(=^・ω・^)ノ☆ おはよぉニャ!

コメント~(=^・ω・^)/ ありがとニャ
OSはVistaです。
窓の杜の中のフリーソフトダウンロードしてみようと思います

(*^^)v
アバター
2011/02/19 22:58
CPUだって、流石にフェッチ、デコード、実行で話は済まなくなっているし、厳密な意味での定義より先に、大まかなブロック図が頭に無ければシステムとしては理解しづらいんじゃないかなぁとは。
CPUってなにって聞かれてデータシートをはいって渡しても引かれるだけだろうしw
そういう意味では、階層化するのは仕方が無いのかもなぁと。

考えることは皆同じってことなんじゃないかと。
精度が足りてないって場合は、「それ以上の精度」が必要なので、実際のソースコードや実装、ドキュメントを当たるほうがそういう人にはいいのだと思う。
齟齬が無く、かつ、関係性を説明するのに骨を折る必要が無い説明が出来るならそれに越したことは無いとは思います。そういう意味では「ポンコツな説明として五十歩百歩」といわれてしまうのは仕方が無いかなぁとは。
言うは安し、行うは難しと。
アバター
2011/02/19 20:47
( ̄∇ ̄;)ハッハッハ
まるでOSI参照モデルみたいだねぇ。
アバター
2011/02/19 19:24
信じるとか信じないというのがこの手の説明では違うのだと思う。
この手のものは「ぼんやり」を提供するもので必ずしも実像を結ばない。
読み手にとって「ぼんやり」で「済む」ものは次を探せばいいが、「不十分」ならばきちんと像を結ぶように前に進んでみるなり、メガネなり使って、対象をきちんと見据えなければいけない。
それ自体が素材になるものと、触媒とはちがうので、それは信じる信じないではなく、「読み取れるものをどう利用、判断するか」なのだと。

で、「そのぼんやり」は「別のもの過ぎない?」っていうのがここでの話。
現状の「大体こんなもの」という「ぼんやり」はこんなところじゃないか?というのが本文。
MMUのTLBのって話が平気な人はそもそもちゃんとした「内側からのドキュメント」で話は済むので、こういう説明自体が要らない。
でも「仮想記憶」の一例が全体であるように認識できるのは問題がありそうなのは確かで、やっぱりこれでもポンコツなんだろうなぁとは。ただ、これをぼんやりにすると肉付けする骨組みを失ってしまうので、構文上の苦肉の策だったりするわけでそれは、「ここの要素の相関関係」の省略のためだったりするのは前述のとおりで、書き直す気は無いのだけど、説明としてはまずいのかもしれないなぁとは。

疑うというより「きちんとその説明の役割と意図、精度を読み取る」のが必要でそれをしないと「足りていないものが見えない」のが問題で、時として「自分で咀嚼吸収したものを再構成して出力してみる」こともまた、確認であると。
そういう意味で「他人の再構成の成果」が「ベタに複製」されるのはおかしかろうと思うし、何で頭に浮かぶイメージが8ビットとか16ビットのそれのままなんだろうなぁと思うわけですが。実際の挙動見てて、あの手の説明で得られるイメージは実際のそれと随分違う気がするわけで、なんで疑問に思わないのかなぁと。

なお、「まともなら」と書いてあるわけで、エラッタの域を越えたゴミは「どんなに数が多かろうとまともじゃない」と思うのですよw
出来たものが仕様で、合致しないならそんなもの「書くのも読むのも無駄」でしかないw
「シラナイホウガシアワセヨネ」って実装は世の中多いのは外から挙動見てても思うことはあるけどもw
アバター
2011/02/19 17:28
>それから、「鵜呑み」にするなと書いてはあるけど「役に立たない」とも「意味が無い」とも書いていないのだよ。
自分で考え、調べ、理解し、「自分に必要な精度は自分で手に入れろ」という話だったりするんだな。
「思考」や「理解」が無いのでは「自分に必要十分か」を判断することすら出来ないということ。
仕様書とか、技術文書が「こんな駄文」なことは「まともならありえない」し。

信じるためには、まず疑え。
疑うためにはまず調べろ。
調べて自分のものにして信じる。
うん、ありだな。

>仕様書とか、技術文書が「こんな駄文」なことは「まともならありえない」し。
あるぞ。あるんだ、あっちゃだめなことが現場には。

_| ̄|○

それが命には関悪分野にあるかどうか分からんけど、
金や情報に関わる分野にはけっこうあるんだ。
…だから、売ってる人や使ってる人ほど妄信できない。
( ̄_ ̄|||) どよ~ん

アバター
2011/02/19 11:59
更に、実装の上では更に小細工や流行があったりするのだけど、ああ、頭いいねぇとか思うことはあっても、理解を遠のかせるだけなら意味は無いので、書かなかったし、実際にはシステム側の小細工もあるので単純化するのはむずかしい。

しっかりと分けるべきものを分けてしまうと、その関連性を意識させることまで考えないといけない。
相関関係が見えないとイメージできないので、その辺りは敢えて混ぜていたりはする。
その辺りも、CPUから話を始めていないので、知っていることを期待できることが少ない。
本当は空間と、物理的なメモリの説明も削ってはいけないんだろうなと。

まぁ、自覚しているものもそうじゃないものもあって、全体の大まかな挙動の理解に障害になるような混ぜ方は出来るだけ避けつつ、だいたいの動きのイメージが出来れば及第点な感じなのだけど、適当に何も見ないで書いたので本気で間違ってるところが無いとも言えないのでその辺りはなんとも。

というか、こんな訪問も少ないところで本気で「教えたいさん」なんてやってられませんてw
それを厳密に出来るほどなら今頃本職だろうしねw
ただ、「おかしくね?」といいながら「代替になるものが無い」のは無責任で言いっぱにもほどがあるだろうとでっち上げたのがそれで、仕事やなにかでやるなら推敲すべきなんだろうと。
でも、訪問者数が見てのとおりで頼まれても居ないのに本気モードで推敲をする気にはならないし、気まぐれにどう説明したら良いかねぇ?という遊びなので、頑張ればもうちょっとマシな話の運びようもあるのかもしれないなぁとは思うけれど。

それから、「鵜呑み」にするなと書いてはあるけど「役に立たない」とも「意味が無い」とも書いていないのだよ。
自分で考え、調べ、理解し、「自分に必要な精度は自分で手に入れろ」という話だったりするんだな。
「思考」や「理解」が無いのでは「自分に必要十分か」を判断することすら出来ないということ。
仕様書とか、技術文書が「こんな駄文」なことは「まともならありえない」し。
アバター
2011/02/19 11:42
なんというか、書きながら迷っていたところだったりはする。

結局取捨選択の問題なんだけど、厳密に分けてしまうと、「たぶんわからない」。
ただ、アブソリュートアセンブラで書く様に頭から尻尾までリニアに繋がった空間をベタに使って、バンク切り替えのようにスワップするイメージって古くないか?おかしくないか?という話。
明らかに挙動と違う傾向を示すし、どうなんだろうなぁと。

マッピングや扱いにはもうちょっと近代的なシステムでは一枚噛んでいて、イメージするような空間ではなくて、アプリ側からはフレキシブルに取り扱われ、それによって、ブロックごとの交換、管理が可能になっていて、移動や管理は全自動じゃなくて「突かれて処理する」って辺りが説明の「精度の妥協点」だったりする。
正直それ以上ならコードも書かず、売られてるもの組み合わせて「作った」とかいって悦に入るなら十分じゃないかとね。
例外的な実装は「調べりゃわかる」ので蛇足と判断したのは書いたときに頭をよぎったので間違いない。
それはOSより上のレイヤーで勝手にやってることで、システム自体がもってるものでもないし、そういう実装が多ければ話は変わるが例外は一般論たりえない。「仮想記憶」を基準に言えばそうなんだけど「システムにおけるメモリ」の話からの派生での話題なので、主題からするとやっぱり蛇足にあたると判断して「あえてきっている」。

厳密な説明としては幾らでも突っ込みどころはあるし、実装にもよるので、「基準にする何か」を規定するかどうかでも迷ってはいる。
本気で知りたいのなら、自分で掘り下げればいいし、精度については迷ったところ。というか「コード書けばわかる」事なら説明する前に「もっとまともなドキュメントで気が付く」と思うのだよね。

そういう「妥協があるから」「難しいことを正しく簡単に伝えることはとても難しい。」という感想と、「自分で考えないと理解に役立たないよ」という締めになってたりするんだよね。
前者なんかは、妥協しまくって書いてみた感想だしね。

主は「そこらに転がってる環境におけるメモリの扱い」なので、「仮想記憶自体」をがんばって説明するのであれば、また話は変わってくる。
アバター
2011/02/19 09:28
話がそれたが、
仮想記憶のメモリページの入れ替えをスワップと呼んだりすることや、
Windowsでの両者の記述の混同などで両者は同一視されやすいけど。


>つまり「アプリケーションが作りかけを自分でおいとく」一時ファイルと「アプリケーションは自覚していない」ページファイルはぜんぜん違うものなのだよ。
OSが提供する仮想記憶についてはアプリケーションが自覚していないというのはまさにその通り。
しかし、
一部のアプリケーション(Adobe制のアプリケーションの一部)は「自前」の仮想記憶を実装している。
もちろんアプリーケションレベルでの個別実装。
扱うデータ種別によってはOS提供の仮想記憶よりパフォーマンスをあげれるようだ。



と、ただの素人がネットで調べた結果で小さな大きなハテナマークを提示してみる。

>が、難しいことを正しく簡単に伝えることはとても難しい。
> 教えた気になりたいだけならそんなことを気にすることは無いし、知った気になりたいだけの時にもどうでもいいことだ。
> でも、本当に知りたいのなら、でっちあげの模型を鵜呑みにしてはいけない。

おれが調べた内容がでっちあげの模型でないことを祈るわ
( ̄∇ ̄;)ハッハッハ
アバター
2011/02/19 09:28

>「違うものを混ぜて語る」のは「解った気になる」だけで「解ってない」し「嘘」だぞ。
>ページファイル(スワップファイル)」だ。

(-_-)ウーム

不連続なメモリ領域をソフトウェアに対して、連続してるように見せる仮装メモリ(をページング方式で実装したもの)と
実メモリ以上にメモリがあるように見せるメモリスワッピングは別概念だぞ。
実際は同時に使われることが多いんだろうけど。
(セグメント方式の話がないのはまぁ現実路線だが)

たとえば、Unixとかではスワップファイル(スワップパーティション)無しで仮装記憶設定可能だし、
Windowsでもスワップファイル用ファイルとページング用ファイルは別物だぞ。
(Widnowsが本当に実装として別ファイルにしているかしらんけど、最低限設定は別)

たとえば、
「Widnwos上でいう仮想メモリ」(実際はスワップファイルのことらしい)を使わない設定をすると、
スワップファイルサイズは0になるがページング用ファイルは0にはならずに、きちんと使用されているぞ。
それは、「Widnwos上でいう仮想メモリ」用ファイルサイズを0に設定しても、
タスクマネージャのパフォーマンスタブで
ページファイルの使用サイズが実装メモリと同サイズ(うちはWindows Vista64bit 32bitはOS認識と同サイズになるのかね?)で表示される。

つまり、Windows(少なくとも手元にあるVistaより後のものは)、
(OS上の表示文字列しての)言葉としてのメモリスワッピングと
仮装記憶(ページング方式)を混同しているくせに、
実装はきちんとわけているわけだ。



月別アーカイブ

2018

2017

2016

2015

2014

2013

2012

2011

2010

2009


Copyright © 2025 SMILE-LAB Co., Ltd. All Rights Reserved.