Forum: PC-Programmierung MemoryMappedFiles und Garbage Collector im .NET


von Peter (Gast)


Lesenswert?

Hi,

ich brauche ein MMF in meiner C# Anwendung, dass die ganze Zeit über im 
Speicher bleibt.

Kann man dem Garbage Collector irgendwie ein Schnippchen schlagen?

Gruß Peter

von Peter II (Gast)


Lesenswert?

Peter schrieb:
> Kann man dem Garbage Collector irgendwie ein Schnippchen schlagen?

bist du sicher das er sich überhaupt darum kümmert?

von bubu (Gast)


Lesenswert?

Naja, du musst nur das Programm forken. Solang du das geforkte Programm 
offen hälst, sollte dein file im RAM bleiben.

von Thomas (Gast)


Lesenswert?

Klar, Du kannst Speicherbereiche sperren. Sorry mir fällt grad nicht die 
genaue Methode ein. Schau mal unter Byte Array und Pointerzugriff.

Gruß
Thomas

von Peter II (Gast)


Lesenswert?

bubu schrieb:
> Naja, du musst nur das Programm forken. Solang du das geforkte Programm
> offen hälst, sollte dein file im RAM bleiben.

was hat forken mit einem MemoryMappedFiles zu tun?

Wenn du eine Referez auf den Speicher hast dann wird er auch nicht vom 
GC entfernt, wenn du keine Referenz mehr hast kannst du ihn auch nicht 
mehr ansprechen. Ich versteht das Problem nicht.

von Udo S. (urschmitt)


Lesenswert?

Peter schrieb:
> ch brauche ein MMF in meiner C# Anwendung, dass die ganze Zeit über im
> Speicher bleibt.

Definiere "die ganze Zeit".
Laufzeit des Programms?
Laufzeit mehrerer Instanzen des Programms.
Laufzeit mehrerer unterschiedlicher Programme, die auf dieses MMF 
zugreifen.

Allgemein: Solange ein Programm ein Handle auf dieses MMF hält wird das 
MMF wohl nicht weggeworfen.
Ich denke auch (weiss es aber nicht) daß die Verwaltung von MMFs vom 
Betriebssystem und nicht vom GC von C# gemacht wird.

von Peter (Gast)


Lesenswert?

>bist du sicher das er sich überhaupt darum kümmert?
Nein, bin ich nicht :) ABER

>Klar, Du kannst Speicherbereiche sperren. Sorry mir fällt grad nicht die
>genaue Methode ein. Schau mal unter Byte Array und Pointerzugriff.
In den Beispielen wird das mit
1
void OpenMMF()
2
{
3
   using
4
   {
5
      //Hier sind die MMF's sicher
6
      ...
7
   }
8
}

gemacht. Aber wie soll das gehen? Sobald ich die Funktion verlasse hört 
auch mein 'using'-Bereich auf?

>Naja, du musst nur das Programm forken. Solang du das geforkte Programm
>offen hälst, sollte dein file im RAM bleiben.
Was heisst 'forken'?

>Wenn du eine Referez auf den Speicher hast dann wird er auch nicht vom
>GC entfernt, wenn du keine Referenz mehr hast kannst du ihn auch nicht
>mehr ansprechen. Ich versteht das Problem nicht
1
class Test 
2
{
3
   MemoryMappedFile m_mmf;
4
5
   Test() 
6
   { 
7
      m_mmf = MemoryMappedFile.Create("testmap");
8
   }
9
}

Das heisst also, wenn ich das so mache, dann wird mir da nichts 
'wegoptimiert'? Mein m_mmf ist durchweg gültig? Aber warum wird dann 
immer mit 'using' gearbeitet?

Gruß Peter

von Peter II (Gast)


Lesenswert?

Peter schrieb:
> Sobald ich die Funktion verlasse hört
> auch mein 'using'-Bereich auf?

hast du dir überhaupt mal durchgelesen wofür using da ist?

http://msdn.microsoft.com/de-de/library/yh598w02%28v=vs.80%29.aspx


Damit kann man sicherstellen das danach wieder aufgefäumt wird. Wenn du 
das nicht brauchst dann weil das das objekt global anlegst dann ist doch 
gut. Das ganze hat wenig mit dem GC oder mit dem optimerer zu tun. Es 
ist nur ein hilfsmitel damit bei einer exception nicht vergessen wird 
das dispose aufzurufen.

von Peter (Gast)


Lesenswert?

