エンジョイC026回目仮想記憶4(2020-09-20)

1
ほえほえ@スプシマン @hoehoe1234

エンジョイC 26回目 2020/09/20(日) 仮想記憶演習(仮想記憶から物理アドレスを算出する)のコードレビューを行っています。上部がPARをシュミレートする配列ですね。 pic.twitter.com/HrCQX41dXk

2020-09-22 09:09:55
拡大
ほえほえ@スプシマン @hoehoe1234

この生徒さんは出力の仕方に工夫をされています。64Kを8ページ区切った1ページの下端、上端、下端+1の仮想アドレスを物理アドレスに変換しています。すべてのPARがゼロセットですので仮想アドレスの全ページの出力は0~8191となることが確認できます。エレガントな出力方法ですね。 pic.twitter.com/Qf4D4uTRgL

2020-09-22 09:12:32
拡大
ほえほえ@スプシマン @hoehoe1234

変数名はもう少し工夫したほうがよいですね。難しい概念を表す場合はローカル変数でもある程度長い名前のほうが有効な場合がおおいです。また、p_addrという名前はproc構造体のメンバですので勘違いされやすいですね。コメントはしっかり丁寧にかかれていていいと思います。 pic.twitter.com/M2lSPfxhTf

2020-09-22 09:16:04
拡大
ほえほえ@スプシマン @hoehoe1234

このような処理で難しいのは数と内部表現を混合して使用するために概念、観点がわかりにくくなることでしょうか。上位3ビットという内部表現をPARのインデックスとして使用し、かつ、そのPARがなくなった3ビットを補うという仕組みになっています。内部表現を巧妙に使っているということですね。 pic.twitter.com/5zrG8puykG

2020-09-22 09:18:15
拡大
ほえほえ@スプシマン @hoehoe1234

仮想記憶をやっていますので、windowsの話も少ししてみました。仮想記憶であればwindosアプリも4Gの仮想アドレスを丸々使えるはずですがなぜか半分の2Gしかアプリには割り当てられていません。その中でもヒープは更に半分の1G程度です。どうしてでしょうか?おかしいですよね?

2020-09-22 09:20:04
ほえほえ@スプシマン @hoehoe1234

私はwindowsには詳しくはないのですが、記事を検索してみるとCUPのキャッシュの問題では?と書かれてありました。4Gすべて切り替えるとCUPのキャッシュがすべて外れてしまいますね。これは性能低下を招きます。また、Linuxで4G/4Gモデルがあることも書かれていました。なるほどです。 pic.twitter.com/oSzHA68orj

2020-09-22 09:21:49
拡大
ほえほえ@スプシマン @hoehoe1234

読んでいるOSのコードは随分古いコードなのですが、仮想記憶の仕組みがコードレベルで理解できるのでいろいろな発想の元知識を得ることができますね。スレッドに関しても「ライトウエイトプロセス」っていう観点で、なるほどプロセスのメモリ領域を同じところを割り当てているのか?などと想像できます

2020-09-22 09:23:23
ほえほえ@スプシマン @hoehoe1234

それが実際に正解なのかどうなかは別に、そのような仕組みを知ることにより、洞察力が生まれることが大切ですね。普通の人生では仮想記憶のコードを見ることはありませんが、こういうのを見ると世の中の面白さ、偉大さ、美しさをかんじることができます。

2020-09-22 09:24:31
ほえほえ@スプシマン @hoehoe1234

当塾にはプロの方も参加されているので、「塾の内容、あんまり業務に役立たないと思うけど大丈夫?」って聞いてみると、「今、こういうことをやらないとずっとできない。自分のレベルを上げるにはこういうことをやるしかない」と徹夜開けの目で話してくれました。ちょっと感動してしまいました。

2020-09-22 09:26:04
ほえほえ@スプシマン @hoehoe1234

今回の仮想記憶(仮想アドレス)についての一番のポイントはやはり数をページに分ける感覚でしょうか。PARを3つの部分に分けるといいとおもいます。大ページ(A)、中ページ、小ページ(B)でしょうか。中ページが仮想アドレス上位3ビットを補う役割をしています。この感覚、なかなか難しいですね。 pic.twitter.com/kJVRGNgfmw

2020-09-22 09:29:13
拡大
ほえほえ@スプシマン @hoehoe1234

ちょうど牛本とビット演算等の内容がかぶってよかったです。図右の部分はソースコードの1行ごとにどのような処理をしているのか内部表現を元に生徒さんに説明していただいています。使うと理解に大きな差があるように理解と説明の間もまた大きな差がありますね。このあたりの練習もしていただきます。 pic.twitter.com/w03Lq2GhpY

2020-09-22 09:32:12
拡大
ほえほえ@スプシマン @hoehoe1234

本職以外ではあまり他人に説明をすることがないので、意図的に説明の機会を設けています。自分の理解した内容をどのように伝えるか?どのような図を書いたら理解してもらえるか?自分の言葉で伝えることの重要性と、伝わらないもどかしさを実感していただけるのではないでしょうか?

2020-09-22 09:34:30
ほえほえ@スプシマン @hoehoe1234

