UNIX semantics do permit full support for asynchronous I/O
Steve Nuchia
steve at nuchat.UUCP
Wed Aug 29 09:43:48 AEST 1990
On the subject of asynchronous I/O in Unix: I've come up with
what I consider a rather slick way of making it fit neatly
into Unix's way of doing things:
Have read(2) and write(2) calls map the pages containing the buffers
out of the user address space and return immediately. Once the
data have been copied (DMAed?) to/from the buffers, map the pages back in.
A user program that is not aware of the subterfuge will then run
along for some (probably short) time and trap on an attempt to
refill or inspect the buffer. It will then be blocked until
the request completes. A savvy program will do something else
for as long as it can, then take a peek at the buffer when it
has run out of busy work. One would probably also provide
(grudgingly, in my case) an explicit call for discovering the status.
(Note that such a call might be useful to a program that
wished to control its paging behaviour if it were written with
sufficient generality.)
The scheme will only provide asynchronicity in cases where the
return value for the read or write call is known early. This
will be the case primarily for files, but other cases can be
made to take advantage of it.
The performance characteristics would be similar to using mmap
but would apply to programs written in normal unix style and
to dusty decks. One must of course take some care in implementing
the scheme, and there are no doubt the usual raft of gotchas that
come up when doing anything involving memory management. The
case of write(1,buf,read(0,buf,sizeof(buf))) is entertaining to
contemplate for instance.
Good performance with V7 file system call semantics. Programs
work whether the feature is in the kernel or not and whether they
are written to take advantage of it or not. I sure wish I
had thought of it a long time ago (like while the standards
were still soft).
I would appreciate any comments that wizards with more kernel
internals experience might have. If I've rediscovered something
well-known again I think I shall slit my wrists.
(For completeness I will note that to use this scheme intelligently
you must be able to discover the relevant properties of the memory
management implementation. This is nothing new for high performance
programs in a paged environment, but unless its been added recently
there isn't a standard way to do it. Whether this is properly a
language or a system interface issue is best left to another debate.)
--
Steve Nuchia South Coast Computing Services (713) 964-2462
"To learn which questions are unanswerable, and _not_to_answer_them;
this skill is most needful in times of stress and darkness."
Ursula LeGuin, _The_Left_Hand_of_Darkness_
More information about the Comp.unix.wizards
mailing list