Subject: Re: Why no /usr/include/sys/kthread.h?
To: Jason R Thorpe <thorpej@zembu.com>
From: Matthew Orgass <darkstar@pgh.net>
List: tech-kern
Date: 06/06/2000 15:01:11
On Mon, 5 Jun 2000, Jason R Thorpe wrote:
> I have a hard time calling something rfork(2) if it doens't work like the
> original rfork(2) (as seen in Plan 9). IMO, the FreeBSD people choose a
> poor name for thier __clone()-like system call.
I'm looking for the Plan 9 version (different address spaces that share
a number of segments). I didn't notice the FreeBSD one was different when
I glanced at the man pages (they seem to have forgotten to delete the part
of the Plan 9 man page about shared segments, though they did mention that
the entire address space shared so it should have been obvious that the
rest of that paragraph was just cruft). I agree that this was a very poor
choice by FreeBSD.
After more thought, I think BSDi is on the right track by separating the
creation of a new thread and the forking of resources (though I don't know
the details of what BSDi has done... the only discussion of it I could
find was a message by Chris Torek on some perl mailing list (archived at
http://www.mit.edu:8008/bloom-picayune.mit.edu/perl/12389)). Anyone from
BSDi out there who could explain sfork in more detail?
You would have, say:
1) tfork() -- fork a new thread with *all* resources (including address
space) shared. The parent will block and sfork will return 0 in the new
process. The parent will be unblocked when the child exits or execs.
This is almost exactly vfork except that file descriptors and such are
still shared. The child process should then either set up shop on a new
stack or fork its address space. This might or might not be BSDi sfork.
2) ufork(int flags) -- fork the indicated resources for this thread. BSDi
presumably has something like this to go with sfork, but I don't know what
it is. It would be nice to be compatible if possible.
Flags are:
FORK_UNBLOCK -- unblock the parent process
FORK_VM -- address space (data, bss, and any shared
segments are still shared).
FORK_SHARED -- shared segments, data, and bss (implies
FORK_VM)
FORK_FS -- fs root, cwd, umask
FORK_FILES -- file descriptors
FORK_SIGHAND -- signal handlers
You can use these to implement fork, vfork, both rforks, and something
like clone except for the exit signal.
> I see little value in MAP_STACK. The reference model for threads (Solaris)
> doesn't need it. I don't see why we should. If you want it to avoid pre-
> allocating swap space for stack pages, then again we can follow Solaris's
> lead and implement MAP_NORESERVE.
You are right, that would be much better.
Hmm... what syscall(s) does Solaris use for threading?
Matthew Orgass
darkstar@pgh.net