<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'>
 > so the behaviour can be selected better at runtime if more than one available processor<BR>
 <BR>
I would like user vs. kernel threads to be selectable at link and/or run-time, but Tony has nixed the small changes required to make it so.<BR>
  It has also been suggested you could copy around different m3core.so files to switch, but that isn't the case either. Thread.T has a different typeid in the two systems.<BR>
 <BR>
 <BR>
Anyway, the better behavior is almost always kernel threads.<BR>
You should really just generally stick with them.<BR>
 <BR>
You do forever ongoing debate on these matters, and the "pendulum" has seemingly swung many times, so I can't really say<BR>
everyone agrees in kernel threads always.<BR>
 <BR>
Windows 7 adds "user mode scheduling", which is still kernel threads -- there is still a one-to-one mapping between<BR>
some usermode state and kernelmode state, but the scheduling decisions are made in usermode.<BR>
 <BR>
I believe pthreads on OpenVMS use the "m:n" approach.<BR>
 <BR>
But Linux, Solaris by default, Darwin, I suspect but am not sure FreeBSD and NetBSD, Win32 all use the simple "1:1" model.<BR>
Where every thread is a kernel thread. All scheduling is done by the kernel.<BR>
Win32 also has "fibers" but these are fairly...surprisingly difficult to use, but in a way that Tony et. al. wouldn't be surprised by.<BR>
When you use fibers, you have to write your own scheduler, and your own locking primitives. Normal Win32 functions<BR>
like GetCurrentThreadId(), EnterCriticalSection() become sort of useless/broken in the face of fibers.<BR>
Basically the same as what it takes to implement Modula-3 user threads.<BR>
Though you can run on multiple processors I believe fairly easily.<BR>
Hm. The "m:n" model is actually not difficult to implement on Win32 and w/ pthreads. But still, probably not a good idea.<BR>
 <BR>
 <BR>
 <BR>
 - Jay<BR>
