<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Sleep</title>
		<link>http://www.allegro.cc/forums/view/586376</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 12 Jul 2006 09:49:37 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>How does sleep work, in its many variations?<br />The kind of sleep I&#39;m talking about is any function that causes the thread to go into a state of sleep for a specified period of time, during which time it consumes little to no CPU.<br /><span class="source-code"><a href="http://www.delorie.com/djgpp/doc/libc/libc_731.html" target="_blank">sleep</a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></span><br />Platforms: Windows, Mac, Linux, more (maybe, don&#39;t care that much).</p><p>Any information on how these types of functions work internally would be helpful.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Billybob)</author>
		<pubDate>Mon, 10 Jul 2006 03:07:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Er, it does exactly what you said. It tells the scheduler not to activate the thread for a certain number of milliseconds. how do i shot web?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (X-G)</author>
		<pubDate>Mon, 10 Jul 2006 03:09:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Doesn&#39;t it work in the same way as the 
</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
function?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paladin)</author>
		<pubDate>Mon, 10 Jul 2006 03:20:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think he means he wants to know how the code works for sleep(). I looked through sleep() in glibc, glibc/sysdeps/unix/clock_nanosleep.c and glibc/sysdeps/unix/sysv/linux/sleep.c, but it looks like a system call is made at some point so the code isnt very interesting and its very ugly :p.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kazzmir)</author>
		<pubDate>Mon, 10 Jul 2006 03:27:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Naturally it&#39;s a system call. Scheduling is done by the OS kernel. If he wants to know more he has to study the scheduler code for whatever OS he&#39;s interested in.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (X-G)</author>
		<pubDate>Mon, 10 Jul 2006 03:35:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Some sleep tidbits:</p><p>It&#39;s been a while since I looked at this, but I know sleep&#39;s resolution varies from OS to OS. I think it&#39;s something like 20 milliseconds under Windows, and as low as 10 milliseconds under Linux. That is to say, if you ask for a sleep of 2 milliseconds your thread may not be scheduled to run again until at least 10 milliseconds have passed.</p><p>Under Linux there&#39;s also the nanosleep function, which is what I tend to use.</p><p>Finally, if you call sleep with a time of 0, it yields the thread with no minimum delay before it can reactivate - see also <a href="http://www.llnl.gov/computing/tutorials/pthreads/man/pthread_yield.txt">pthread_yield</a>.</p><p>[EDIT]Here we go: </p><div class="quote_container"><div class="title">man nanosleep said:</div><div class="quote"><p>
The current implementation of nanosleep() is based on the normal kernel timer mechanism, which has  a  resolution of  1/HZ s (i.e, 10 ms on Linux/i386 and 1 ms on Linux/Alpha).  Therefore, nanosleep() pauses always for at least the specified time, however it can take up to 10 ms longer than specified  until  the  process  becomes  runnable again.  For  the  same reason, the value returned in case of a delivered signal in *rem is usually rounded to the next larger multiple of 1/HZ s.
</p></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Myrdos)</author>
		<pubDate>Mon, 10 Jul 2006 03:56:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
(i.e, 10 ms on Linux/i386 and 1 ms on Linux/Alpha).
</p></div></div><p>heh, my HZ is set to 1000, instead of the old default of 100.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Mon, 10 Jul 2006 05:27:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Darn. I was hoping it didn&#39;t dig right into the OS like that. Oh well.<br />I wanted to try and write a sleep function that used a more accurate timer, but I guess that&#39;s not possible. <img src="http://www.allegro.cc/forums/smileys/cry.gif" alt=":&#39;(" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Billybob)</author>
		<pubDate>Mon, 10 Jul 2006 05:48:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>250 Hz here, which is 4 ms granularity. Tomasu has 1 ms...</p><p>The only issues I have with speed are my CPU frequency modulates down to 375 MHz and up to 3 GHz. I think UT 2004 caluclates the clock speed when it is running at about 1275 MHz, so one can listen to the audio in game and hear it change pitch as the frequency scales. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Mon, 10 Jul 2006 05:52:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I guess that&#39;s not possible.
