
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>evilsocket.net &#187; H_GC_COLLECT</title>
	<atom:link href="http://www.evilsocket.net/tag/h_gc_collect/feed" rel="self" type="application/rss+xml" />
	<link>http://www.evilsocket.net</link>
	<description>If you can't understand it, it doesn't mean it's wrong ...</description>
	<lastBuildDate>Fri, 10 Sep 2010 00:48:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Gestione “Smart” Della Memoria In Hybris : Parte II .</title>
		<link>http://www.evilsocket.net/928/gestione-%e2%80%9csmart%e2%80%9d-della-memoria-in-hybris-parte-ii.html</link>
		<comments>http://www.evilsocket.net/928/gestione-%e2%80%9csmart%e2%80%9d-della-memoria-in-hybris-parte-ii.html#comments</comments>
		<pubDate>Sat, 20 Mar 2010 22:20:46 +0000</pubDate>
		<dc:creator>evilsocket</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Misc]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[garbage collection]]></category>
		<category><![CDATA[gc]]></category>
		<category><![CDATA[htree_exectute]]></category>
		<category><![CDATA[hybris]]></category>
		<category><![CDATA[hybris_vg_isgarbage]]></category>
		<category><![CDATA[H_GC_COLLECT]]></category>
		<category><![CDATA[memory leaks]]></category>
		<category><![CDATA[valgrind]]></category>

		<guid isPermaLink="false">http://www.evilsocket.net/?p=928</guid>
		<description><![CDATA[Come detto nell&#8217;ultimo articolo, negli ultimi commit di Hybris è stato inserito un garbage collector strutturato in modo tale da districarsi al meglio tra le varie ricorsioni e i vari deliri di allocazione nell&#8217;interprete . Nell&#8217;articolo avevo anche detto che questo sistema, nonostante avesse il vantaggio di diminuire drasticamente l&#8217;utilizzo della memoria durante l&#8217;esecuzione di [...]


Related posts:<ol><li><a href='http://www.evilsocket.net/925/gestione-smart-della-memoria-in-hybris.html' rel='bookmark' title='Permanent Link: Gestione &#8220;smart&#8221; della memoria in Hybris .'>Gestione &#8220;smart&#8221; della memoria in Hybris .</a></li>
<li><a href='http://www.evilsocket.net/980/hybris-rivoluzionato-il-sistema-di-gestione-dei-tipi-ed-il-garbage-collector.html' rel='bookmark' title='Permanent Link: Hybris : Rivoluzionato il sistema di gestione dei tipi ed il garbage collector.'>Hybris : Rivoluzionato il sistema di gestione dei tipi ed il garbage collector.</a></li>
<li><a href='http://www.evilsocket.net/936/hybris-memory-lookup-now-google-powered.html' rel='bookmark' title='Permanent Link: Hybris memory lookup, now Google powered!!!'>Hybris memory lookup, now Google powered!!!</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Come detto nell&#8217;<a href="http://www.evilsocket.net/925/gestione-smart-della-memoria-in-hybris.html" target="_blank">ultimo articolo</a>, negli ultimi commit di <a href="http://www.hybris-lang.org/">Hybris</a> è stato inserito un garbage collector strutturato in modo tale da districarsi al meglio tra le varie ricorsioni e i vari deliri di allocazione nell&#8217;interprete .</p>
<p>Nell&#8217;articolo avevo anche detto che questo sistema, nonostante avesse il vantaggio di diminuire drasticamente l&#8217;utilizzo della memoria durante l&#8217;esecuzione di uno script, aveva lo svantaggio di diminuire anche le prestazioni complessive dato com&#8217;era strutturato l&#8217;algoritmo per determinare se un dato oggetto era deallocabile durante l&#8217;esecuzione dello script stesso, algoritmo che effettuava diversi controlli, tra i quali due loop (quelli che rappresentavano maggiormente il collo di bottiglia) sul frame della funzione chiamante e su quello della memoria principale.</p>
<p>Ebbene, <strong>sono un coglione</strong> XD .</p>
<p>Si avete letto bene, sono un coglione perchè avevo strutturato l&#8217;algoritmo ragionando &#8220;a posteriori&#8221; senza pensare che prevenendo questo controllo si poteva risolvere il problema ed aumentare anche le prestazioni rispetto a prima .</p>
<p><span id="more-928"></span></p>
<p>Quello che intendo è che nella classe Object, ho inserito una bitmask chiamata &#8220;attributes&#8221; che, come suggerisce il nome stesso, rappresenta gli attributi di quell&#8217;oggetto in particolare, ovvero se è un alias, una costante e soprattutto se è deallocabile .</p>
<p>Quest&#8217;ultimo flag in particolare, viene impostato alla creazione dell&#8217;oggetto a 1, quindi nello stato iniziale qualunque oggetto è de allocabile, successivamente, resetto il flag se e solo se si verificano le condizioni di non deallocabilità immediata, cioè se :</p>
<ol>
<li>L&#8217;oggetto viene definito in un qualunque frame (sia di una funzione che quello principale) come variabile .</li>
<li>L&#8217;oggetto è una costante .</li>
</ol>
<p>Quindi, impostando questo flag nella maschera binaria solo quando serve, al processo di garbage collection basta controllare a posteriori se sono impostati o meno i flag giusti per determinare se è possibile deallocare l&#8217;oggetto, eliminando così il problema dei due loop e del controllo complesso che prima rallentava di parecchio l&#8217;esecuzione di uno script.</p>
<p>Insomma come dire, a volte basta ragionare in modo &#8220;speculare&#8221; a come si ragiona in partenza per risolvere un problema <img src='http://www.evilsocket.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><strong>Nota</strong>: <em>Quando parlo di calo di prestazioni significante, mi riferisco comunque a rallentamenti nell&#8217;ordine di <strong>millisecondi</strong> in algoritmi molto complessi che, per motivi di test, sono strutturati appositamente per allocare molta memoria e &#8220;stressare&#8221; l&#8217;interprete . In realtà, in programmi &#8220;normali&#8221; che non richiedono chissà quale elaborazione avanzata, la differenza non si nota nemmeno .</em></p>

                            <div id="aspdf">
                                <a href="http://www.evilsocket.net/wp-content/plugins/as-pdf/generate.php?post=928">
                                    <span> </span>
                                </a>
                            </div>
                        <img src="http://www.evilsocket.net/?ak_action=api_record_view&id=928&type=feed" alt="" />

<p>Related posts:<ol><li><a href='http://www.evilsocket.net/925/gestione-smart-della-memoria-in-hybris.html' rel='bookmark' title='Permanent Link: Gestione &#8220;smart&#8221; della memoria in Hybris .'>Gestione &#8220;smart&#8221; della memoria in Hybris .</a></li>
<li><a href='http://www.evilsocket.net/980/hybris-rivoluzionato-il-sistema-di-gestione-dei-tipi-ed-il-garbage-collector.html' rel='bookmark' title='Permanent Link: Hybris : Rivoluzionato il sistema di gestione dei tipi ed il garbage collector.'>Hybris : Rivoluzionato il sistema di gestione dei tipi ed il garbage collector.</a></li>
<li><a href='http://www.evilsocket.net/936/hybris-memory-lookup-now-google-powered.html' rel='bookmark' title='Permanent Link: Hybris memory lookup, now Google powered!!!'>Hybris memory lookup, now Google powered!!!</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.evilsocket.net/928/gestione-%e2%80%9csmart%e2%80%9d-della-memoria-in-hybris-parte-ii.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Gestione &#8220;smart&#8221; della memoria in Hybris .</title>
		<link>http://www.evilsocket.net/925/gestione-smart-della-memoria-in-hybris.html</link>
		<comments>http://www.evilsocket.net/925/gestione-smart-della-memoria-in-hybris.html#comments</comments>
		<pubDate>Sat, 20 Mar 2010 14:01:26 +0000</pubDate>
		<dc:creator>evilsocket</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[garbage collection]]></category>
		<category><![CDATA[gc]]></category>
		<category><![CDATA[htree_exectute]]></category>
		<category><![CDATA[hybris]]></category>
		<category><![CDATA[hybris_vg_isgarbage]]></category>
		<category><![CDATA[H_GC_COLLECT]]></category>
		<category><![CDATA[memory leaks]]></category>
		<category><![CDATA[valgrind]]></category>

		<guid isPermaLink="false">http://www.evilsocket.net/?p=925</guid>
		<description><![CDATA[Uno dei problemi che affliggeva Hybris sin dalla primissima release era il problema dell&#8217;utilizzo/spreco di memoria . Chi si è cimentato nella lettura del codice, avrà probabilmente notato che nella funzione htree_execute , quella che in pratica deve eseguire l&#8217;alberazione del programma parserizzato, non venivano de allocati gli oggetti &#8220;deallocabili&#8221; . Questo avveniva per due [...]


Related posts:<ol><li><a href='http://www.evilsocket.net/928/gestione-%e2%80%9csmart%e2%80%9d-della-memoria-in-hybris-parte-ii.html' rel='bookmark' title='Permanent Link: Gestione “Smart” Della Memoria In Hybris : Parte II .'>Gestione “Smart” Della Memoria In Hybris : Parte II .</a></li>
<li><a href='http://www.evilsocket.net/980/hybris-rivoluzionato-il-sistema-di-gestione-dei-tipi-ed-il-garbage-collector.html' rel='bookmark' title='Permanent Link: Hybris : Rivoluzionato il sistema di gestione dei tipi ed il garbage collector.'>Hybris : Rivoluzionato il sistema di gestione dei tipi ed il garbage collector.</a></li>
<li><a href='http://www.evilsocket.net/1036/prima-bozza-della-documentazione-sullo-sviluppo-dei-moduli.html' rel='bookmark' title='Permanent Link: Prima bozza della documentazione sullo sviluppo dei moduli'>Prima bozza della documentazione sullo sviluppo dei moduli</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Uno dei problemi che affliggeva <a href="http://www.hybris-lang.org/" target="_blank">Hybris</a> sin dalla primissima release era il problema dell&#8217;utilizzo/spreco di memoria .</p>
<p>Chi si è cimentato nella lettura del codice, avrà probabilmente notato che nella funzione <a href="http://github.com/evilsocket/Hybris/blob/master/src/hybris.cpp#L199" target="_blank">htree_execute</a> , quella che in pratica deve eseguire l&#8217;alberazione del programma parserizzato, non venivano de allocati gli oggetti &#8220;deallocabili&#8221; .</p>
<p>Questo avveniva per due ragioni principali :</p>
<ol>
<li>Essendo una funzione fortemente ricorsiva, non si poteva stabilire a priori se un dato oggetto sarebbe stato necessario ad una ricorsione successiva od alla ricorsione &#8220;chiamante&#8221;.</li>
<li>Data la forte generalizzazione della classe &#8220;<a href="http://github.com/evilsocket/Hybris/blob/master/include/object.h" target="_blank">Object</a>&#8220;, non era facile stabilire a priori quali tipi di oggetto era possibile deallocare e quali no.</li>
</ol>
<p><span id="more-925"></span>Ebbene, la soluzione era molto più semplice del previsto in effetti ed il non averla trovata prima dipendeva dal fatto che il codice di htree_execute era abbastanza incasinato (di fatto era una delle pochissime funzioni che era rimasta praticamente invariata fin dall&#8217;inizio) e non era molto facile stabilire un criterio del genere in base all&#8217; &#8220;impatto visivo&#8221; del codice stesso.</p>
<p>Quindi, mi son messo e l&#8217;ho ripulita, creato una funzione &#8220;<a href="http://github.com/evilsocket/Hybris/blob/master/include/executors.h" target="_blank">esecutrice</a>&#8221; per ogni tipo di nodo e dividendo il mega switchone di htree_execute dal codice operativo di ogni alberazione sintattica, giungendo alla conclusione che, <strong>un oggetto è immediatamente deallocabile se e solo se</strong> :</p>
<ol>
<li><strong>Non</strong> è una variabile globale dichiarata nell&#8217;area di memoria principale del programma.</li>
<li><strong>Non</strong> è una variabile locale dichiarata nello stack frame della funzione in cui ci si trova.</li>
<li><strong>Non</strong> rappresenta un valore costante (un numero, una stringa, ecc non derivanti da un espressione che li compone).</li>
</ol>
<p>Dedotto questo, è stato relativamente semplice modificare ulteriormente il codice, creando la funzione <a href="http://github.com/evilsocket/Hybris/blob/master/src/vmem.cpp#L113" target="_blank">hybris_vg_isgarbage</a> per determinare se un dato oggetto è deallocabile tramite questo criterio e la macro <a href="http://github.com/evilsocket/Hybris/blob/master/src/executors.cpp#L8" target="_blank">H_GC_COLLECT</a> per liberare memoria in modo smart e sicuro .</p>
<p>Detto ciò, ovviamente la questione presenta sia dei pro che dei contro .</p>
<p>Il pro principale è che vengono utilizzate <strong>MOLTE </strong>meno risorse rispetto a prima per quanto riguarda la RAM, il che è ottimo per un programma che deve rimanere in esecuzione per parecchio tempo (un server ad esempio) o che richiede molte ricorsioni, loop ecc che vanno ad allocare spazzatura sullo stack (vedi gli esempi per calcolare numeri primi e perfetti).</p>
<p>Il contro, come è facile immaginare, è che controllare ogni puntatore per determinare se è allocabile, scorrendo i vettori di due frame di memoria, rallenta un po la velocità di elaborazione, ho notato un incremento di circa 10ms nel programma per il calcolo dei numeri primi rispetto a prima .</p>
<p>Per questo motivo, l&#8217;utente è in grado di scegliere se utilizzare questa funzionalità in fase di compilazione dei sorgenti di Hybris, andando ad agire sulla costante <strong>GC_SUPPORT</strong> definita nel file <a href="http://github.com/evilsocket/Hybris/blob/master/include/config.h#L34" target="_blank">config.h</a>, la quale ovviamente se è definita attiverà le funzionalità di garbage collecting, mentre se verrà commentata lascerà la gestione della memoria come prima, allocando tutto il necessario a runtime e deallocando tutto ciò che è stato allocato alla fine del programma, tuttavia non liberando alcuni blocchi di memoria dei quali non è possibile tener traccia, ovvero proprio quelli de allocabili tramite il garbage collector .</p>
<p>Detto questo, son felice di dichiarare che con questa consistente modifica, l&#8217;ultima versione di Hybris risolve il 99% dei memory leaks, lasciandone solo altri pochi che comunque ho il dubbio siano dei falsi positivi di Valgrind (un software fatto proprio per determinare i memory leaks in un programma e che sto usando intensamente in questi giorni) ^^</p>

                            <div id="aspdf">
                                <a href="http://www.evilsocket.net/wp-content/plugins/as-pdf/generate.php?post=925">
                                    <span> </span>
                                </a>
                            </div>
                        <img src="http://www.evilsocket.net/?ak_action=api_record_view&id=925&type=feed" alt="" />

<p>Related posts:<ol><li><a href='http://www.evilsocket.net/928/gestione-%e2%80%9csmart%e2%80%9d-della-memoria-in-hybris-parte-ii.html' rel='bookmark' title='Permanent Link: Gestione “Smart” Della Memoria In Hybris : Parte II .'>Gestione “Smart” Della Memoria In Hybris : Parte II .</a></li>
<li><a href='http://www.evilsocket.net/980/hybris-rivoluzionato-il-sistema-di-gestione-dei-tipi-ed-il-garbage-collector.html' rel='bookmark' title='Permanent Link: Hybris : Rivoluzionato il sistema di gestione dei tipi ed il garbage collector.'>Hybris : Rivoluzionato il sistema di gestione dei tipi ed il garbage collector.</a></li>
<li><a href='http://www.evilsocket.net/1036/prima-bozza-della-documentazione-sullo-sviluppo-dei-moduli.html' rel='bookmark' title='Permanent Link: Prima bozza della documentazione sullo sviluppo dei moduli'>Prima bozza della documentazione sullo sviluppo dei moduli</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.evilsocket.net/925/gestione-smart-della-memoria-in-hybris.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
