パソコンのこと日記

Unbuffered? Unbuffered ECC?Registered ECC?

1 Mins read

仕事でサーバー君とクライアント君のPCを組むことになったんだけど

最近、作ってなかったから久々に秋葉にいったら時代の流れについていけなかった(汗)
今までも色々PC組んできたけど、復習の意味もかねて覚書!

メモリーには以下の機能がある

1.Unbuffered Or Registered (Buffered )
詳しくはRegistered機能とは?

2.ECC Or 非ECC (ノンパリティーチェック)
詳しくはECC機能とは?

上記の法則ではメモリーは以下の4つに分類される

1.Unbuffered 非ECC
  (通常売り場では記載なし Or Unbuffered)
 
2.Unbuffered ECC
  (通常売り場ではUnbuffered ECC Or ECC付き)
 
3.Registered 非ECC
  (???)
 
4.Registered ECC
  (通常売り場ではRegistered ECC Or Registered)

上記の4つに分類されるのだが、3番のReg付きで非ECCメモリーを筆者は見たことがない
なので基本的には3つになると思われる。

どのような環境で使用されるか?

通常クライアントPCなど多くに使用されているメモリは、Unbufferedで非ECCメモリでOKなことが多い
大部分の人はこのメモリーを使用している。
値段は安

ワークステーション向けのXeon対応マザーボードなどでUnbuffered ECCが使用される場合がある
値段は中

サーバー向けのマザーボードではRegistered ECCが良く使われる。
多くのメモリーを搭載する場合にチェック機能がより重要になってくる
値段は高

消費者としては1本化してほしいものである・・・・:roll:

余談・・・Xeon事情
また、最近はFully Buffered DIMMといわれるメモリーも登場し、DDR2以上のメモリー対応をしている
Xeonなどのマザーボードでは使用され始めている。
値段は激高

ちなみにこのメモリーも分類はRegistered(Buffered) ECCで・・・
パリティチェック(Chipkillという)度合いは従来のECCチェック以上:evil:

Read more
.NETASP.NETパソコンのこと日記

Disposeにてアンマネージドコードとマネージドコードの違い

1 Mins read

前回の続きドス:evil:

前回「Dispose」の実装について記述しましたが

  'クラスのリソースを解放するオーバーロードされた Dispose メソッド。
  'このメソッドは基本クラスの Dispose メソッドおよび Finalize メソッドから呼び出す必要があります。
  Protected Overridable Sub Dispose(ByVal disposing As Boolean)
    If Not Me.disposed Then
      If disposing Then
        ' Insert code to free unmanaged resources.
      End If
    ' Insert code to free shared resources.
    End If
    Me.disposed = True
  End Sub

引数にBuooleanの引数があり、内部If文でTrueとFalseで開放の種類を選別できる形になっていますが、
これの意味を解説しますね。

.NETではCLRという中間言語を使用して管理しています。

しかしWin32APIなど旧来のロジックも記述することが出来るので、開放時のタイミングがNew元が開放するのと
GC任せで開放するのではタイミングにずれが生じ、後者の場合CLR以外の記述がある時に問題が発生する可能性があります。

New元が呼び出す「Public Overloads Sub Dispose() Implements IDisposable.Dispose」内では

全ての開放が出来る「Dispose(True)」で呼び出され

いつ呼び出されるか分からない「Protected Overrides Sub Finalize()」内では

CLRが管理するものだけ開放が出来る「Dispose(False)」で呼び出されているのです。

なので特殊対応しているものでない限りIf外に記述することになるでしょうね:razz:

特殊対応は責任を持ってその都度、後処理が必要になるということですな:cool:

Read more
.NETASP.NETパソコンのこと日記

DisposeとFinalize

1 Mins read

ガベージコレクション(以下GC)の話をしましたが、Classの良い所は前処理と後処理が出来るところだと思いますが、
.NETではFinalizeの実装はされていますが、これはGCのせいで、いつ呼び出されるか分かりません。

そのためプログラマは開放処理を狙って行えない!

メモリーの解放はシカトでもファイルのIOやDBのIOなど後処理をしたいClassが沢山ある:evil:
「Finalize」は外部から意図的にCall出来ないので後処理としてはあまり使えません。

VB6の頃はオブジェクトの開放といえば「Set obj = Nothing」でしたが、.NETでは「obj.Dispose」となりました。
しかし、この「Dispose」くんはControlやFormなどには標準でインターフェイスとして付いてますが、
プログラマが独自にClassを作成するときには明示してあげないと使えません・・・・・:sad:

そこで「Implements IDisposable」を実装して以下のようにしてあげます。

Public Class Class1
  Implements IDisposable
 
  'オブジェクトが破棄されたかどうかを追跡するためのフィールド。
  Protected disposed As Boolean = False
 
  Public Sub New()
  End Sub
 
  Protected Overrides Sub Finalize()
    MyBase.Finalize()
    Dispose(False)
  End Sub
 
  Public Overloads Sub Dispose() Implements IDisposable.Dispose
    Dispose(True)
    'GCに対して自分を解放してくれ!と命令!
     GC.SuppressFinalize(Me)
  End Sub
 
  'クラスのリソースを解放するオーバーロードされた Dispose メソッド。
  'このメソッドは基本クラスの Dispose メソッドおよび Finalize メソッドから呼び出す必要があります。
  Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
    If Not Me.disposed Then
      If disposing Then
        ' Insert code to free unmanaged resources.
      End If
    ' Insert code to free shared resources.
    End If
    Me.disposed = True
  End Sub
 
End Class

ここで出てくる「GC.SuppressFinalize(Me)」はGCからメモリ開放してと御願いしているので、
メモリー開放まで行わない方はコメントでも良いでしょう。

まぁ普通は破棄のタイミングも考えて開発しますからあって、良い処理ですな:wink:

そして「Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)」の中に
開放ロジックを書いてあげて、呼び出し元には必ず「obj.Dispose」を呼んで貰うようにすればOK

VB6の場合「Set obj = Nothing」
 
.NETの場合「obj.Dispose」

「Dispose」が無いものは書かなくても良い=後処理無いのでメモリーの解放はGCに任せる!でもOKだが・・・

やっぱり綺麗に書くことが何事にもプラスに働くはず☆

Read more
.NETASP.NETパソコンのこと日記

ガベージコレクションとは?

1 Mins read

最近、色々な言語をやっていて頭の中がゴチャゴチャしてます(汗)

整理の意味を含めて少しプログラミングの復習をしてましたので覚書ドス:mad:

Subject通り、ガベージコレクションとは?ですが、古くは70年代からの考えらしいです。
メジャーな言語ではJavaに始まり、MSも.NETでこの法則を使っています。

簡単な説明としてはCやC++などではメモリ管理をプログラマーが行っていて
開放を忘れるとメモリーリークなどバグを見つけるのが一苦労な問題が発生します。

たまにC言語だとmallocとかで確保後、シカトしちゃってるのがあるからね:roll:
異常終了時も泣かされました:cry:

このメモリー管理をシステムサイドに任せる機能がガベージコレクションと言われるもので、
プログラマは好き勝手にメモリーを使用して、使い終わっても解放シカト状態・・・・・でも
定期的にメモリークリーンをシステムサイドで行ってくれるありがたい機能:!:

ここに非常に分かりやすく解説が載っているので必読です!

しかし、使ったメモリーを自分で開放しないとは・・・Oldマンとしては世も末だな・・・・

Read more
.NETASPASP.NET日記

Page(Context)オブジェクトを動的継承?

1 Mins read

さてさてASP.NETのお話です:razz:

ASP.NETで開発をしていると良くUI.Pageを継承したクラスを作成しますが、
継承はご存知のとおり多重にはできない。

しかも、Controls.Add追加するなど共通なロジックを入れたい場合はDLL(コンパイル)にしないといけない・・・

できれば簡単にaspxファイルなどにインプリメント系のテキストに記述したソースで、
ProcessのContextをもらえないかな?

と考えたとき・・・・強引?にありました。

Page_Loadなどイベントゲットできる、実行中のthis.Contextを与えてくれる機能が・・・

自身のクラスには「Inherits System.Web.UI.Page」してから

Public Sub New()
  '以前のトレース状態を保存
  Dim blnTrace As Boolean
  blnTrace = Current.Trace.IsEnabled
 
  'IDをセットしトレースをOffでProcessにセット
  Me.ID = "_" & _strTitle
  Me.Trace.IsEnabled = False
  Me.ProcessRequest(Current)
 
  'OldTrace情報を再セット
  Current.Trace.IsEnabled = blnTrace
End Sub

見事にPage_Load(イベント)やRequest(プロパティ)などのリソースを使用できます!

内部動作はと考えると・・・・

Pageを再度呼んでそうで一寸はロスしてそう:roll:

ま、Traceしてみて問題なさそうだからしばらく遊んでみよう!

Read more