</p></div></div><p>

Unfortunately, that is true. Process scheduling is very tightly tied to the core of the operating system.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (X-G)</author>
		<pubDate>Mon, 10 Jul 2006 06:04:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>There are options available - I knew a guy who used <a href="http://home.gna.org/adeos/">Adeos</a> with a Linux system to do very precise timing for mobile robotics control. I took a look at it myself, but it seems very complex. Or you could go with a Real Time OS, or something like the <a href="https://www.rtai.org/">RealTime Application Interface for Linux</a>. (Though I don&#39;t endorse it, as I haven&#39;t tried it. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />)</p><p>But none of these solutions can guarantee the timing - it&#39;s all best effort. Anything that uses a scheduler (like an OS) isn&#39;t hard real time, because if you burden the system, it can&#39;t keep up with the schedule, and your task doesn&#39;t happen when it&#39;s supposed to. Anything at the millisecond-level is very prone to error (think a couple hundred milliseconds here) depending on what you&#39;re running on other threads/processes. Though it can be quite accurate if your system is unburdened.</p><p>Example: Using a non-real time Debian Linux system, I was trying to control a robot&#39;s speed using PWM. (Turn the power on and off hundreds of times per second to set the overall speed.) It was fine, but whenever I compressed an image from the camera into JPEG, the PWMing thread wouldn&#39;t be scheduled for a few hundred millisecs. If the power was off, the robot jerked to a halt. If the power was on, WHAM! into the wall.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Myrdos)</author>
		<pubDate>Mon, 10 Jul 2006 08:12:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I don&#39;t see how it&#39;s unstable. All the scheduler has to do is check the time to see if the thread should wake up. If so, wake it up. The time being determined by a high resolution timer. What&#39;s so difficult and unstable about that?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Billybob)</author>
		<pubDate>Mon, 10 Jul 2006 09:43:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
You are forgetting that other programs are running too, which may mean the scheduler misses a few milliseconds due to those programs working.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Mon, 10 Jul 2006 14:52:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It instructs the scheduler to get out its pocket watch and wave it in front of the thread, saying &quot;Your going into a deep sleep&quot;, then sometimes when its in a deep hypnotic trance, the scheudle tells it to act like a chicken, and has a good laugh.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (A J)</author>
		<pubDate>Mon, 10 Jul 2006 14:58:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
What&#39;s so difficult and unstable about that?
</p></div></div><p>Heheheh. Try it and see what happens!</p><p><a href="http://junction.bafsoft.com/timerdemo.zip">Here</a> are two programs: ptimer and burden. Ptimer tries to cout a message every 500 milliseconds. Burden endlessly busy waits. If you run ptimer on it&#39;s own, it performs as expected. If you run ptimer and then start burden, look at the elapsed time:
</p><div class="quote_container"><div class="title">ptimer said:</div><div class="quote"><p>
C:\Documents and Settings\David McCallum\My Documents\tdemo&gt;ptimer<br />Time elapsed: 1532815 Time: 0::0<br />Time elapsed: 500 Time: 1532::815<br />Time elapsed: 500 Time: 1533::315<br />Time elapsed: 500 Time: 1533::815<br />Time elapsed: 500 Time: 1534::315<br />Time elapsed: 500 Time: 1534::815<br />Time elapsed: 500 Time: 1535::315<br />Time elapsed: 500 Time: 1535::815<br />Time elapsed: 545 Time: 1536::315  //started burden here<br />Time elapsed: 558 Time: 1536::860<br />Time elapsed: 500 Time: 1537::418<br />Time elapsed: 563 Time: 1537::918<br />Time elapsed: 563 Time: 1538::481<br />Time elapsed: 562 Time: 1539::44<br />Time elapsed: 563 Time: 1539::606<br />Time elapsed: 578 Time: 1540::169<br />Time elapsed: 562 Time: 1540::747<br />Time elapsed: 563 Time: 1541::309<br />Time elapsed: 579 Time: 1541::872<br />Time elapsed: 562 Time: 1542::451<br />Time elapsed: 578 Time: 1543::13<br />Time elapsed: 562 Time: 1543::591<br />Time elapsed: 563 Time: 1544::153<br />Time elapsed: 563 Time: 1544::716<br />Time elapsed: 562 Time: 1545::279<br />Time elapsed: 563 Time: 1545::841<br />Time elapsed: 562 Time: 1546::404<br />Time elapsed: 563 Time: 1546::966<br />Time elapsed: 562 Time: 1547::529<br />Time elapsed: 563 Time: 1548::91   //turned off burden here<br />Time elapsed: 500 Time: 1548::654<br />Time elapsed: 500 Time: 1549::154<br />Time elapsed: 500 Time: 1549::654<br />Time elapsed: 500 Time: 1550::154<br />Time elapsed: 500 Time: 1550::654<br />Time elapsed: 500 Time: 1551::154<br />Time elapsed: 500 Time: 1551::654
</p></div></div><p> I notice that if you put the window focus back to ptimer, it keeps a lot better time than if you focus on burden. Under linux, I sometimes ended up with elapsed times of more than two seconds using just one burden program!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Myrdos)</author>
		<pubDate>Mon, 10 Jul 2006 21:01:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Under linux, I sometimes ended up with elapsed times of more than two seconds using just one burden program!
