[M3devel] dynamic chose between user/kernel threads?

Tony Hosking hosking at cs.purdue.edu
Thu Jan 8 05:58:38 CET 2009


On 8 Jan 2009, at 14:10, Jay wrote:

> Olaf understood the point (I think). :)
>
> Some programs, people say, and I believe, run "better" (faster,  
> without running out of address space) with user threads instead of  
> kernel threads.

Is this still true for modern kernel thread systems?

> On systems that have both.
> A good example might be a program that needs lots of threads and  
> therefore small stacks, and the kernel threads, due to code below  
> the Modula-3 runtime, might force fairly large stacks. (Such a  
> program might have to adjust thread size differently for different  
> threads, and only call into the underlying system on threads with  
> larger stacks.)

In a systems programming language like Modula-3 shouldn't threads have  
a relationship to the system?

> It might be nice for such programs to be able to mandate or request  
> (two slightly different things) that the user thread library be used  
> by them, even if the platform's default is to use kernel threads.

This will need to be a link-time distinction.  I would hate to have  
both kernel and user thread code live in the same compiled run-time  
system.

> The only minor detail then is, how to express the request, and the  
> precise meaning.
> It is a request or a mandate?

I see no problem with factoring out the threads subsystem as a  
separate library and linking accordingly.

> As well, if the issue is address space, sholud there a "built in"  
> way to only make the request on 32bit platforms, or should uses  
> manually say if equal (WORD_SIZE, "32BITS")?
>
> Is it a boolean or an enum?
> Cygwin might conceivably get pthreads support (Cygwin has it, but  
> Modula-3/Cygwin does not).
> Therefore, is the choice among "posix" threads, "pthreads" and "NT"  
> threads?
> Or just user vs. kernel?

I would argue for user vs. kernel.

> I think the "important" part here is easy to implement.
> But again..

And managing the state-space explosion that multiple choices might  
entail.  I would like to avoid that.

> The easier straightforward implementation always links both pieces  
> of code in and makes a choice early in startup as to which to use,  
> either setting a boolean, or an enum, or a pointer to a record of  
> function pointers. This means that people that don't care to ever  
> use user threads pay a small price, in code bloat and probably in a  
> few extra instructions per certain functions. This is probably ok.

I am not so sure, since it would entail some fairly low-level and  
expensive decisions that would best instead be done at link-time.

> However if that was not ok, the choice could be made at link time  
> and only be supported for standalone programs.

Actually, for non-standalone (dynamically-linked) code we could make  
the choice at dynamic load time using the OS's support for dynamic  
library choice.

I note that Solaris (but not Solaris Modula-3) currently lets  
dynamically linked C programs choose among 3 different threads  
implementations dynamically.

>
>
>  - Jay
>
>
>
>
> CC: wagner at elegosoft.com; m3devel at elegosoft.com
> From: hosking at cs.purdue.edu
> To: jay.krell at cornell.edu
> Subject: Re: [M3devel] dynamic chose between user/kernel threads?
> Date: Thu, 8 Jan 2009 13:51:15 +1100
>
>
> Jay, perhaps you can provide some context and motivation for your  
> proposals.  I am unable to evaluate your proposals in the form of a  
> simple laundry-list.
>
> On 8 Jan 2009, at 01:34, Jay wrote:
>
> I looked into this a bit..and I think it's actually pretty easy.
> It hardly churns the code even.
>
>
> I have other things I want to do first.
>
>
> In the meantime, specify the directive?
> There are actually a large number of subtle options.
>
>
> Can I ask for any of n libraries -- NT, pthreads, user threads?
>  setjmp vs. context? Or is it just a boolean, user vs. kernel?
>
>
> Is the option to "favor" or "require" a certain library?
>
>
> Can I set it on libraries or only programs?
>  What if the requests clash?
>
>
> Is it "Favor" or "Require"?
> Is it a function call or setting a global variable?
> I favor function call, but TARGET, WORD_SIZE, BUILD_DIR establish  
> the other precedent,
> and either can work.
>
> Is it flags in the moduleinfo like incgc, gengc, or separate data that
> there is just one of in RTLinker? Probably separate data, unless it  
> is allowed in libraries.
>
>
> What are the names of the libraries?
>  "posix" and "pthreads"  ?
>   "user" and "kernel" ?
>   "true" and "false" (or vice versa) ?
>
>
> Should NT implement user threads, using fibers?
>
>
> Presumably it works with both standalone and shared/dynamic programs.
> Presumably it is ok to always bloat up m3core.dll with both libraries.
> Presumably it is ok to have everyone pay a teeny tiny perf.
>   That is, there is a microscopic dispatching layer, that everyone
>   ends up going through, not chosing to link in one library or the  
> other.
>
>
> And as part of this, whenever it happens, can we bump up the minimum
> bootstrap to a version that includes  
> SchedulerPosix.DoesWaitPidYield()?
> Or does it become VAR Scheduler.UsingKerneThreads?
> (no, it should be a function; but naming matter remains).
>
>
> (ie. as I said, the decision currently is baked into m3core.dll, but
> now it is also baked into sysutils.dll, but these should change  
> together;
> m3core.dll should manage the knowledge).
>
>
>  - Jay
>
>
> > Date: Sat, 3 Jan 2009 01:12:27 +0100
> > From: wagner at elegosoft.com
> > To: m3devel at elegosoft.com
> > Subject: Re: [M3devel] dynamic chose between user/kernel threads?
> >
> > An option to cm3 or a quake directive to use in the m3makefiles
> > would suffice in my opinion (and be a great improvement).
> >
> > Olaf
> >
> > Quoting Jay <jay.krell at cornell.edu>:
> >
> > >
> > > Should the user/kernel thread chose be available:
> > >
> > >
> > > On the command line to a Modula-3 executable (or even an  
> executable
> > > where main is in another language, but which static or dynamic
> > > Modula-3 libs are used)?
> > >
> > >
> > > Via a quake directive when building programs?
> > >
> > >
> > > You know, imagine you have a bunch of Modula-3 programs and some  
> but
> > > not all use a very large number of threads and benefit from
> > > userthreads.
> > >
> > >
> > > Currently the chose is locked into m3core when it is built.
> > >
> > >
> > > - Jay
> >
> >
> > --
> > Olaf
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20090108/dd143a37/attachment-0002.html>


More information about the M3devel mailing list