.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
Vistaパソコンのこと日記

これでいいのかVista!

1 Mins read

お盆真っ只中ですが、皆さん如何おすごしですか:roll:
こんな時に働いている人は少ないと思いますが、気になる記事があったのでコメントします。

VistaのUpdateプログラム

ってことで色々有るみたいですが、これまでMSのOSがリリースされるたびに問題があったのは
皆さんも御存知だと思いますが、ここまで酷いのはVistaが初めてではないでしょうか?

ビジネスの世界ではVistaはまだまだ浸透していないのは「安定性」&「下位互換」を求められているからだと
分からないとOSシェアを落としていくことになるでしょう。

Read more
パソコンのこと日記

CPUは並列化に向かう

1 Mins read

@ITに考えさせられる記事が載っていたので一言

最近のCPUは熱問題(電気量)に直面して並列化に向かっているのは皆さんもご存知だと思うが、
その影響でPGが受ける問題といえば???

ムーアの法則で考えられていたプログラムミングだと、遅いプログラムは速い(良いCPU)マシンに
乗せれば速く動くようになると考えられていた。ようするに遅ければスケールアップすればいいと

しかし、これからは1CPU(1Core)自体の高速化は前にも説明したとおり、
電圧問題で期待できないようになってしまったので、複数のCoreで並列処理する方向にCPUは向かっている。

そうすると、並列処理を考えていないプログラム(基本的に今までのもの=非マルチスレッド)の場合、
スケールアップしてCPU上にCore自体何個増えても、動作するときに1つのCoreしか使用しないので、
理論的には早くならない、もしくは遅くなる可能性があると言うこと。

これにはプログラミング方法も影響するが、言語自体(コンパイラー等)の能力にも影響を受ける。
この辺りを意識してプログラミングやマシン環境を考えて設計しないと:razz:

余談だが、CPUだけでなくServer環境も速さを高級な1台のマシンに求めるのでなく、
平凡なマシンを複数台使用するスケールアウトの流れになっているように思える・・・Googleなどもそうしてるらしい。

構築にはもちろん電源環境、占有面積などと相談だけどね。

Read more