Ich komme von der Win32 API und hab da noch ein paar Verständnisprobleme 
mit der 'managed'-Geschichte, deshalb frag ich ja.

Aber ich glaube jetzt hab ich es verstanden:
>hast du dir überhaupt mal durchgelesen wofür using da ist?
Mit 'using' wird sichergestellt, dass während eines Zugriffs auf das MMF
nicht die Daten im Speicher verschoben werden.
>Wenn du das nicht brauchst dann weil das das objekt global anlegst dann ist
>doch gut.
Und die Gefahr, dass das MMF gelöscht wird, existiert nicht.

von Peter II (Gast)


Lesenswert?

Peter schrieb:
>>hast du dir überhaupt mal durchgelesen wofür using da ist?
> Mit 'using' wird sichergestellt, dass während eines Zugriffs auf das MMF
> nicht die Daten im Speicher verschoben werden.

wo hast du den satz her? Diese funktion von using ist mir bis jetzt 
nicht bekannt und auch irgendwie unglaubwürdig.

Forum: PC-Programmierung MemoryMappedFiles und Garbage Collector im .NET

Forenliste | Threadliste | Neuer Beitrag | Suchen | Anmelden | 
Benutzerliste | Bildergalerie | Hilfe | Login
MemoryMappedFiles und Garbage Collector im .NET
Autor: Peter (Gast)
Datum: 04.05.2012 15:40

Hi,

ich brauche ein MMF in meiner C# Anwendung, dass die ganze Zeit über im
Speicher bleibt.

Kann man dem Garbage Collector irgendwie ein Schnippchen schlagen?

Gruß Peter

Re: MemoryMappedFiles und Garbage Collector im .NET
Autor: Peter II (Gast)
Datum: 04.05.2012 15:49

Peter schrieb:
> Kann man dem Garbage Collector irgendwie ein Schnippchen schlagen?

bist du sicher das er sich überhaupt darum kümmert?

Re: MemoryMappedFiles und Garbage Collector im .NET
Autor: bubu (Gast)
Datum: 04.05.2012 15:49

Naja, du musst nur das Programm forken. Solang du das geforkte Programm
offen hälst, sollte dein file im RAM bleiben.

Re: MemoryMappedFiles und Garbage Collector im .NET
Autor: Thomas (Gast)
Datum: 04.05.2012 15:49

Klar, Du kannst Speicherbereiche sperren. Sorry mir fällt grad nicht die
genaue Methode ein. Schau mal unter Byte Array und Pointerzugriff.

Gruß
Thomas

Re: MemoryMappedFiles und Garbage Collector im .NET
Autor: Peter II (Gast)
Datum: 04.05.2012 15:52

bubu schrieb:
> Naja, du musst nur das Programm forken. Solang du das geforkte Programm
> offen hälst, sollte dein file im RAM bleiben.

was hat forken mit einem MemoryMappedFiles zu tun?

Wenn du eine Referez auf den Speicher hast dann wird er auch nicht vom
GC entfernt, wenn du keine Referenz mehr hast kannst du ihn auch nicht
mehr ansprechen. Ich versteht das Problem nicht.

Re: MemoryMappedFiles und Garbage Collector im .NET
Autor: Udo Schmitt (urschmitt)
Datum: 04.05.2012 16:00

Peter schrieb:
> ch brauche ein MMF in meiner C# Anwendung, dass die ganze Zeit über im
> Speicher bleibt.

Definiere "die ganze Zeit".
Laufzeit des Programms?
Laufzeit mehrerer Instanzen des Programms.
Laufzeit mehrerer unterschiedlicher Programme, die auf dieses MMF
zugreifen.

Allgemein: Solange ein Programm ein Handle auf dieses MMF hält wird das
MMF wohl nicht weggeworfen.
Ich denke auch (weiss es aber nicht) daß die Verwaltung von MMFs vom
Betriebssystem und nicht vom GC von C# gemacht wird.

Re: MemoryMappedFiles und Garbage Collector im .NET
Autor: Peter (Gast)
Datum: 04.05.2012 16:01

>bist du sicher das er sich überhaupt darum kümmert?
Nein, bin ich nicht :) ABER

>Klar, Du kannst Speicherbereiche sperren. Sorry mir fällt grad nicht die
>genaue Methode ein. Schau mal unter Byte Array und Pointerzugriff.
In den Beispielen wird das mit

void OpenMMF()
{
   using
   {
      //Hier sind die MMF's sicher
      ...
   }
}

