[ILUG] tough programming q's (was: Re: [ILUG] Re: off-topic.....)
Justin Mason
jm at netnoteinc.com
Tue Apr 20 11:36:17 IST 1999
kevin lyda said:
> Harry Moreau burst across the net:
> >On Mon, 19 Apr 1999, kevin lyda wrote:
> >select() is probably your only option. Using signals is indeed a bad
> >idea, because you can't control the exact point at which your read()
> >gets interrupted by the timeout.
>
> that's what i'm thinking. but there are performance issues to consider.
>
> >>also, i'm looking for this for efficiency reasons. if i did it
> >>with a select and then a read it will involve more data copying
> >>under linux, yes?
> >I don't think so. select() doesn't actually read data.
>
> exactly, that's why there's more data copying. if data is coming in to
> a nic, and the driver is notified that a process is waiting to read data
> (with a memory location), then the data can go straight from the card
> to the memory location (via dma if supported). otherwise the data gets
> copied into buffers in the driver, and then again into userspace.
>
> supposedly nt is capable of this. true? also, does any other unix
> system do this?
QNX I think, and recent versions of Solaris -- it's called zero-copy read
or zero-copy write. I think I saw a kernel mod for Linux ages ago that did
this. I can't remember seeing anything about NT doing it though!
Most OS'es do not support this AFAIK, and when they do it's going to be
unportable -- so you'd need to write a wrapper layer.
> >select() is available on most modern UNIX systems. However,
> >you may find slight differences in implementation, especially in error
> >conditions. Read the man pages carefully.
>
> ACE can mask this, but select has a (supposed) penalty under nt.
> theoretically there would also be a loss of performance under linux if
> linux can xfer straight from nic to userspace.
Why not take a look at the ACE source!
btw select() etc. has enough problems on NT that you should consider
writing a pair of NonBlockingRead/NonBlockingWrite wrapper functions,
which you can implement differently on NT and UNIX, using select() only on
UNIX.
I think some UNIXes provide nbread()/nbwrite() functions, or similar, to
support non-blocking IO. However this is definitely unportable. If you
ALWAYS will be reading this socket without ever wanting to block, use
non-blocking IO with fcntl(fd, F_SETFL, O_NONBLOCK). I think that is
reasonably portable across UNIXes.
However for portability and reliability I would ALWAYS recommend using
select() and read() for UNIX platforms -- they're always going to work,
and not going to get you with crap like non-building code or requiring
patches on blah platform, etc.
--j.
More information about the ILUG
mailing list