The reason why MR is a dangerous capability only given to experienced programmers is that you can deadlock the system. Here is how it happens. You lock A. Someone else locks B. Then you attempt to lock B and are suspended to wait for B to be available. The other user tries to lock A and suspends because you have it locked. Result: a deadlock known as the Deadly Embrace. You are both suspended, each waiting for the other.
There is a solution to this programming dilemma: everyone
must lock the resources in a fixed order
(for example, don't lock B unless you lock
A first). Unlock resources in the reverse order.
If you follow this guideline in your applications, you can
be trusted with MR capability.
MR Stands for "Multi-Record"
Normally when you call the MPE file system intrinsics
you can only transfer one record at a time. If your requested
length is longer than a record, it is truncated.
However, if you open a file with MR access requested in the
Aoptions, you can read or
write several records at the same time. MPE splits them
based on the record length of the file. This is a cheap
trick for folding lines of output to the screen. It is
also a valuable performance feature when combined with
NOBUF access.
NOBUF/MR Means "Multi-Record Non-buffered"
To increase the speed of MPE file access, you can
bypass the buffering software of the file system. You do this
with the NOBUF access option. MPE then returns physical blocks
rather than logical records. If you want to go even faster, you can
also ask for Multi-Record Access.
When used with NOBUF, Multi-Record really means Multi-Block.
You specify NOBUF and MR in the Access Options
when you open a file.
With NOBUF/MR access, MPE allows you to ask for multiple blocks in a single read or write call. MR only works on disc files and is faster because it retrieves many records with a single invocation of the file system overhead. NOBUF/MR works for reading and writing, for serial access, and for directed access.
When using NOBUF/MR, you should expect to have some trouble on the last serial read, unless it happens to return exactly the number of blocks you asked for. The best strategy is to calculate the size of the last read as a special case.