gemacht. Aber wie soll das gehen? Sobald ich die Funktion verlasse hört
auch mein 'using'-Bereich auf?

>Naja, du musst nur das Programm forken. Solang du das geforkte Programm
>offen hälst, sollte dein file im RAM bleiben.
Was heisst 'forken'?

>Wenn du eine Referez auf den Speicher hast dann wird er auch nicht vom
>GC entfernt, wenn du keine Referenz mehr hast kannst du ihn auch nicht
>mehr ansprechen. Ich versteht das Problem nicht

class Test
{
   MemoryMappedFile m_mmf;

   Test()
   {
      m_mmf = MemoryMappedFile.Create("testmap");
   }
}

Das heisst also, wenn ich das so mache, dann wird mir da nichts
'wegoptimiert'? Mein m_mmf ist durchweg gültig? Aber warum wird dann
immer mit 'using' gearbeitet?

Gruß Peter

Re: MemoryMappedFiles und Garbage Collector im .NET
Autor: Peter II (Gast)
Datum: 04.05.2012 16:08

Peter schrieb:
> Sobald ich die Funktion verlasse hört
> auch mein 'using'-Bereich auf?

hast du dir überhaupt mal durchgelesen wofür using da ist?

http://msdn.microsoft.com/de-de/library/yh598w02%2...


Damit kann man sicherstellen das danach wieder aufgefäumt wird. Wenn du
das nicht brauchst dann weil das das objekt global anlegst dann ist doch
gut. Das ganze hat wenig mit dem GC oder mit dem optimerer zu tun. Es
ist nur ein hilfsmitel damit bei einer exception nicht vergessen wird
das dispose aufzurufen.

Re: MemoryMappedFiles und Garbage Collector im .NET
Autor: Peter (Gast)
Datum: 04.05.2012 16:18

Ich komme von der Win32 API und hab da noch ein paar Verständnisprobleme
mit der 'managed'-Geschichte, deshalb frag ich ja.

Aber ich glaube jetzt hab ich es verstanden:
>hast du dir überhaupt mal durchgelesen wofür using da ist?
Mit 'using' wird sichergestellt, dass während eines Zugriffs auf das MMF
nicht die Daten im Speicher verschoben werden.
>Wenn du das nicht brauchst dann weil das das objekt global anlegst dann ist
>doch gut.
Und die Gefahr, dass das MMF gelöscht wird, existiert nicht.

nein, warum auch. Damit könnte man überhaupt nicht sinnvoll 
programmieren.

von Peter II (Gast)


Lesenswert?

sorry für das merkwürdige post, irgendwie hat das einfügen nicht 
geklappt.

von Peter (Gast)


Lesenswert?

>nein, warum auch. Damit könnte man überhaupt nicht sinnvoll
>programmieren.
Das macht Sinn!

Jedenfalls bin ich jetzt etwas schlauer :)

Danke!

von Arc N. (arc)


Lesenswert?

http://msdn.microsoft.com/en-us/library/system.gc.keepalive.aspx
http://msdn.microsoft.com/en-us/library/dd997372.aspx
1
class Test
2
{
3
   MemoryMappedFile m_mmf;
4
5
   Test()
6
   {
7
      m_mmf = MemoryMappedFile.Create("testmap");
8
   }
9
}

So kann man nicht in jedem Fall sicher sein bzw. es hängt davon ab wo, 
wer, wie eine Instanz dieser Klasse referenziert. Siehe GC.KeepAlive(), 
ansonsten hilft static bzw. statischer Konstruktor bzw. Singleton.

von Peter (Gast)


Lesenswert?

Ok, danke! Das werd ich mir mal anschauen und berücksichtigen.

von Peter (Gast)


Lesenswert?

>wo hast du den satz her? Diese funktion von using ist mir bis jetzt
>nicht bekannt und auch irgendwie unglaubwürdig.
http://msdn.microsoft.com/de-de/library/zhdeatwt%28v=vs.80%29.aspx

Gruß Peter

von Peter II (Gast)


Lesenswert?

Peter schrieb:
>>wo hast du den satz her? Diese funktion von using ist mir bis jetzt
>>nicht bekannt und auch irgendwie unglaubwürdig.
> http://msdn.microsoft.com/de-de/library/zhdeatwt%2...
>
> Gruß Peter

ich meinte diesen Satz:

> Mit 'using' wird sichergestellt, dass während eines Zugriffs auf das MMF
> nicht die Daten im Speicher verschoben werden.

und dieser steht nicht in diesem link.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.