Unix Technical Digest V1 #48
Heiby
netnews at wnuxb.UUCP
Sun Apr 28 06:58:59 AEST 1985
Unix Technical Digest Sat, 27 Apr 85 Volume 1 : Issue 48
Today's Topics:
echoin
RCS
RCS summary
Screen editors & Unix
----------------------------------------------------------------------
Date: 25 Mar 1985 20:14:50-EST
From: ihnp4!decwrl!Tim.Maroney at CMU-CS-K
Subject: echoin
The throughput problem with interactive editors is mostly the context
switching. The editor asks to read a character, switching to system
context. When the user types a character, there is a switch from system
context to editor context. The editor processes the character a little,
then usually there is a switch back to system context to echo the character,
then back to editor context for some processing of the character. Echoin
would eliminate some of this context switching, so it seems like a
worthwhile idea.
However, the idea would have to be elaborated some to be useful. For
instance, if the user types a ^L, the editor may well not want to echo it
back to the screen. In fact, it usually won't, and the same goes for other
control characters. What you really want is for a known subset of ASCII
characters to be echoed back. So some sort of filter in the kernel would
have to exist, probably a 128-bit (16-byte) bitmap. If this were passed to
each echoin call, the overhead of user-to-kernel copying of the map would
take a big bite out of any savings from echoin, it seems. It also seems
that for most processes the map would change very slowly if at all, so
passing it each time would be a waste. The alternative is to add these 16
bits to the kernel data associated with each terminal. (It could also
theoretically be added in the per-process data structure, but most processes
would never use it.) The logical way to set this is by an ioctl on a file
descriptor associated with the terminal.
There is really no need to make up a new system call. Just use read(2),
after calling the appropriate ioctl to inform the terminal driver you want
this mode of operation, supplying the special character bitmap described
above. The read call would then repeatedly read and echo characters, only
returning to the user context with the data on one of the following
conditions:
(1) The buffer specified in the read is full.
(2) A character flagged as special in the bitmap is typed.
(3) The end of the line is reached. (The driver can detect this because it
keeps track of position on the line for tab expansion.)
I think the savings would be quite substantial. Consecutively-typed text
characters are the norm in editing. A sequence of characters of length n
would create only about 1/n of the context switches it creates now.
There is one major drawback. This strategy can only be assured of working
when you are typing at the end of a line, or in some terminals' insert
modes. The editor can, of course, keep track of what terminal it is on, and
where in the line; but in many cases the automatic echoing would be
inappropriate (for instance, in mid-line on a VT52). I think typing at the
end of lines is, again, the norm, so there could still be substantial
performance improvements.
If I have misunderstood the proposal in some way, please fill me in.
-=-
Tim Maroney, Carnegie-Mellon University, Networking
ARPA: Tim.Maroney at CMU-CS-K uucp: seismo!cmu-cs-k!tim
CompuServe: 74176,1360 audio: shout "Hey, Tim!"
------------------------------
Date: Sun, 14 Apr 85 11:58:12 pst
From: sdcrdcf!hplabs!hp-pcd!orstcs!hakanson (Marion Hakanson)
Subject: RCS
> Date: 8 Apr 85 14:16:05 GMT
> From: cosell at bbn-labs-b.ARPA (Bernie Cosell)
> Subject: Needed: some advice on how to make RCS work
. . .
> Is there some equivalent 'give me the epoch
> of everything' function you can perform when everything is RCS'ed?
The best approach I know of is to put the $Header$ string in your RCS'ed
files. E.g. a lot of C source programs have something like:
static char *RCSID="$Header$";
at or near the top. The "$Header$" gets expanded at 'co' time to look like:
static char *RCSID="$Header: XXX.c,v 1.1 85/02/12 12:46:05 hakanson Exp $";
There are other keywords you can insert in your source code that will
be expanded at checkout time, as well. "$Log$" will insert (as comments)
the log of change messages you entered for each new revision.
> .... But now:
> is there a way to get a makefile set up so that for .c's and .h's in '.'
> it'll use them, but for the ones it can't find it'll use the copies from the
> master directory?
I usually just create an RCS directory in the directory where all the
sources reside normally -- the RCS commands will look for and store
the ',v' files in that directory automatically, if it exists in the
current directory. Then I check everything in using 'ci -u', which
checks everything back out again. Then, I 'co -l' the file I wish to
work on, do my fiddling, and use the makefile that was already there
normally. When I've tested the modifications and found them satisfactory,
I 'ci -u' the file I've been working on, which will then take care of
freezing the changes (and documenting them in the log, as well).
If you don't like having all those files checked in and checked out at
the same time, you can add lines to your makefile something like:
XXX.c: RCS/XXX.c,v
co XXX.c
This tells make how to build XXX.c. I'm not a make wizard, but there is
probably some way you could do the above by adding a default rule which
would tell make how to build .c files from .c,v files, but that's pretty
obscure to me right now. Nevertheless, make will use the XXX.c file
if it is newer than the RCS/XXX.c,v file, which is what you want if you
are modifying it.
Note that there are many other ways of using RCS. My current approach
has been to try to integrate RCS into existing file-system structure,
makefiles, etc., as transparently as possible.
Marion Hakanson CSnet: hakanson at oregon-state
UUCP : {hp-pcd,tektronix,tekchips}!orstcs!hakanson
------------------------------
Date: Tue, 16 Apr 85 11:34:54 EST
From: Bernie Cosell <ihnp4!ucbvax!cosell at bbn-labs-b.ARPA>
Subject: RCS summary
Here's a brief summary of what I've learned:
first off, mostly no one has much worried about listings. It is easy enough to
have 'make' oversee pouring out new listings when you need them, but no one
really worried much about this. Since we are source-licensed, I'm planning to
dive into 'pr' and modify it to take a new option that will have it put the RCS
revision number instead of the last-modified date in the page headers.
Now for getting make to work: well, there are two answers here, depending on
structure of the project. If you are working on something where you can
conveniently 'lock' ALL of the program sources, even though you only co'ed
maybe one or two files, then life is easy: there were several folks who
suggested ways to put the appropriate building rules into make to do the right
thing on-the-fly with .c,v files. Mostly, RCS pretty much works fine for small
programs (or at least programs without too many source files), so for the most
part you can live with the image that if you've checked out one of the source
files you might as well at least 'reserve' them all.
There are problems with really large systems. Some projects just continued the
small-system model and have a single file way at the top of the RCS hierarchy
called "master.lock" or something like that and you always co-l THAT file
before you really try to touch anything. That won't work at all for our
project: much like a UNIX kernel we'll need to have the 'current' system pretty
much available to everyone even while several folk are busily working in
parallel on diverse parts of the system. This is a trickier affair and there
are two practical approaches that could be made to work in this case:
1) If your program modules work out right, you can 'co' things a 'module' at
a time. What you do is make a LIBRARY file (ranlib and all) of all of the
'master' .o files off in the master directory. You cobble up a makefile that
basically builds modules as you would have guessed, but does the final linking
as: cc <your>.o -l<masterlib>
thus, any .o files that you DIDN'T mess with will quietly be snarfed out of the
master copy and you're home free. This should work pretty well, but the
respondents weren't clear how they made make understand the .o dependencies
correctly. That is, you usually have:
SYSTEM: <lots of .o dependencies>
cc <to assemble everything>
but that wont work when the .o files are all hidden. I think what you do in
this case is have a funny makefile entry for each module. NOrmally a module
has a single entry like:
module.o: lots of .c and .h files
now what you do is add
module: module.o
cc module.o -l<masterlib> -o module (or even -o SYSTEM works)
2) Use a hacked-up version of make. The folks at Purdue who brought you RCS
in the first place have also produced a version of make that is better tuned to
working with RCS. It was distributed on the USENIX '84 tape, but we don't have
that and I haven't succeeded in locating a copy of it yet, so I don't know
exactly how it works, but I do have the gist of it:
There is a new environment variable which, since I don't know its real name
I'll call MAKE-PATH. What the new version of make does is search out files by
chasing down the MAKE-PATH. For most normal circumstance you'd have a
MAKE-PATH with exactly two entries in it: '.' followed by <masterdir>,
where <masterdir> is a read-only place where a complete set of everything for
the last 'stable' version of the system is kept. So if you want to work on
something, you just mkdir a new, clean place to work, co whatever you need into
it and just "make" - the things you happened to have copied out will be
accepted in place. Things you didn't mess with will be quietly snarfed from
the master dir. This is nicer than the previous because if you, for example,
change a HEADER file, then this approach will quietly and automatically compile
whatever needs recompiling, while in the other scheme you mostly had to do that
work yourself to figure out 'how much' you had to privately recompile so as to
supplant the right .o files in the masterlib.
I'm currently tracking down a copy of the improved make and we'll probably go
with that, since it seems to do exactly what we want pretty much automatically.
/Bernie
------------------------------
Date: Wed, 20 Mar 85 10:27:09 gmt
From: Robert Stroud <garfield!mcvax!ukc!cheviot!robert>
Subject: Screen editors & Unix
I read the article in Vol 1 #25 about efficient use of screen editors
under Unix with interest. The "echoin" primitive is similar to mechanisms
developed here to run screen editors efficiently over networks. I passed
the article on to Alan Hunter who asked me to post the following reply.
I hope it is of some interest.
+--------------------------------------------------------------------+
| |
| Efficient Screen Editing |
| |
+--------------------------------------------------------------------+
I was interested to see the comments on efficient use of screen
editors from UNIX (tm). Screen editing is a major activity of users
of any system these days and some provision for this in the operating
system I/O interface is desirable.
I am on the system support staff at the University of Newcastle upon
Tyne (England). We run a joint computing service with the University
of Durham (England) on two mainframes running MTS and several smaller
machines (VAXes and 11/44s) running UNIX.
About 95% of our logins are via a local area network, and this allowed
us to provide efficient screen editing using dumb terminals
(Televideos, Hazeltines, VT100s mostly) by putting some of the screen
editor support in the network terminal concentrators. Basically we
taught the concentrators about the echoing of printing characters and
the four cursor movement keystrokes, so that they were handled
locally, and left the rest up to the host. This simple technique
removes most of the single character interactions from the host
machines, with a consequent increase the number of connections that
can be supported and improved response to the user's keystrokes.
For more details see:
J. A. Hunter and N. F. Hall
"A Network Screen Editor Implementation"
Software - Practice & Experience, Volume 12, 843-856 (1982)
More recently, we have done some work under contract to investigate
the use of screen management software over wide area networks. For
this we used a programmable terminal; we see this as the correct route
forward now that PCs are starting to appear on a lot of office desks.
The work was to design "A Simple Screen Management Protocol", or SSMP
for short. It isn't quite as simple as it was when we started to
design it (!) but we have had a fair degree of success. One of our
test sessions was from a terminal in Newcastle to a host machine at
the University of Alberta (Canada), with remarkably good performance.
This was MTS, not UNIX, so please don't ask for software yet!
SSMP provides a virtual terminal model, which has the advantage that
the host editor software doesn't have to know about the intimate
details of 57 varieties of dumb terminal; that's sorted out by the
terminal emulation software. We solve the single character
interaction problem by not doing much of it. The host is presented
with complete input records for the most part; quite a lot of common
editor functions are defined at the terminal. This technique is just
as valid for a directly connected terminal as for a network
connection; move the frequent interaction stuff out to a programmable
terminal and you eliminate the efficiency problem.
SSMP is a fairly general design. It is applicable to existing
software such as emacs, but we don't have any plans to work on that
package at the moment.
There is a not-quite-published document on SSMP. Ask in late April
this year.
Alan Hunter
Computing Laboratory
University of Newcastle upon Tyne
Newcastle NE1 7RU, England
net: Alan_Hunter%newcastle.mailnet at mit-multics.arpa
------------------------------
End of Unix Technical Digest
******************************
--
Ronald W. Heiby / netnews at wnuxb.UUCP | unix-request at cbosgd.UUCP
AT&T Information Systems, Inc., Lisle, IL (CU-D21)
More information about the Mod.unix
mailing list