Arbeitet TAP_MemAlloc() nur blockweise ???

Zusatz-Programme für Receiver der 5000er und 6000er Serie.

Hier geht's um alles, was mit den TAP Anwendungen für den PVR5x00/6000 zu tun hat.
Jag
TAP-Guru
TAP-Guru
Beiträge: 212
Registriert: Mo 12. Dez 2005, 00:20

Arbeitet TAP_MemAlloc() nur blockweise ???

#1

Beitrag von Jag » Fr 6. Jan 2006, 00:52

Hallo,

ich experimentiere gerade weitergehend mit TAP_MemAlloc() und musste leider feststellen, dass der verbrauchte Speicher immer blockweise belegt wird! :(

Egal ob ich 10 Byte oder 1000 Byte anfordere, verbraucht werden anscheinend immer 1280 Byte (+ x Byte für die Verwaltung)!
(1280 Byte = hex: 0x500 Byte)
Ab 1281 Byte wird dann das doppelte verbraucht (also 2*1280=2560+x Byte), usw. 3x, 4x ...!

Ist das allgemein bekannt, Topf spezifisch oder ein Bug :? :

Außerdem scheint TAP_MemAlloc() mit rund 4 ms pro Aufruf nicht gerade schnell zu sein :(

Das durchkreuzt leider einiges, so dass ich hier wohl wieder irgendwie "drumherumprogrammieren" muss :evil:

Kann das jemand bestätigen, kann man das verhindern ?

Hier eine Testfunktion dazu, dabei wird 5000-mal TAP_MemAlloc aufgerufen:

Code: Alles auswählen

void test_memalloc()
{
	int i;
	void *test_p;
	char strBuf[128];
	dword heapSize, freeHeapSize, availHeapSize;

	TAP_MemInfo(&heapSize, &freeHeapSize, &availHeapSize );
	TAP_SPrint(strBuf, " HeapSize: %d  free: %d  available: %d  GetTick: %d ", heapSize/1000, freeHeapSize/1000, availHeapSize/1000, TAP_GetTick() );
	TAP_Osd_PutString1622( rgn, 60, 250, -1, strBuf, COLOR_User14, COLOR_User1);

	for( i=0 ; i < 5000 ; i++ )
	{
		TAP_MemInfo(&heapSize, &freeHeapSize, &availHeapSize );

		if( availHeapSize > 100000 )
		{
			test_p = TAP_MemAlloc(10);  // oder ...(1000);
		}
	}

	TAP_MemInfo(&heapSize, &freeHeapSize, &availHeapSize );
	TAP_SPrint(strBuf, " HeapSize: %d  free: %d  available: %d  GetTick: %d ", heapSize/1000, freeHeapSize/1000, availHeapSize/1000, TAP_GetTick() );
	TAP_Osd_PutString1622( rgn, 60, 280, -1, strBuf, COLOR_User14, COLOR_User1);
}
(dass der Speicher hier nicht freigegeben wird spielt keine Rolle,
sollte ohne weitere TAP's gestartet werden und benötigt ca. 20 sec bei Ausführung)


Gruß
Jag

Benutzeravatar
eber
TAP-Guru
TAP-Guru
Beiträge: 313
Registriert: Fr 9. Dez 2005, 10:21
Wohnort: Mainz

#2

Beitrag von eber » Fr 6. Jan 2006, 09:36

Zumindest hatte ich bisher auch den Eindruck, das die Speicherverwaltung nicht besonders effizient ist. Auch habe ich das Gefühl, das es Performance-Probleme gibt wenn man relativ viele einzelne Bereiche anfordert (so ab 50 aufwärts).
Allerdings habe ich noch keine konkreten Experimente dazu unternommen. Ich versuche bisher so selten wie möglich TAP_MemAlloc aufzurufen.
Leider scheint die Firmware auch an dieser Stelle mit heißer Nadel gestrickt zu sein :?

Grüße

Eber
Zuletzt geändert von eber am Fr 6. Jan 2006, 09:39, insgesamt 1-mal geändert.
(TF5000PVR mit 250 GB Samsung HD ,nur FreeToAir,Twin-LNB , TAPs: Smartepg, ImproBox)

Nützliche Infos findet man auch im Topfield-Wikipedia. Einfach hier klicken

Benutzeravatar
ibbi
Moderierter Ignorator Bitteschöööön!
Moderierter Ignorator  <font color=#E9E9E9>Bitteschöööön!</font>
Beiträge: 7110
Registriert: Fr 9. Dez 2005, 12:49
Receivertyp: TF5000PVR • SRP-2401CI+ Eco
Receiverfirmware: Sep 2005 PHTF • Jan 2015

#3

Beitrag von ibbi » Fr 6. Jan 2006, 10:54

Jag hat geschrieben:Ist das allgemein bekannt, Topf spezifisch oder ein Bug :? :
So etwas scheint mir das normale Vorgehen für Speicherverwaltung zu sein. Der Kern des Betriebssystems fordert immer Blöcke an (z. B. 4 KByte), die der Prozessor optimal verwalten kann.

Will nun ein Programm 1 Byte Speicher, wird zunächst einmal ein neuer Block angefordert. Aus diesem Block werden so lange Anfragen befriedigt, bis er komplett aufgebraucht ist. Dann wird ein neuer Block angefordert.

So etwas muss sein, damit die Speicherverwaltung effizient durchgeführt werden kann und ist so lange kein Problem, wie genug Speicher zur Verfügung steht. Systeme mit wenig Speicher tun sich bei so etwas natürlich schwer.

DeJe
Topfmeister
Topfmeister
Beiträge: 612
Registriert: Sa 10. Dez 2005, 13:57

#4

Beitrag von DeJe » Fr 6. Jan 2006, 11:00

Jap, nach meinen kurzen Erkenntnissen (allerdings auch nicht konkret getestet) muß es so sein das malloc auf dem Topf nur fixed size Blöcke allociert.

Ich denke nicht das Du das verhindern kannst. Du kannst höchtens deine eigene Speicherverwaltung schreiben. Einen großen Block allocieren und dann diesen selbst als Heap benutzen. Speichereffizienter wird das dann auf jeden Fall, obs auch schneller wird ist eine andere Frage.

Speed spielt bei mir zum Glück keine Rolle. Die Festplatte ist noch extrem langsamer. ;)
TF5000PVR Masterpiece mit 250GB Samsung, ImproBox Premium, QuickTimer, 3PG, Filer, FastSkip, WSSKiller

Benutzeravatar
eber
TAP-Guru
TAP-Guru
Beiträge: 313
Registriert: Fr 9. Dez 2005, 10:21
Wohnort: Mainz

#5

Beitrag von eber » Fr 6. Jan 2006, 11:14

ibbi hat geschrieben:....

Will nun ein Programm 1 Byte Speicher, wird zunächst einmal ein neuer Block angefordert. Aus diesem Block werden so lange Anfragen befriedigt, bis er komplett aufgebraucht ist. Dann wird ein neuer Block angefordert.
....
Wenn ich Jag richtig verstanden habe, macht der Topf das leider nicht so. Das heißt wenn ich zweimal 20 Byte anfordere, dann werden zwei Blöcke mit jeweils 1280 Byte verbraucht,d.h. man hat 2560 Byte weniger freien Speicher.
Dein Beispiel ist eher typisch für Betriebssysteme die mit virtueller Speicherverwaltung arbeiten (können) wie z.B. Linux oder Windows.
Da dabei Daten zeitweise auf die Platte ausgelagert werden müssen, macht es Sinn als Verwaltungseinheit die Größe der Festplattensektoren als Basis zu nehmen.
Der Topf kann das aber definitiv nicht ....

Grüße

Eber
(TF5000PVR mit 250 GB Samsung HD ,nur FreeToAir,Twin-LNB , TAPs: Smartepg, ImproBox)

Nützliche Infos findet man auch im Topfield-Wikipedia. Einfach hier klicken

DeadBeef
TAP-Guru
TAP-Guru
Beiträge: 392
Registriert: So 25. Dez 2005, 11:27

#6

Beitrag von DeadBeef » Fr 6. Jan 2006, 11:18

In Echtzeitsystemen ist vom dynamischen Allokieren/Freigeben grundsätzlich abzuraten. Denn das führt in den meisten Fällen zu Speicherfragmentierung, die vom Betriebssystem nur mit zusätzlichem Zeitaufwand beseitigt werden kann. Viele Echtzeitbetriebssysteme organisieren ihren Speicher in Pools von vorallokierten Blocks mit vordefinierten Größen, um den Verwaltungsaufwand zu minimieren.

Den Wert von 1280 kann ich bestätigen, der steht so in der internen malloc() Funktion. Des weiteren scheint TAP_MemAlloc() jedes Mal vor dem Allokieren des Speichers die Garbage Collection durchzuführen (wenn ich mich nicht täusche). D.h. bei jedem Aufruf wird im Speicher aufgeräumt, auch wenn es sich nur um ein paar Blöcke von der Firmware handelt, die sich in der Zwischenzeit angesammelt haben.

Was das Zeitverhalten angeht, darf man nicht vernachlässigen, das alleine der Overhead von Funktionsaufrufen einiges an Zeit kostet. Versuch mal den gleichen Code ohne TAP_MemInfo laufen zu lassen.
Grüße
DeadBeef

DeadBeef's TAP Collection

Benutzeravatar
eber
TAP-Guru
TAP-Guru
Beiträge: 313
Registriert: Fr 9. Dez 2005, 10:21
Wohnort: Mainz

#7

Beitrag von eber » Fr 6. Jan 2006, 11:29

Ein Garbage Collector in der Topf-Firmware?
Ich kann mir das eigentlich nicht vorstellen und selbst eine Speicherdefragmentierung halte ich für kaum möglich.
Oder hat der Topf-MIPS tatsächlich eine MMU, um virtuelle Adressen umsetzen zu können. Ansonsten würde ja u.U. Pointer innerhalb eines Taps nach einer Defragmentierung ins Leere zeigen...

Grüße

Eber
(TF5000PVR mit 250 GB Samsung HD ,nur FreeToAir,Twin-LNB , TAPs: Smartepg, ImproBox)

Nützliche Infos findet man auch im Topfield-Wikipedia. Einfach hier klicken

Jag
TAP-Guru
TAP-Guru
Beiträge: 212
Registriert: Mo 12. Dez 2005, 00:20

#8

Beitrag von Jag » Fr 6. Jan 2006, 11:37

eber hat geschrieben:Wenn ich Jag richtig verstanden habe, macht der Topf das leider nicht so. Das heißt wenn ich zweimal 20 Byte anfordere, dann werden zwei Blöcke mit jeweils 1280 Byte verbraucht,d.h. man hat 2560 Byte weniger freien Speicher.
Genau, so ist es :(
DeadBeef hat geschrieben:Was das Zeitverhalten angeht, darf man nicht vernachlässigen, das alleine der Overhead von Funktionsaufrufen einiges an Zeit kostet. Versuch mal den gleichen Code ohne TAP_MemInfo laufen zu lassen.
Habe ich schon getestet, wenn ich in der Test-Funktion das TAP_MemAlloc() durch eine Leeranweisung ersetzte ( ; ) verkürzt sich die Ausführungszeit um mehr als 95%, das heißt TAP_MemInfo und der gesamte Rest braucht die geringste Ausführungszeit, während tatsächlich TAP_MemAlloc() signifikant langsamer arbeitet!


Gruß
Jag

Benutzeravatar
ibbi
Moderierter Ignorator Bitteschöööön!
Moderierter Ignorator  <font color=#E9E9E9>Bitteschöööön!</font>
Beiträge: 7110
Registriert: Fr 9. Dez 2005, 12:49
Receivertyp: TF5000PVR • SRP-2401CI+ Eco
Receiverfirmware: Sep 2005 PHTF • Jan 2015

#9

Beitrag von ibbi » Fr 6. Jan 2006, 11:39

eber hat geschrieben:Wenn ich Jag richtig verstanden habe, macht der Topf das leider nicht so. Das heißt wenn ich zweimal 20 Byte anfordere, dann werden zwei Blöcke mit jeweils 1280 Byte verbraucht,d.h. man hat 2560 Byte weniger freien Speicher.
Upps, tatsächlich?! :eek:

DeadBeef
TAP-Guru
TAP-Guru
Beiträge: 392
Registriert: So 25. Dez 2005, 11:27

#10

Beitrag von DeadBeef » Fr 6. Jan 2006, 12:00

eber hat geschrieben:Ein Garbage Collector in der Topf-Firmware?
Ich kann mir das eigentlich nicht vorstellen und selbst eine Speicherdefragmentierung halte ich für kaum möglich.
Oder hat der Topf-MIPS tatsächlich eine MMU, um virtuelle Adressen umsetzen zu können. Ansonsten würde ja u.U. Pointer innerhalb eines Taps nach einer Defragmentierung ins Leere zeigen...
Speicherfragmentierung ensteht jedes Mal, wenn kleinere Speicherblöcke zurückgegeben werden. Um diese zu einem großen Block zusammenzufassen, benötigt man keine virtuelle Speicherverwaltung. VR4120, auf dessen Kern der 61130A aufbaut, hat auch eine MMU, die allerdings nicht vollständig ausgereizt wird, soweit ich das beurteilen kann. Die Exceptions, die man so üblicherweise sieht, wenn man verbogene Pointer benutzt, kommen genau von dieser MMU. Andererseits kann eine voll ausgeprägte virtuelle Speicherverwaltung auch viel Zeit kosten und ist daher für Echtzeitanwendungen auf schwächeren Prozessoren nicht geeignet.
Grüße
DeadBeef

DeadBeef's TAP Collection

Benutzeravatar
eber
TAP-Guru
TAP-Guru
Beiträge: 313
Registriert: Fr 9. Dez 2005, 10:21
Wohnort: Mainz

#11

Beitrag von eber » Fr 6. Jan 2006, 12:25

DeadBeef hat geschrieben:Speicherfragmentierung ensteht jedes Mal, wenn kleinere Speicherblöcke zurückgegeben werden. Um diese zu einem großen Block zusammenzufassen, benötigt man keine virtuelle Speicherverwaltung.
Wenn zwei freigebene Speicherbereiche "nebeneinander" liegen kann die Speicherverwaltung natürlich problemlos zu einem großem freien Speicherbereich zusammenfassen.
Leider ist es aber ja nicht immer zwangsläufig der Fall:
Wenn ich 5 x Speicher a 4 KBbyte anfordere und anschließend den 2. und 4. angeforderten Bereich wieder freigebe sieht es im RAM u.U. ja so aus:
A belegt
B frei
C belegt
D frei
E belegt
Meine Frage ist jetzt, ob der Topf in der Lage ist, eine Anforderung von 8 KB (am Stück :lol: ) aus den beiden freien Bereichen B und D zu bedienen. Und da würde ich vermuten das er das nicht kann.
D.h. wenn man häufig Speicher in unterschiedlichen Größen anfordert und (nicht in umgekehrter Reihenfolge) wieder freigibt dann "zerfleddert" es einem nach und nach den Hauptspeicher. Etwas entschärft dadurch, das die kleinste Einheit wohl 1280 Bytes sind.
Wenn Jag für einzelne Events (und deren variable langer erweiterten Beschreibung) jeweils per MemAlloc speicher anfordert würde genau diese Fragmentierung auftreten.
Vermutlich nicht so wild, da die typischerweise benötigten Größen dann in Speicherbereichen zu 1x1280,2x1280 und 3x1280 umgesetzt würden. Allerdings dann mit einer ziemlichen Speicherverschwendung, da ja selten ein Event ein Vielfaches von 1280 Bytes an Speicherplatz benötigt
DeadBeef hat geschrieben: VR4120, auf dessen Kern der 61130A aufbaut, hat auch eine MMU, die allerdings nicht vollständig ausgereizt wird, soweit ich das beurteilen kann. Die Exceptions, die man so üblicherweise sieht, wenn man verbogene Pointer benutzt, kommen genau von dieser MMU. Andererseits kann eine voll ausgeprägte virtuelle Speicherverwaltung auch viel Zeit kosten und ist daher für Echtzeitanwendungen auf schwächeren Prozessoren nicht geeignet.
Bei Hauptspeichermangel Daten auf Platte auszulagern macht die Topf-Firmware ziemlich sicher nicht.
Für mich stellt sich die Frage, ob die von MemAlloc zurückgelieferte Adresse eine physikalische Adresse ist, oder ob diese Adresse beim Zugriff per MMU erst in eine physikalische Adresse umgesetzt wird.

Grüße

Eber
(TF5000PVR mit 250 GB Samsung HD ,nur FreeToAir,Twin-LNB , TAPs: Smartepg, ImproBox)

Nützliche Infos findet man auch im Topfield-Wikipedia. Einfach hier klicken

DeJe
Topfmeister
Topfmeister
Beiträge: 612
Registriert: Sa 10. Dez 2005, 13:57

#12

Beitrag von DeJe » Fr 6. Jan 2006, 13:02

Übel ist das Verhalten des Topfes in dieser Beziehung auf jeden Fall. :(
Da muß ich wohl mal in meinen Source-Pool schauen ob ich ein einfaches Replacement für malloc/free finde. ;)
TF5000PVR Masterpiece mit 250GB Samsung, ImproBox Premium, QuickTimer, 3PG, Filer, FastSkip, WSSKiller

Benutzeravatar
Harvey
iTina-Promoter und Kuhinteressent
iTina-Promoter und Kuhinteressent
Beiträge: 3894
Registriert: So 11. Dez 2005, 22:34
Receivertyp: 0x1388 PVR
Receiverfirmware: 13.09.2005
Wohnort: Planet Erde, Milchstraße

#13

Beitrag von Harvey » Mo 9. Jan 2006, 16:32

Oh Mann - mit was Ihr euch alles rumschlagen müsst.

Vielleicht bietet sich ja die Nachbildung einer FAT24 mit einer "Sektorlänge" von 256 Bytes an.

Dann muss man zwar direkt zu Anfang immernoch massig Speicher alloziieren, aber ich schätze, das dürfte für mehr als das doppelte an Events reichen.
Gruss
Harvey

DeJe
Topfmeister
Topfmeister
Beiträge: 612
Registriert: Sa 10. Dez 2005, 13:57

#14

Beitrag von DeJe » Mo 9. Jan 2006, 16:45

Bei mir ist die Sache schon geklärt. :)
"segregated freelists" ist die Antwort. Reichlich einfach zu implementieren, gerade mal 4 Byte overhead, im Vergleich zum Topf-Alloc affenartig schnell (Faktor min. 1000 :D ) ...
TF5000PVR Masterpiece mit 250GB Samsung, ImproBox Premium, QuickTimer, 3PG, Filer, FastSkip, WSSKiller

Benutzeravatar
ibbi
Moderierter Ignorator Bitteschöööön!
Moderierter Ignorator  <font color=#E9E9E9>Bitteschöööön!</font>
Beiträge: 7110
Registriert: Fr 9. Dez 2005, 12:49
Receivertyp: TF5000PVR • SRP-2401CI+ Eco
Receiverfirmware: Sep 2005 PHTF • Jan 2015

#15

Beitrag von ibbi » Di 10. Jan 2006, 16:19

DeJe hat geschrieben:Bei mir ist die Sache schon geklärt. :)
"segregated freelists" ist die Antwort. Reichlich einfach zu implementieren, gerade mal 4 Byte overhead, im Vergleich zum Topf-Alloc affenartig schnell (Faktor min. 1000 :D ) ...
Her mit dem Link zum Nachlesen! :hello:

onkelsam
Topfazubi
Topfazubi
Beiträge: 33
Registriert: Fr 9. Dez 2005, 10:03

#16

Beitrag von onkelsam » Di 10. Jan 2006, 21:26

bringt der GCC eigentlich kein Lib mit welche malloc beinhaltet?

Gruss
sam

DeJe
Topfmeister
Topfmeister
Beiträge: 612
Registriert: Sa 10. Dez 2005, 13:57

#17

Beitrag von DeJe » Di 10. Jan 2006, 21:33

Doch, aber genau die hat eben oben beschriebene "Problemchen".
TF5000PVR Masterpiece mit 250GB Samsung, ImproBox Premium, QuickTimer, 3PG, Filer, FastSkip, WSSKiller

onkelsam
Topfazubi
Topfazubi
Beiträge: 33
Registriert: Fr 9. Dez 2005, 10:03

#18

Beitrag von onkelsam » Di 10. Jan 2006, 22:16

aber er verwendet doch TAP_MemAlloc() (der API wie ich verstehe) und nicht malloc welches vielfach als c-Lib vorhanden ist.

Oder gibt es dies bei dieser Enticklungsumgebeung nicht?

DeJe
Topfmeister
Topfmeister
Beiträge: 612
Registriert: Sa 10. Dez 2005, 13:57

#19

Beitrag von DeJe » Di 10. Jan 2006, 22:38

Die Speicherverwaltung ist für jedes System mehr oder weniger einzigartig und steckt in den Systembibliotheken. Für den Topf kannst du kein malloc aus der Linux- oder Windows-Bibliothek nutzen. Die Systembibliothek wurde (natürlich) von Topfield erstellt.
Hier zeigt sich der Nachteil das die Systembibliotheken des Topf kein open source sind (wie eigentlich laut GPL gefordert) und deshalb gibt es die Entwicklungsumgebung auch nicht mehr offiziell.
TF5000PVR Masterpiece mit 250GB Samsung, ImproBox Premium, QuickTimer, 3PG, Filer, FastSkip, WSSKiller

Benutzeravatar
hagge
Jung-Guru
Jung-Guru
Beiträge: 1921
Registriert: Fr 9. Dez 2005, 15:43
Receivertyp: SRP-2401CI+, TF5000PVR
Wohnort: Stuttgart

#20

Beitrag von hagge » Di 17. Jan 2006, 17:21

Hier muss ich mal kurz einhaken.
DeJe hat geschrieben:Die Speicherverwaltung ist für jedes System mehr oder weniger einzigartig und steckt in den Systembibliotheken. Für den Topf kannst du kein malloc aus der Linux- oder Windows-Bibliothek nutzen. Die Systembibliothek wurde (natürlich) von Topfield erstellt.
Soweit richtig.
Hier zeigt sich der Nachteil das die Systembibliotheken des Topf kein open source sind (wie eigentlich laut GPL gefordert) und deshalb gibt es die Entwicklungsumgebung auch nicht mehr offiziell.
Das wiederum ist allerdings nicht richtig. Die GPL verlangt keineswegs, dass die Systembibliotheken Open Source sind. Wer mit dem GCC compiliert, hat es auch gar nicht mit der GPL, sondern mit der LGPL zu tun, die weit weniger Bedingungen stellt. D.h. die Programme, die mit dem GCC compiliert werden, können sogar komplett Closed Source sein.

Das Problem ist der GCC selbst. Die GPL verlangt nämlich, dass wenn ein GPL-Programm irgendwo vertrieben wird, der Quellcode mitgegeben werden muss oder zumindest auf Anfrage rausgegeben werden muss. Und der GCC ist ein GPL-Programm, d.h. es müsste den Quelltext zu der für die Topfield-Receiver angepassten GCC-Version geben. Das will die Firma Topfield aus was für Gründen auch immer anscheinend nicht. Möglicherweise war die Anpassung eben nur ein schneller Hack und so unsauber, dass sie den Quellcode dafür nicht öffentlich zeigen wollen, bevor das nicht jemand überarbeitet hat. Möglicherweise sind es andere Gründe.

Das Problem ist also nicht die Systembibliothek, sondern der GCC selbst. Sobald Topfield den Quellcode für die GCC-Anpassungen rausrücken würde, wäre wieder alles im Lot.

Gruß,

Hagge

Antworten

Zurück zu „TF 5x00/6000 PVR TAP“