Case study (read, war story :-) of non-blocking I/O...
Back in the mid-70's, I was doing scientific support programming for an X-Ray sky
survey,
using Fortran-63 under DRUM SCOPE on a CDC 3800 system which NRL's Space Sciences
Division
had (sigh) acquired and cobbled together from the US Government "excess
property" list.
Most of the time, our satellite was used in "scan mode", spinning on an axis
which pointed
at the Sun. This let us collect data on a two degree wide strip of sky. So, every six
months we scanned the entire X-ray sky. The track was basically a helix, bent to match
the
shape of the Earth's orbit. Every so often, in order to look at a particularly
interesting
area, the spinning would be stopped, so the instrument could be put into "point
mode".
The challenge was to "bin" this data for further analysis. We did this by
loading sets of
7-track tapes onto a CDC 813 drive, then dumping it out into 36 2x10 degree bins. This
put
a quarter of the data onto a set of tapes. Rinse, repeat for the other 3/4 of the data
(after skipping past the already-written data). The result was 36 tapes, each holding an
8x10 degree bin (plus one extra tape for any point mode data).
IIRC, we had five tape drives; my challenge was to keep them all as busy as possible, so
as
to dump the data set expeditiously. Because I had asynchronous I/O (mostly in the form
of
BUFFER IN and BUFFER OUT commands), I was able to implement a simple but quite effective
polling loop. The machine room was a bit of a madhouse, but the tapes were written about
as quickly as the hardware allowed. Asynchronous I/O FTW...
https://en.wikipedia.org/wiki/United_States_Naval_Research_Laboratory#Space…
https://en.wikipedia.org/wiki/High_Energy_Astronomy_Observatory_1#A1:_Large…
https://ub.fnwi.uva.nl/computermuseum/cdcdisk.html
-r