このようなコードを読んだり、自分で演習問題を行うとコメントは「なにをやっているのか」を書くのは意味がなく、「どういう意図なのか、どういう構造なのか?」を書かなければ行けないというのが実感できますね。例えば、コメントに3ビットを取得すると書いてもいみはありません。 pic.twitter.com/P8Im8UgYcA

2020-09-22 09:37:46
拡大
ほえほえ@スプシマン @hoehoe1234

「仮想アドレスの上位3ビットをPARの選択のために使用するので13ビットずらして上位3ビットを0~7の数に変換している」のような構造と意図を書かなければいけません。多くの場合、コメントはアルゴリズム、構造、トリック、処理の概要を書くことになるのが理解できると思います。

2020-09-22 09:39:25
ほえほえ@スプシマン @hoehoe1234

定数の命名などです。UNITといった場合は単位であり、これ以外にも ①INDEXを示すのか ②要素数を示すのか ③MAX_XXXX といった場合には①なのか②なのか を意識する必要があります。日本語だと、N番目、N個ですね。概念が違うのでここを間違えるとコードで混乱しがちです。 pic.twitter.com/q0F3Ii5t8a

2020-09-22 09:43:15
拡大
ほえほえ@スプシマン @hoehoe1234

PARnの左から2,3,4ビット目(赤の斜線部分)を仮想アドレスの値と同じにするとどうして仮想アドレスと物理アドレスが同じになるのか?を改めて考えていただきました。このようなケースでは右上にあるのに「質問」を明示的に書いておくとよいです。 pic.twitter.com/YRDV8u58KS

2020-09-22 09:51:44
拡大
ほえほえ@スプシマン @hoehoe1234

PARnの設定で仮想アドレスがどのように物理アドレスに変換されるかの解説です。いろいろなPARのパターンで検証します。大ページ、中ページ、小ページの設定で64バイト単位でどのような物理アドレスにも仮想アドレスがページ単位でマップできることを検証しました。 pic.twitter.com/aIdAD5rP6K

2020-09-22 09:57:23
拡大
ほえほえ@スプシマン @hoehoe1234

クラスと構造体の差がわからない。という質問がありましたので解説してみました。まずはクラスとは?インスタンスとは?の説明からです。同時に重要な概念である参照とポインタの差についても説明しました。 pic.twitter.com/pcGLPuZNRX

2020-09-22 09:59:22
拡大
ほえほえ@スプシマン @hoehoe1234

これは持論なのですが、このようなCS上の概念の説明で比喩などを持ち出すとわけが分からなくなると考えています。実際にクラスとインスタンスはメモリ上でこのようになっており、このような仕組みがある、構造体はこのようになっている。というような「実態に基づく説明」が重要だと考えています。

2020-09-22 10:01:02
ほえほえ@スプシマン @hoehoe1234

OSの解説をやっていてよかったと時間する瞬間ですね。図左はよく見る図解ですが、(a)はスタック上、(b)はデータセグメント、(C)は拡張されたデータセグメント上にあることがすんなりと伝わります。ヒープは拡張されたデータセグメント上の領域のことですね。実態を知ると楽しいです。 pic.twitter.com/vW8z3CauCJ

2020-09-22 10:03:16
拡大
ほえほえ@スプシマン @hoehoe1234

私も随分昔のことなのであやふやなのですが、多分こんな感じかと。関数とメソッドの違いについても解説しました。インスタンスに関連付けられた関数のことをメソッドという理解でよさそうですね。いままで謎だったthisについても疑問がとけたようでよかったです。 pic.twitter.com/kgTsW6wZd2

2020-09-22 10:17:43
拡大
ほえほえ@スプシマン @hoehoe1234

Javaのインスタンスは実際はヒープ上にはインスタンス変数しかありません。どのクラスであるかはJVMがわかるのでインスタンスを参照する変数からメソッドが呼ばれた場合はインスタンスを第一引き数にクラスのコードが呼ばれます。これがthisですね。

2020-09-22 10:19:03
ほえほえ@スプシマン @hoehoe1234

Pythonではこのthisに相当するものをselfとして明示的に指定するようになっています。なので関数がselfを引き数に取るとメソッドですね。また、呼び出しの逆転が起きています。過去のC言語においてはhello_person(構造体)のように関数にデータ構造を渡す手法が一般的でしたが、これを言語内に

2020-09-22 10:20:55
ほえほえ@スプシマン @hoehoe1234

シームレスに言語の枠組みとして組み込んだのがオブジェクト指向ですね。ですから今度はp = new Person()、p.hello()のように「変数側」からメソッドを呼び出せるようになります。この転換が画期的なのは熟練を要する設計が不要になることです。まず枠(名詞)を考えればよいのですから。

2020-09-22 10:22:53
ほえほえ@スプシマン @hoehoe1234

実は参照とポインターの違い、クラスと構造体、またそれらがどのように配置されているかなどは、前者はコンパイラ系の概念、後者はOS系の実装問題でありなかなかに難しいのですが当塾ではこれらのことに真正面から真摯に取り組んでいきたいと考えています。応援よろしくお願いします。 おしまい。

2020-09-22 10:31:36