</p></div></div><p>Woah now! Before people start makign crazy assumptions about Linux multitasking and comparing it with pre-Mac OS X multitasking, let&#39;s ask what kernel version you have and what CONFIG_PREMEMPT you have:
</p><pre>$ gzcat /proc/config.gz |grep PREEMPT
# CONFIG_PREEMPT_NONE is not set
# CONFIG_PREEMPT_VOLUNTARY is not set
CONFIG_PREEMPT=y
CONFIG_PREEMPT_BKL=y</pre><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Mon, 10 Jul 2006 21:09:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">a.out said:</div><div class="quote"><p>
myrdos@travelmate:~/temp$ ./a.out<br />Time elapsed: 65535280 Time: 0::0<br />Time elapsed: 500 Time: 1152548294::280<br />Time elapsed: 500 Time: 1152548294::780<br />Time elapsed: 500 Time: 1152548295::280<br />Time elapsed: 500 Time: 1152548295::780<br />Time elapsed: 500 Time: 1152548296::280<br />Time elapsed: 500 Time: 1152548296::780<br />Time elapsed: <b>827</b> Time: 1152548297::280  //started burden here<br />Time elapsed: 564 Time: 1152548298::107<br />Time elapsed: 500 Time: 1152548298::671<br />Time elapsed: 532 Time: 1152548299::171<br />Time elapsed: 500 Time: 1152548299::703<br />Time elapsed: 528 Time: 1152548300::203<br />Time elapsed: 500 Time: 1152548300::731<br />Time elapsed: 528 Time: 1152548301::231<br />Time elapsed: 500 Time: 1152548301::759<br />Time elapsed: 528 Time: 1152548302::259<br />Time elapsed: 500 Time: 1152548302::787<br />Time elapsed: 524 Time: 1152548303::287<br />Time elapsed: 500 Time: 1152548303::811<br />Time elapsed: 524 Time: 1152548304::311  //turned off burden here<br />Time elapsed: 500 Time: 1152548304::835<br />Time elapsed: 500 Time: 1152548305::335<br />Time elapsed: 500 Time: 1152548305::835<br />Time elapsed: 500 Time: 1152548306::335<br />Time elapsed: 500 Time: 1152548306::835<br />Time elapsed: 500 Time: 1152548307::335<br />Time elapsed: 500 Time: 1152548307::835
</p></div></div><p> The big spike in expected times happens when burden is first started. Afterwards, it seems to be closer to 500 milliseconds than in Windows.</p><div class="quote_container"><div class="title">$ gzcat /proc/config.gz |grep PREEMPT said:</div><div class="quote"><p>
bash: gzcat: command not found
</p></div></div><div class="quote_container"><div class="title">$ cat /proc/config.gz |grep PREEMPT said:</div><div class="quote"><p>
cat: /proc/config.gz: No such file or directory
</p></div></div><div class="quote_container"><div class="title">uname -a said:</div><div class="quote"><p>
Linux travelmate 2.6.15-25-386 #1 PREEMPT Wed Jun 14 11:25:49 UTC 2006 i686 GNU/Linux
</p></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Myrdos)</author>
		<pubDate>Mon, 10 Jul 2006 21:24:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The fact that PREEMPT is in your kernel version is odd. I suspect it is voluntary preemption, which means that while the program is being loaded into memory (which is a system call), no other tasks can execute.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Mon, 10 Jul 2006 21:34:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well, show me how it runs on your computer then:</p><p><a href="http://junction.bafsoft.com/timerdemo.zip">http://junction.bafsoft.com/timerdemo.zip</a>
