[M3devel] real timer vs. virtual timer in user threads?

Tony Hosking hosking at cs.purdue.edu
Mon Dec 14 17:55:14 CET 2009


Scheduler.Yield()?
We allow programmers to disable preemptive thread scheduling with user-level threads and simply get yields at appropriate thread primitives (LOCK, Wait, etc.).
If you have a loop like that with a non-preemptive user-level thread scheduler the only way to guarantee switching is to call Yield.

On 14 Dec 2009, at 11:31, Jay K wrote:

> Ok, so I tried sched_yield in my C testbed (m3core/src/unix/Common/context/sigaltstack).
> It still seemed to hang.
> (I realize you might not have meant that.)
> 
> 
> So what happens if none of our user threads have any work? Is that possible?
> Sure, I can make it so.
>   Just create a bunch of threads that call the Modula-3 equivalent of sleep(big number).
> Will they actually wake up after that time?
> And we won't spin the CPU in the meantime?
> I guess I should test it out..
> 
> 
> I can see that "virtual" does seem maybe better than "real", if the virtual one is guaranteed to progress.
> But I wonder also..you have OpenBSD/x86 or sparc64?
> cd to that test bed, make, ./tcontext.
> It always seemed kind of jerky.
> I bet it'll seem "faster" with "real" timer.
> 
>  - Jay
> 
> 
> From: hosking at cs.purdue.edu
> Date: Mon, 14 Dec 2009 10:39:31 -0500
> To: jkrell at elego.de
> CC: m3commit at elegosoft.com
> Subject: Re: [M3commit] CVS Update: cm3
> 
> Main thread should call Yield if you want that behavior, not sleep.
> 
> On 14 Dec 2009, at 14:57, Jay Krell wrote:
> 
> CVSROOT:	/usr/cvs
> Changes by:	jkrell at birch.	09/12/14 14:57:30
> 
> Added files:
> 	cm3/m3-libs/m3core/src/unix/Common/context/sigaltstack/: 
> 	                                                         Makefile 
> 	                                                         config.c 
> 	                                                         context.c 
> 	                                                         context.h 
> 	                                                         m3makefile 
> 	                                                         tcontext.c 
> 
> Log message:
> 	working version of http://www.engelschall.com/pw/usenix/2000/pmt-html/
> 	- This should be moved to m3core/src/thread/POSIX
> 	- Notice how I switched from virtual timer to real timer,
> 	in the test case that mimics m3core/src/thread/POSIX.
> 	"This seems to work much better."
> 	In particular, if the main thread does while (1) sleep(0)
> 	to let things run, nothing runs. The virtual time doesn't
> 	run down at all. If I make it a busy wait "while (1) ;" then
> 	it does work.
> 	
> 	Note that Apple seems very down on supplying get/make/set/swapcontext (read the mailing lists).
> 	This solution might be preferred? Though it is slower to create a thread here, due to
> 	extra gymnastics to establish the initial context.
> 	
> 	Also still some experiments to try.
> 	_setjmp vs. setjmp vs. sigsetjmp.
> 	Best is probably sigsetjmp(1).
> 	using the same signal in both parts
> 
> 




More information about the M3devel mailing list