<BR> <BR>
> Date: Sat, 12 Feb 2011 21:08:13 +0000<BR>> From: dabenavidesd@yahoo.es<BR>> To: m3devel@elegosoft.com; wagner@elegosoft.com<BR>> Subject: Re: [M3devel] pthread_atfork<BR>> <BR>> Hi all:<BR>> by the way you told, do user space interfaces need to be linked differently from user space threads library than the one in kernel threads, so the behaviour can be selected better at runtime if more than one available processor (i.e a virtualized one, perhaps two if there are virtualized GPU, GPGPU, etc) is available on demand (in example the collector has its own user space thread allocated control and one in kernel space that user can control from the Runtime), could it work in such a way to allow a Thread to live in spaces that are accesible through like an NetObj.T, thus allowing it to communciate them through such an abstraction?<BR>> Perhaps this could allow to run the kernel threads with Modula-3 governance and if so put them to work or switch to kernel them to accelerate its process according to its demands and such debug them in a special API like the one in the SPIN OS, fairly more comprenhensive thread implementation of Mach, Cthreads (aka C Pthreads calls) and own strends. Also scheduling could be handled to manage both user/kernel level synchronization, the threads and also allow to change from having a specialized hardware-assisted virtualized processor to a non hardware-assissted virtualized processor (like an NetObj.T again), which is like the same situation for Modula-3 with just one processor so in case it needs, it does so. In any case thread and object migration are safely defined over Obliq.<BR>> Granted, this is same situation like was before the enter of virtualization hardware but again the whole idea of hardware-assisted virtualization was not new, even there is an article in which a PDP-10 is claimed has requirements to make it virtual in hardware (and I believe in software too). So SPIN could be a platform, like for hardware assissted virtualization and/or operating-system level virtualization, if so, we would be able to trace system calls for a given OS client running on it, rather than barely, so it makes the implementation with hardware-assisted source-level debugger ready, which is related to where programs are segfaulting now (no system-level breakpoints, that is, no hardware assisted source-level debugger for virtualization user, different from Modula-3 situation in current user-level space threading or SPIN gdb DEC TTD Topaz Tele Debugger at source-level service and not to forget the ldb cross-platform source-level remote debugger)<BR>> in pthread current implementations, likewise the whole idea of customizable scheduler and kernel allocator weren't and aren't new nor bad at all, neither for us nor were for SPINers; remember the CSA Occam2 TRAC sourced OS SuperSetPlus machine which had from 16 up to 256 individual processors independently executable as according to their product info add it could be connected over LAN up to 16 Mac, PC, and Sun workstations, pretty much like a compilation and execution engine in one, pretty and good mussle to have to see running. They offered besides Occam2, C, C++, Modula-2, Pascal and FORTRAN, prolog and Ada with source level debuggers and Operating Systems as their Software products too. I hope this would be an scenario in some years to come, at least for any of us, if solet's see where and what this takes to/from us.<BR>> The main question will be whether this guys will allow enogh detail to drive their GPGPU or CPU, I hope this history doesn't repeat like it is and wasn't in the past of machine OSes sources, i.e braking traditional development etc.<BR>> I'm sorry for the long of the message.<BR>> Thanks in advance<BR>> <BR>> --- El sáb, 12/2/11, Olaf Wagner <wagner@elegosoft.com> escribió:<BR>> <BR>> > De: Olaf Wagner <wagner@elegosoft.com><BR>> > Asunto: Re: [M3devel] pthread_atfork<BR>> > Para: m3devel@elegosoft.com<BR>> > Fecha: sábado, 12 de febrero, 2011 07:02<BR>> > I think it would be acceptable to say<BR>> > that pthread threading is<BR>> > broken on FreeBSD6 (as it is not officially supported any<BR>> > more).<BR>> > All the stuff below should be documented in the 'known<BR>> > problems'<BR>> > section. Especially the different behaviours of fork for<BR>> > user and pthreads. This should also be mentioned in the M3<BR>> > interfaces (source code)!<BR>> > <BR>> > Also that to use use threads with FreeBSD requires to<BR>> > remove the<BR>> > -pthread flag, as Mika noted.<BR>> > <BR>> > BTW, do we have a chapter explaining what to do to use user<BR>> > threads<BR>> > instead of the default pthreads?<BR>> > <BR>> > Olaf<BR>> > <BR>> > PS: Hint: this would be a great task for anybody lurking on<BR>> > the lists<BR>> > and trying to get involved :-)<BR>> > <BR>> > Quoting Jay K <jay.krell@cornell.edu>:<BR>> > <BR>> > ><BR>> > > I wrote that.<BR>> > ><BR>> > > As I recall, FreeBSD < 6 doesn't have<BR>> > pthread_atfork.<BR>> > ><BR>> > > I think that was based on reading the man pages.<BR>> > ><BR>> > > So, yes. What would you suggest?<BR>> > ><BR>> > ><BR>> > ><BR>> > ><BR>> > ><BR>> > > All this atfork stuff came about as part of getting<BR>> > cvsupd to work.<BR>> > ><BR>> > > With pthreads/kernel threads. It<BR>> > historically worked, with <BR>> > > Modula-3 user threads.<BR>> > ><BR>> > > Modula-3 user threads have this funny<BR>> > property that all threads <BR>> > > survive work.<BR>> > ><BR>> > > With pthreads/kernel threads, fork<BR>> > gives you a new process with <BR>> > > just one thread.<BR>> > ><BR>> > > (Solaris has fork1 and forkall, and fork<BR>> > maybe used to be <BR>> > > forkall, but now it is fork1).<BR>> > ><BR>> > ><BR>> > ><BR>> > ><BR>> > ><BR>> > > cvsupd is one of those slightly unusual programs that<BR>> > does "fork and <BR>> > > then do more work"<BR>> > ><BR>> > > as supposed to the more typical "fork and exec".<BR>> > ><BR>> > ><BR>> > ><BR>> > > Which is to say..I don't know. Maybe, don't expect<BR>> > pthreads to work <BR>> > > on FreeBSD < 6?<BR>> > ><BR>> > > At least not in a process that ever calls fork? Or<BR>> > does "fork and <BR>> > > then more work"?<BR>> > ><BR>> > ><BR>> > ><BR>> > ><BR>> > ><BR>> > > In reality, i think a lot of libraries have trouble<BR>> > with "fork and <BR>> > > then do more work", but<BR>> > ><BR>> > > I don't know. I recall vague notices in the<BR>> > Apple/Darwin manpages <BR>> > > not to assume<BR>> > ><BR>> > > this works -- the obvious implication that there is<BR>> > plenty of use of <BR>> > > pthreads e.g. mutexes,<BR>> > ><BR>> > > but relatively little use of pthread_atfork.<BR>> > ><BR>> > ><BR>> > ><BR>> > ><BR>> > ><BR>> > > You could perhaps replace all uses of fork with a<BR>> > function that <BR>> > > called the fork handlers,<BR>> > ><BR>> > > then fork, then the other handlers. That is probably<BR>> > what I meant in <BR>> > > the comment<BR>> > ><BR>> > > about this being easy to fix.<BR>> > ><BR>> > > You might though then run into the problem that<BR>> > callers of fork can't do much<BR>> > ><BR>> > > before exec...oh, that's vfork I bet actually.<BR>> > ><BR>> > ><BR>> > ><BR>> > ><BR>> > ><BR>> > > - Jay<BR>> > ><BR>> > ><BR>> > ><BR>> > ><BR>> > ><BR>> > ><BR>> > >> To: hosking@cs.purdue.edu<BR>> > >> Date: Fri, 11 Feb 2011 19:05:25 -0800<BR>> > >> From: mika@async.caltech.edu<BR>> > >> CC: m3devel@elegosoft.com;<BR>> > jay.krell@cornell.edu<BR>> > >> Subject: [M3devel] pthread_atfork<BR>> > >><BR>> > >> Tony,<BR>> > >><BR>> > >> What's RTProcessC.c doing?<BR>> > >><BR>> > >> I note the following cryptic comment:<BR>> > >><BR>> > >> /* NOTE: Even userthreads now depends<BR>> > >> * on availability of pthreads.<BR>> > >> * This can be fixed if need be.<BR>> > >> */<BR>> > >><BR>> > >> now further down we can read:<BR>> > >><BR>> > >> #if defined(_WIN32) \<BR>> > >> ||<BR>> > defined(__vms) \<BR>> > >> ||<BR>> > (defined(__FreeBSD__) && (__FreeBSD__ < 6))<BR>> > >> return 0;<BR>> > >> #else<BR>> > >> while (1)<BR>> > >> {<BR>> > >> int i =<BR>> > pthread_atfork(prepare, parent, child);<BR>> > >> if (i != EAGAIN)<BR>> > >> return i;<BR>> > >> sleep(0);<BR>> > >> }<BR>> > >> #endif<BR>> > >><BR>> > >> so on FreeBSD 5 (what I'm running on my "FreeBSD4"<BR>> > system),<BR>> > >> RTProcess.RegisterForkHandlers does nothing?<BR>> > >><BR>> > >> Hmmm.....<BR>> > >><BR>> > >> Mika<BR>> > ><BR>> > <BR>> > <BR>> > <BR>> > -- <BR>> > Olaf Wagner -- elego Software Solutions GmbH<BR>> > <BR>> > Gustav-Meyer-Allee 25 / Gebäude 12, 13355 Berlin, Germany<BR>> > phone: +49 30 23 45 86 96 mobile: +49 177 2345<BR>> > 869 fax: +49 30 23 45 86 95<BR>> > http://www.elegosoft.com |<BR>> > Geschäftsführer: Olaf Wagner | Sitz: Berlin<BR>> > Handelregister: Amtsgericht Charlottenburg HRB 77719 |<BR>> > USt-IdNr: DE163214194<BR>> > <BR>> > <BR>> <BR>> <BR>> <BR>                                        </body>
</html>