</p><div class="source-code snippet"><div class="inner"><pre>g<span class="k3">+</span><span class="k3">+</span> heavyburden.cpp <span class="k3">-</span>o burden <span class="k3">-</span>Wall
g<span class="k3">+</span><span class="k3">+</span> precisetimer.cpp <span class="k3">-</span>Wall
</pre></div></div><p>

[EDIT]Voluntary preemption!? That hasn&#39;t been used since forever! I sincerely doubt that&#39;s what&#39;s going on here.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Myrdos)</author>
		<pubDate>Mon, 10 Jul 2006 21:39:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><pre>cgames@ryan ~/test/tdemo $ ./a.out
Time elapsed: 65535174 Time: 0::0
Time elapsed: 500 Time: 1152549937::174
Time elapsed: 500 Time: 1152549937::674
Time elapsed: 500 Time: 1152549938::174
Time elapsed: 500 Time: 1152549938::674
Time elapsed: 500 Time: 1152549939::174
Time elapsed: 500 Time: 1152549939::674
Time elapsed: 500 Time: 1152549940::174
Time elapsed: 500 Time: 1152549940::674
Time elapsed: 500 Time: 1152549941::174
Time elapsed: 500 Time: 1152549941::674
Time elapsed: 500 Time: 1152549942::174
Time elapsed: 500 Time: 1152549942::674
Time elapsed: 500 Time: 1152549943::174</pre><p>Okay, so the test wasn&#39;t actually fair because I have two processors. Let me run two burdens now:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>cgames@ryan ~<span class="k3">/</span>test<span class="k3">/</span>tdemo $ .<span class="k3">/</span>a.out <span class="k3">&gt;</span> ptimer.log <span class="k3">&amp;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_731.html" target="_blank">sleep</a> <span class="n">2</span><span class="k2">;</span> .<span class="k3">/</span>burden <span class="k3">&amp;</span> .<span class="k3">/</span>burden <span class="k3">&amp;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_731.html" target="_blank">sleep</a> <span class="n">2</span><span class="k2">;</span> killall burden<span class="k2">;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_731.html" target="_blank">sleep</a> <span class="n">2</span><span class="k2">;</span> killall a.out</td></tr><tr><td class="number">2</td><td><span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="n">13157</span></td></tr><tr><td class="number">3</td><td><span class="k2">[</span><span class="n">2</span><span class="k2">]</span> <span class="n">13159</span></td></tr><tr><td class="number">4</td><td><span class="k2">[</span><span class="n">3</span><span class="k2">]</span> <span class="n">13160</span></td></tr><tr><td class="number">5</td><td><span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k3">-</span>  Terminated              .<span class="k3">/</span>burden</td></tr><tr><td class="number">6</td><td><span class="k2">[</span><span class="n">3</span><span class="k2">]</span><span class="k3">+</span>  Terminated              .<span class="k3">/</span>burden</td></tr><tr><td class="number">7</td><td>cgames@ryan ~<span class="k3">/</span>test<span class="k3">/</span>tdemo $</td></tr><tr><td class="number">8</td><td><span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k3">+</span>  Terminated              .<span class="k3">/</span>a.out <span class="k3">&gt;</span>ptimer.log</td></tr><tr><td class="number">9</td><td>cgames@ryan ~<span class="k3">/</span>test<span class="k3">/</span>tdemo $ cat ptimer.log</td></tr><tr><td class="number">10</td><td>Time elapsed: <span class="n">65535524</span> Time: <span class="n">0</span><span class="k2">:</span><span class="k2">:</span><span class="n">0</span></td></tr><tr><td class="number">11</td><td>Time elapsed: <span class="n">500</span> Time: <span class="n">1152550242</span><span class="k2">:</span><span class="k2">:</span><span class="n">524</span></td></tr><tr><td class="number">12</td><td>Time elapsed: <span class="n">500</span> Time: <span class="n">1152550243</span><span class="k2">:</span><span class="k2">:</span><span class="n">24</span></td></tr><tr><td class="number">13</td><td>Time elapsed: <span class="n">500</span> Time: <span class="n">1152550243</span><span class="k2">:</span><span class="k2">:</span><span class="n">524</span></td></tr><tr><td class="number">14</td><td>Time elapsed: <span class="n">500</span> Time: <span class="n">1152550244</span><span class="k2">:</span><span class="k2">:</span><span class="n">24</span></td></tr><tr><td class="number">15</td><td>Time elapsed: <span class="n">500</span> Time: <span class="n">1152550244</span><span class="k2">:</span><span class="k2">:</span><span class="n">524</span></td></tr><tr><td class="number">16</td><td>Time elapsed: <span class="n">500</span> Time: <span class="n">1152550245</span><span class="k2">:</span><span class="k2">:</span><span class="n">24</span></td></tr><tr><td class="number">17</td><td>Time elapsed: <span class="n">500</span> Time: <span class="n">1152550245</span><span class="k2">:</span><span class="k2">:</span><span class="n">524</span></td></tr><tr><td class="number">18</td><td>Time elapsed: <span class="n">500</span> Time: <span class="n">1152550246</span><span class="k2">:</span><span class="k2">:</span><span class="n">24</span></td></tr><tr><td class="number">19</td><td>Time elapsed: <span class="n">500</span> Time: <span class="n">1152550246</span><span class="k2">:</span><span class="k2">:</span><span class="n">524</span></td></tr><tr><td class="number">20</td><td>Time elapsed: <span class="n">500</span> Time: <span class="n">1152550247</span><span class="k2">:</span><span class="k2">:</span><span class="n">24</span></td></tr><tr><td class="number">21</td><td>Time elapsed: <span class="n">500</span> Time: <span class="n">1152550247</span><span class="k2">:</span><span class="k2">:</span><span class="n">524</span></td></tr><tr><td class="number">22</td><td>Time elapsed: <span class="n">500</span> Time: <span class="n">1152550248</span><span class="k2">:</span><span class="k2">:</span><span class="n">24</span></td></tr><tr><td class="number">23</td><td>cgames@ryan ~<span class="k3">/</span>test<span class="k3">/</span>tdemo $ .<span class="k3">/</span>a.out <span class="k3">&gt;</span> ptimer.log <span class="k3">&amp;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_731.html" target="_blank">sleep</a> <span class="n">2</span><span class="k2">;</span> .<span class="k3">/</span>burden <span class="k3">&amp;</span> .<span class="k3">/</span>burden <span class="k3">&amp;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_731.html" target="_blank">sleep</a> <span class="n">2</span><span class="k2">;</span> killall burden<span class="k2">;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_731.html" target="_blank">sleep</a> <span class="n">2</span><span class="k2">;</span> killall a.out</td></tr><tr><td class="number">24</td><td><span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="n">13171</span></td></tr><tr><td class="number">25</td><td><span class="k2">[</span><span class="n">2</span><span class="k2">]</span> <span class="n">13173</span></td></tr><tr><td class="number">26</td><td><span class="k2">[</span><span class="n">3</span><span class="k2">]</span> <span class="n">13174</span></td></tr><tr><td class="number">27</td><td><span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k3">-</span>  Terminated              .<span class="k3">/</span>burden</td></tr><tr><td class="number">28</td><td><span class="k2">[</span><span class="n">3</span><span class="k2">]</span><span class="k3">+</span>  Terminated              .<span class="k3">/</span>burden</td></tr><tr><td class="number">29</td><td>cgames@ryan ~<span class="k3">/</span>test<span class="k3">/</span>tdemo $</td></tr><tr><td class="number">30</td><td><span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k3">+</span>  Terminated              .<span class="k3">/</span>a.out <span class="k3">&gt;</span>ptimer.log</td></tr><tr><td class="number">31</td><td>cgames@ryan ~<span class="k3">/</span>test<span class="k3">/</span>tdemo $ cat ptimer.log</td></tr><tr><td class="number">32</td><td>Time elapsed: <span class="n">65535225</span> Time: <span class="n">0</span><span class="k2">:</span><span class="k2">:</span><span class="n">0</span></td></tr><tr><td class="number">33</td><td>Time elapsed: <span class="n">500</span> Time: <span class="n">1152550281</span><span class="k2">:</span><span class="k2">:</span><span class="n">225</span></td></tr><tr><td class="number">34</td><td>Time elapsed: <span class="n">500</span> Time: <span class="n">1152550281</span><span class="k2">:</span><span class="k2">:</span><span class="n">725</span></td></tr><tr><td class="number">35</td><td>Time elapsed: <span class="n">500</span> Time: <span class="n">1152550282</span><span class="k2">:</span><span class="k2">:</span><span class="n">225</span></td></tr><tr><td class="number">36</td><td>Time elapsed: <span class="n">500</span> Time: <span class="n">1152550282</span><span class="k2">:</span><span class="k2">:</span><span class="n">725</span></td></tr><tr><td class="number">37</td><td>Time elapsed: <span class="n">817</span> Time: <span class="n">1152550283</span><span class="k2">:</span><span class="k2">:</span><span class="n">225</span></td></tr><tr><td class="number">38</td><td>Time elapsed: <span class="n">504</span> Time: <span class="n">1152550284</span><span class="k2">:</span><span class="k2">:</span><span class="n">42</span></td></tr><tr><td class="number">39</td><td>Time elapsed: <span class="n">500</span> Time: <span class="n">1152550284</span><span class="k2">:</span><span class="k2">:</span><span class="n">546</span></td></tr><tr><td class="number">40</td><td>Time elapsed: <span class="n">500</span> Time: <span class="n">1152550285</span><span class="k2">:</span><span class="k2">:</span><span class="n">46</span></td></tr><tr><td class="number">41</td><td>Time elapsed: <span class="n">500</span> Time: <span class="n">1152550285</span><span class="k2">:</span><span class="k2">:</span><span class="n">546</span></td></tr><tr><td class="number">42</td><td>Time elapsed: <span class="n">500</span> Time: <span class="n">1152550286</span><span class="k2">:</span><span class="k2">:</span><span class="n">46</span></td></tr><tr><td class="number">43</td><td>Time elapsed: <span class="n">500</span> Time: <span class="n">1152550286</span><span class="k2">:</span><span class="k2">:</span><span class="n">546</span></td></tr></tbody></table></div></div><p>

