<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>
<channel>
	<title>Comments on: Blocking read kiváltása mivel?</title>
	<atom:link href="http://soci.hu/blog/index.php/2010/07/02/blocking-read-kivaltasa-mivel/feed/" rel="self" type="application/rss+xml" />
	<link>http://soci.hu/blog/index.php/2010/07/02/blocking-read-kivaltasa-mivel/</link>
	<description>Az ember kivételével minden állat tudja, hogy a legfontosabb dolgunk az életben: élvezni azt.</description>
	<pubDate>Mon, 21 May 2012 18:49:12 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
		<item>
		<title>By: Tóth Viktor</title>
		<link>http://soci.hu/blog/index.php/2010/07/02/blocking-read-kivaltasa-mivel/#comment-82515</link>
		<dc:creator>Tóth Viktor</dc:creator>
		<pubDate>Fri, 26 Nov 2010 13:05:24 +0000</pubDate>
		<guid isPermaLink="false">http://soci.hu/blog/?p=1092#comment-82515</guid>
		<description>libor, Hamurabi, amit ti csináltok, az a busy spin anti pattern. működik egyébként, de komoly szervert így nem lehet készíteni.</description>
		<content:encoded><![CDATA[<p>libor, Hamurabi, amit ti csináltok, az a busy spin anti pattern. működik egyébként, de komoly szervert így nem lehet készíteni.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Tóth Viktor</title>
		<link>http://soci.hu/blog/index.php/2010/07/02/blocking-read-kivaltasa-mivel/#comment-82514</link>
		<dc:creator>Tóth Viktor</dc:creator>
		<pubDate>Fri, 26 Nov 2010 13:01:53 +0000</pubDate>
		<guid isPermaLink="false">http://soci.hu/blog/?p=1092#comment-82514</guid>
		<description>Hát, bocs, csak most tévedtem ide, de ezekre a megoldásokra tényeleg az APM és a beginxxx megoldások a jók. Nem okoznak context switchet, leírom miért:

A CLR ezekre a feladatokra a Completion Port-okat használja. Röviden a Completion Port úgy működik, hogy az I/O Manager a Completion Port queue-jába tud aszinkron műveletek eredményeit bepakolni, mint pl amikor a socketről olvas valaki aszinkron, vagy file-ból aszinkron. A Completion Port-ra lehet ráállítani thread-eket, amik felébrednek akkor, amikor jött valami a queue-jába. De olyan okos ez a windows, hogy thread pool-hoz is hozzá tud párosítani egy Completion Port-ot, és akkor a thread pool thread ébred fel.
Van mégegy jó tulajdonsága a Completion Port-nak. Mint a hogy megemlítetted, egyéb módokon (pl ha az ember Completion Routinokat használ az aszinkron hívásaihoz) akkor context switchek meg egyéb csúnya dolgok történnek, de Completion Port-nál nem. Olyan módon van megcsinálva, hogy a Completion Portnál be lehet egyrészt állítani, hogy hány szálat engedjen futni maximum (akkor is, ha több fülel a completion porton). Egy egymagos gépen ezt a számot egyre érdemes rakni, egy négy magos gépen meg négyre. Ez azért jó, mert egyszerre csak egy szál foglalkozik a kész eredményekkel, nem kell őket váltogatni. Amikor ez a szál végez az egyik completion packet feldolgozásával, akkor ha van még a queueban, akkor ő fog vele foglalkozni, mindenféle context switch nélkül. Ha jön be másodpercenként ezer kis csomag, akkor amíg van ideje a threadnek (mert az oprendszer őt futtatja) addig ő fog dolgozni az összesen, context switch nélkül.
A CLR csinál pontosan egy Completion Port-ot, és egy io thread poolt, és összerendeli őket. Ha a BeginReadedbe olyan callback függvényt adtál be, ami nem blokkol, akkor a legnagyobb terhelésnél is egy szál fog minden bejövő kérést kiszolgálni. Bazi hatékony. Amikor lelövöd a socketet, amire kiadtad az olvasó (vagy író) műveletet, akkor is hívodik a rutinod, csak hibával ugrik ki belőle az EndRead. Szóval ha teljesítményigény van, akkor nem jöhet más szóba, csak APM. Található a neten cikk, hogy az APM alatt működö Completion Port mennyivel hatékonyabb, mint a többi. Egy szállal kiszolgál mindent, ha nem blokkol be a szál valami béna waitforsingleobject vagy testvére miatt. Ekkor sem történik nagy baj, indít egy másik szálat a pool-ból, és egy darabig két szál megy, de aztán az egyiket nem engedi szóhoz jutni megint.</description>
		<content:encoded><![CDATA[<p>Hát, bocs, csak most tévedtem ide, de ezekre a megoldásokra tényeleg az APM és a beginxxx megoldások a jók. Nem okoznak context switchet, leírom miért:</p>
<p>A CLR ezekre a feladatokra a Completion Port-okat használja. Röviden a Completion Port úgy működik, hogy az I/O Manager a Completion Port queue-jába tud aszinkron műveletek eredményeit bepakolni, mint pl amikor a socketről olvas valaki aszinkron, vagy file-ból aszinkron. A Completion Port-ra lehet ráállítani thread-eket, amik felébrednek akkor, amikor jött valami a queue-jába. De olyan okos ez a windows, hogy thread pool-hoz is hozzá tud párosítani egy Completion Port-ot, és akkor a thread pool thread ébred fel.<br />
Van mégegy jó tulajdonsága a Completion Port-nak. Mint a hogy megemlítetted, egyéb módokon (pl ha az ember Completion Routinokat használ az aszinkron hívásaihoz) akkor context switchek meg egyéb csúnya dolgok történnek, de Completion Port-nál nem. Olyan módon van megcsinálva, hogy a Completion Portnál be lehet egyrészt állítani, hogy hány szálat engedjen futni maximum (akkor is, ha több fülel a completion porton). Egy egymagos gépen ezt a számot egyre érdemes rakni, egy négy magos gépen meg négyre. Ez azért jó, mert egyszerre csak egy szál foglalkozik a kész eredményekkel, nem kell őket váltogatni. Amikor ez a szál végez az egyik completion packet feldolgozásával, akkor ha van még a queueban, akkor ő fog vele foglalkozni, mindenféle context switch nélkül. Ha jön be másodpercenként ezer kis csomag, akkor amíg van ideje a threadnek (mert az oprendszer őt futtatja) addig ő fog dolgozni az összesen, context switch nélkül.<br />
A CLR csinál pontosan egy Completion Port-ot, és egy io thread poolt, és összerendeli őket. Ha a BeginReadedbe olyan callback függvényt adtál be, ami nem blokkol, akkor a legnagyobb terhelésnél is egy szál fog minden bejövő kérést kiszolgálni. Bazi hatékony. Amikor lelövöd a socketet, amire kiadtad az olvasó (vagy író) műveletet, akkor is hívodik a rutinod, csak hibával ugrik ki belőle az EndRead. Szóval ha teljesítményigény van, akkor nem jöhet más szóba, csak APM. Található a neten cikk, hogy az APM alatt működö Completion Port mennyivel hatékonyabb, mint a többi. Egy szállal kiszolgál mindent, ha nem blokkol be a szál valami béna waitforsingleobject vagy testvére miatt. Ekkor sem történik nagy baj, indít egy másik szálat a pool-ból, és egy darabig két szál megy, de aztán az egyiket nem engedi szóhoz jutni megint.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Zsolt Soczo</title>
		<link>http://soci.hu/blog/index.php/2010/07/02/blocking-read-kivaltasa-mivel/#comment-78841</link>
		<dc:creator>Zsolt Soczo</dc:creator>
		<pubDate>Fri, 09 Jul 2010 20:57:50 +0000</pubDate>
		<guid isPermaLink="false">http://soci.hu/blog/?p=1092#comment-78841</guid>
		<description>Megírtam, async és sync keverékkel. A napokban rövidítve kirakom ide.</description>
		<content:encoded><![CDATA[<p>Megírtam, async és sync keverékkel. A napokban rövidítve kirakom ide.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Hamurabi</title>
		<link>http://soci.hu/blog/index.php/2010/07/02/blocking-read-kivaltasa-mivel/#comment-78774</link>
		<dc:creator>Hamurabi</dc:creator>
		<pubDate>Mon, 05 Jul 2010 07:41:22 +0000</pubDate>
		<guid isPermaLink="false">http://soci.hu/blog/?p=1092#comment-78774</guid>
		<description>Na ezt 100%-ban nem értem. Én egy helyen, ahol párhuzamosan olvasom és írom a tcp csatornát (2 szeparált thread-ben) ott a .DataAvailable-t használom while-ban egy thread.sleep-el különben 100-ra megy a proci :-D

Ez nagyon köbalta módszer? Azzal főznék, ami van és erre jutottam.

A while feltételében meg lehet amit akarsz.

A contextswitch eléggé erősnek tűnik nekem. Biztos az?</description>
		<content:encoded><![CDATA[<p>Na ezt 100%-ban nem értem. Én egy helyen, ahol párhuzamosan olvasom és írom a tcp csatornát (2 szeparált thread-ben) ott a .DataAvailable-t használom while-ban egy thread.sleep-el különben 100-ra megy a proci :-D</p>
<p>Ez nagyon köbalta módszer? Azzal főznék, ami van és erre jutottam.</p>
<p>A while feltételében meg lehet amit akarsz.</p>
<p>A contextswitch eléggé erősnek tűnik nekem. Biztos az?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Soczó Zsolt</title>
		<link>http://soci.hu/blog/index.php/2010/07/02/blocking-read-kivaltasa-mivel/#comment-78745</link>
		<dc:creator>Soczó Zsolt</dc:creator>
		<pubDate>Sat, 03 Jul 2010 08:35:17 +0000</pubDate>
		<guid isPermaLink="false">http://soci.hu/blog/?p=1092#comment-78745</guid>
		<description>Persze, de ha nem avalilable, akkor meg pollozok. Esetleg Thread.Sleep(0)-val, de ettől meg lassú lehet a dolog.</description>
		<content:encoded><![CDATA[<p>Persze, de ha nem avalilable, akkor meg pollozok. Esetleg Thread.Sleep(0)-val, de ettől meg lassú lehet a dolog.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: libor</title>
		<link>http://soci.hu/blog/index.php/2010/07/02/blocking-read-kivaltasa-mivel/#comment-78742</link>
		<dc:creator>libor</dc:creator>
		<pubDate>Sat, 03 Jul 2010 06:32:19 +0000</pubDate>
		<guid isPermaLink="false">http://soci.hu/blog/?p=1092#comment-78742</guid>
		<description>NetworkStream.DataAvailable a te barátod.  Előbb mindig ránézel vele a NetworkStream-re és csak akkor olvasol (a Read-del) ha van mit, ha pedig van mit olvasni, akkor a Read azonnal visszatér és nem blokkol.</description>
		<content:encoded><![CDATA[<p>NetworkStream.DataAvailable a te barátod.  Előbb mindig ránézel vele a NetworkStream-re és csak akkor olvasol (a Read-del) ha van mit, ha pedig van mit olvasni, akkor a Read azonnal visszatér és nem blokkol.</p>
]]></content:encoded>
	</item>
</channel>
</rss>