[append]</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Voluntary preemption!? That hasn&#39;t been used since forever!
</p></div></div><p>What are you talking about? It&#39;s still in the kernel options...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Mon, 10 Jul 2006 21:53:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
What are you talking about?
</p></div></div><p>I mean that it doesn&#39;t work worth a darn, and no modern desktop OS is going to enable it by default. (I had no idea that the option to enable it even existed -- can you even run normal programs that don&#39;t manually relinquish the processor in such a system?) We are talking about the same thing, right? A scheduler that can&#39;t force a process to suspend execution and perform a context switch to let another process run? I heard very early Macs used such a system, but it bombed because every developer thought their application needed more CPU time than the others.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Okay, so the test wasn&#39;t actually fair because I have two processors.
</p></div></div><p>Sweet.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Myrdos)</author>
		<pubDate>Mon, 10 Jul 2006 22:07:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
We are talking about the same thing, right?
</p></div></div><p>Heh, no. There are 3 preemption models in the kernel:</p><p>None: whenever a system call is executing, no task will execute until the system task finishes.<br />Voluntary: the kernel has some points in the code where it will voluntarily relinquish CPU. When this happens, other tasks execute.<br />Forced (don&#39;t know what this one is actually called, but it is what I have enabled): the kernel can be preempted anywhere where it is safe.</p><p>An additional kernel option is &quot;preempt the big kernel lock&quot;, which adds even more opportunity for preemption.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Mon, 10 Jul 2006 22:16:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well I guess I shouldn&#39;t talk, I&#39;ve never designed a scheduler. Seems to me like this wouldn&#39;t be an issue, but then again if they could fix it they would.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Billybob)</author>
		<pubDate>Tue, 11 Jul 2006 01:59:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Seems to you that what wouldn&#39;t be an issue? What, you want every process to always sleep for exactly the time it wants? Not only is that not possible, it also requires far more CPU just to keep track of the processes. But if you want down to 1 ms accuracy, just adjust your kernel config (Linux; Windows you can&#39;t do anything about it).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Tue, 11 Jul 2006 04:27:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You can adjust scheduling to 1 ms accuracy on windows.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (A J)</author>
		<pubDate>Tue, 11 Jul 2006 15:03:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You going to provide any more information on the subject?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Tue, 11 Jul 2006 15:56:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Are you asking me too ?</p><p>win32::timeBeginPeriod()
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (A J)</author>
		<pubDate>Wed, 12 Jul 2006 03:53:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Very handy. Thanks for the info. Is there any way we might be able to integrate this into Allegro? Perhaps if someone calls rest(1), call timeBeginPeriod(1) the first time it happens?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Wed, 12 Jul 2006 05:08:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>there are subtle problems that <b>may</b> occur whilst using this timeBeginPeriod(1)&#39;feature&#39;.. M$ mentions it occasionaly in there &quot;docs&quot; but never really gets to the point, perhaps as its a very advanced topic.  </p><p>But from the limited data i have on it, i think the problems relates to possible drift, in that you dont always get exactly 1ms, which is M$ way of saying &quot;you can ask for 1ms, and we can tell you its 1ms, but we were too stoopid to actually code it properly, so you <b>may</b> get something around 1ms&quot;.  I think they also never mentioned it too much in the older literature because on older/slower hardware running at 1ms res caused excessive overhead and acute starvation, thereby making what programmers thought was helping actually worse; however on the newer/faster Ghz machines 1ms should be fine, i have ran 1ms on an AMD2500+ for over a year without problems, and that is a fairly old/slow machine by todays standards.</p><p>I also have test code that i use to prove it on each machine i use, and on the Ghz machines, its pretty close to 1ms.</p><p>want/need code.. just ask (i have to dig it out, so will not post yet until needed).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (A J)</author>
		<pubDate>Wed, 12 Jul 2006 09:49:37 +0000</pubDate>
	</item>
</rss>
