blob: 3f225d5560a64a353a0ebae1591d792a542b8856 [file] [log] [blame]
Credit for this belongs to:
Jim / James C. Warner, <>
Ok, ok, I yield -- most of what follows has been removed from the manual page
and packaged separately as this README (hey, it was only TEMPORARY insanity).
Of course, that means that now absolutely nobody will ever read it.
This is probably a good thing...
## Table of Contents ---------------------------------------------------##
# the only darn thing that wasn't in the man page
# the following carry their original topic numbers
DIFFERENCES / New Features
Interface Etiquette
Expanded Configurable Display Support
Enhanced Field/Column Management
Customization Flexibility
NOTES and Rantings
The top Binary
Comparing Performance
Cost of Stuff
The top Sources
EXAMPLES of Windows
The 'A' Mode Command Toggle
ALL TOGETHER Now, Window(s)
## CUSTOMIZING the Sources ---------------------------------------------##
Listed below are the conditionals available should you wish to recompile
this top. The author's favorite is: PRETEND4CPUS.
That's the #define allowing you to simulate an SMP environment, and
(perhaps) impress your friends. It's currently set to display four
separate CPUs, but could easily be changed.
Caution: do NOT use this provision in an effort to impress someone
who truly possesses such a machine! The fact that all 4
CPUs show the same dynamic results will likely have the
opposite effect.
//#define ATEOJ_REPORT /* report a bunch of stuff, at end-of-job */
//#define CASEUP_HEXES /* show any hex values in upper case */
//#define CASEUP_SCALE /* show scaled time/num suffix upper case */
//#define CASEUP_SUMMK /* show memory summary kilobytes with 'K' */
//#define POSIX_CMDLIN /* use '[ ]' for kernel threads, not '( )' */
//#define PRETEND2_5_X /* pretend we're linux 2.5.x (for IO-wait) */
//#define PRETEND4CPUS /* pretend we're smp with 4 ticsers (sic) */
//#define PRETENDNOCAP /* use a terminal without essential caps */
//#define SORT_SUPRESS /* *attempt* to reduce qsort overhead */
//#define STDOUT_IOLBF /* disable our own stdout _IOFBF override */
//#define USE_LIB_STA3 /* use lib status (3 ch) vs. proc_t (1 ch) */
//#define WARN_NOT_SMP /* restrict '1' & 'I' commands to true smp */
## 6. DIFFERENCES / New Features ---------------------------------------##
The following summarizes differences between this top and your
former top. It was originally based on procps-2.0.7. However,
except for the separate/summary CPU toggle, all of these differ-
ences also apply through procps-2.0.10.
6a. Interface Etiquette
-*- Input and output are far more carefully implemented in
this top. You won't be subjected to 4 - 5 'Unknown command'
messages should you press the wrong key.
-*- You need suffer a confirmation message only when the results
of a command are not obvious by their effects on the display.
-*- The Help screen will no longer overflow, even when running
with a 24 row xterm (vt100).
-*- The fields selection/ordering screens do not carelessly
destroy important information through unintended line wraps.
-*- Should you narrow a xterm window to less than 80 columns
while this top is running, you will not be left with an
utterly worthless, embarrassing display.
6b. Expanded Configurable Display Support
-*- In an SMP environment, you can choose between a summary dis-
play or you may show each cpu separately. No longer must
this choice be irrevocably made at startup.
-*- There are new fields and with this top, any field is
selectable for sorting. Plus, your sorted column can be
instantly reversed with just a single keystroke.
-*- You may optionally apply 2 distinct types of highlighting to
running tasks and/or sorted columns. With this top, you'll
be able to instantly spot running tasks and always know the
current sort field.
-*- While you could continue to use the more familiar (and
boring) monochrome display, you might want to try this top's
new color display. You can even create your own unique col-
ors used in summaries, messages, headings and tasks, each of
which can be made persistent until you choose to change them.
-*- Up to four separate windows can be displayed simultaneously,
giving you four separate ways to sort and view the tasks cur-
rently cluttering up your system. You could have one view by
pids, another by cpu usage, yet another showing memory con-
sumption. You get the idea...
-*- Each window comes with pre-configured (but user configurable)
fields and you can size each window individually.
-*- Virtually every one of this top's options (summaries, fields,
colors, sorted column, etc.) is separately configurable for
each of those four windows.
Heck, you can even change a window's name, if you don't care
for top's choices. Your changes will be reflected not only
when you're in what top calls alternate-display mode but also
on his special new 'Windows' help screen.
-*- And, [ ** Drum-Roll + Ta-Da ** ] with just one keystroke you
can quickly switch between full-screen and multiple window
modes! Or, with a different keystroke, toggle a single win-
dow Off for now, then On again later!!
6c. Enhanced Field/Column Management
-*- Many Field/Column names have been changed to make them more
intuitive, more self-descriptive. And with this top you
won't be fooled with field choices that are "not yet imple-
-*- Task memory statistics are more meaningful and more accurate.
-*- You'll finally have complete display integrity regardless of
field selections, their order or screen width. And that
means the command column no longer need be kept as the right-
most field, lest your screen turn to <bleep> when all the
following columns get misaligned.
6d. Customization Flexibility
-*- You have complete program naming freedom with no internal
ties to a specific personal configuration file. Symbolic
links could be used to establish different configuration
files reflecting the different personalities of your cus-
tomized "tops", under whatever aliases you've used.
Thus, you could have an alias for running top in 'Batch
mode', another for when you work from the Linux console and
maybe a third used with X-Windows. All of that, yet still
just a single binary image!
-*- All of your configuration choices can be preserved in a per-
sonal configuration file, including any changes made on a
per-window basis. Thus, once you personalize things they
remain personalized until you decide to change them again.
This top has been completely cured of:
( and again, and again ... )
The bottom line is this: if you save your configuration
before quitting top, upon restart the display will appear
exactly as you left it. And that means you no longer have to
keep top running until-the-end-of-time (ok, a long time
anyway), lest your customizations go bye-bye.
## 7. NOTES and Rantings -----------------------------------------------##
7a. The top Binary
To whom it may (should) concern: this top, even with its vastly
expanded capabilities, is only slightly larger than the old top.
Were it not for extensive help text and additional sort callbacks,
it would be smaller.
Throw source carelessly at objectives, it will
produce equally careless machine instructions.
example: (num_pages - an_address)/1024 == duh?
kicker: document result as broken, due to elf!
I know you're out there, are you getting this?
Now, as for all those new capabilities like colors and windows and
highlighting, you'd expect this top to be the "mother of all pigs"
compared to old top -- right?
Yea, with this top expect following piglets:
. A smaller virtual image and resident footprint
. Slightly fewer major page faults
. A large reduction in minor page faults for SMP
. The same or better response time
. The same or even less CPU costs
Ideally any comparison of the old and new top should be against
the same libproc format (32-bit or 64-bit tics) and run in a true
or simulated SMP environment (producing separate CPU stats). This
latter requirement will coax old top into handling his own
'/proc/stat' access -- something this top always does, but with
less cost.
7b. Comparing Performance
Even with equivalent libraries and '/proc/stat' access, it's dif-
ficult to accurately compare tops using their own displays.
Results for these cpu-intensive programs (who frequently exceed
their time-slice) generally show a wide disparity in %CPU. This
is due to differing call patterns, kernel preemptions and the tim-
ing of process snapshots. For slightly better results, start each
program with the following commands:
./old-top -d 0.5
nice -n-10 ./new-top -d 0.4
While actually putting this top at a performance disadvantage, the
higher scheduling priority and staggered timing will periodically
yield a somewhat truer picture. You could even reverse those
roles and get similar results.
The most consistent performance results will be obtained 'off-
line', using your shell's time pipe or the time program itself.
And even in a single processor environment or without equivalent
libraries, total cpu costs (user time + system time) are similar.
However, this top's cpu costs ARE influenced by the capabilities
you choose to exploit, even if they don't SEEM to be reflected in
such timings. So let's examine some...
7c. Cost of Stuff
Colors Cost -- Nada (almost).
Once the terminfo strings are built (at and during a user's
behest) they are SAVED with each window's stuff. And while
there will be extra tty escape sequences transmitted because of
colors, it makes no difference which 'char *' is actually used.
Highlighting Cost -- Nada (maybe), or blame it on Rio.
On second thought, let's blame it on the user.
For row highlighting, there is only the cost of those extra tty
escape sequences (same as for colors). For column highlight-
ing, there is a fairly significant cost associated with column
transition management combined with even more tty output.
These increased costs are incurred on every task display row.
Sooo... hey USER -- do NOT highlight COLUMNS. You shouldn't
need a constant visual reminder of your chosen sort field.
However, if you forget which field top is sorting it can serve
as a quick visual reminder.
Windows Cost -- Nada (if just 1 window).
If more than 1 window, almost certainly NOT Nada so blame it on
reality. Colors are not an issue, but those sort fields are.
If we could trust the user to always select the same 'c' state,
'S' state and sort field (hey, why ya got multiple windows then
user, huh?) AND if we can trust someone to recompile top with a
#define enabled, then we could achieve 'Nada'.
Ok, not likely, so we're gonna' be doing multiple sorts. BUT,
it may not be as bad as it sounds. Those sorts involve point-
ers only. And, that's as good as it gets ! (right Mr. N?)
7d. The top Sources
Unlike his predecessor, this top has a proper header file. It
contains ONLY declarations, NOT definitions. And there are
several conditionals present to help with further customiza-
tions and experimentation. All are Off by default.
Hopefully proves that source code needn't be a disorganized,
misaligned MESS. And, WHO says a source listing shouldn't
occasionally make you SMILE? Why, top.c even does a darn good
job of following the suggestions in a document hardly anybody
seems to observe.
the Linus Torvalds CodingStyle guidelines ...
-*- -*- -*- on indentation + etc. -*- -*- -*-
well almost all, except for those stinkin'...
I suppose even Linus Torvalds is entitled to err now and again.
How so you say? Tabs, me' bucko, stinkin' tabs! That, plus the
simplistic position regarding indentation espoused in that other-
wise excellent document.
-*- Rant On, and on -*-
Let's compare two approaches to the tab/indentation issue with a
small code sample using tabs then spaces. This snippet happens to
be the key to top's use of dynamic colors on many static screens,
while also ensuring screen width isn't exceeded so as to avoid
line wraps. We'll view just the first 40 columns, assuming one
wishes to occasionally provide comments to the right of actual
code (you do, don't you?).
Then YOU decide which approach makes the most SENSE!
Stinkin' Tabs versus Spaces: the Linus way
Hey, where'd my +----+----1----+----2----+----3----+----4+
many code lines | while (*sub_beg) { :
up-and-gone-to? | switch (*sub_end:
| case 0: :
Gosh, wonder if | \ Tabs Induced / :
Linus expects a | case 1: :
fellow to stick | + WASTE-Lands! + case 5: :
his comments on | :
the left side?! | + Not a Living + :
| :
Ever see source | + line-of-code + :
with not enough | :
whitespace; and | / To Be Found! \ :
this is better? | default::
| :
Oh lookie here, \ } :
there's just a hint of REAL code! ----> if (0 >= room) b:
/ } /* end: while 'subtrin:
Spaces versus Stinkin' Tabs: the other way
Wow, now this is | while (*sub_beg) { :
Visible hackin'! | switch (*sub_end) { :
| case 0: :
Hmmm, wonder how | *(sub_end + 1) = '\0'; :
many programmers | case 1: case 2: case 3: case:
read those lines | case 5: case 6: case 7: case:
from the LEFT to | cap = Curwin->captab[(int:
the RIGHT? This | *sub_end = '\0'; :
"innovation" may | PUTP("%s%.*s%s", cap, roo:
possibly benefit | room -= (sub_end - sub_be:
those particular | sub_beg = ++sub_end; :
kinds of people, | break; :
you agree? Duh! | default: :
| ++sub_end; :
AND, there might | } :
even be room for | if (0 >= room) break; :
unseen comments! | } /* end: while 'subtrings' */ :
Gosh, I just don't KNOW -- it's such a TOUGH choice...
Oh you Stinkin' Tabs: correspondence, Who-Cares; documentation,
Oh-Alright; even scripts, Well-If-You-Must. But you have NO place
within the code-space of MY C-source listing! So be gone
In Summation...
- If you want to use tabs to the right of the code, go-for-it.
But PLEASE, not ever in the C-source code-space, thank-you-
kindly. Just use three little ol' spaces (exactly 3, no-more,
no-less) where you WOULD have stuck a stinkin' tab.
We'll get far more READABLE files, much less WAISTED precious
horizontal space, more consistent CURSORS and on, and ON, AND
ON! Plus, without those awful *the-devil's-own-handiwork*, the
aforementioned document need NEVER speak of their EVILS again.
- Lastly, since SPACES (not stinkin' tabs) are SO beneficial,
maybe we should use just a few more of 'em. Some of those C-
thingies are VERY sensitive -- they don't like being TOUCHED
by any other syntax element! Which ones? Why these guys:
braces, reserved words and binary operators
( it's the TRUTH, they told me themselves )
It's so EASY to keep 'em HAPPY! And lo-and-behold, the combi-
nation of <sp>thingy<sp> turns out to be a darn effective bug
repellent, too. So much so, one can actually code while
TOTALLY NUDE yet still avoid them ol' bug-bytes (sic-sic)!
[1 +5 +5 +5 = huh?]
## 4c. EXAMPLES of Windows ---------------------------------------------##
-*- The 'A' Mode Command Toggle -*-
Here's what you'll see when you first invoke the alternate-display
mode interactive command.
This particular display was produce on a VT100 xterm, with only 24
rows. All four task displays are visible, but they could not be sized
the same. Available lines are parceled out in the fairest way possi-
ble so the last two task displays have an extra line each.
Notice the 'current' window name in the summary area -- it's been
emphasized because the associated task display is visible. Since
1:Def has a task area, the full range of interactive commands would be
at your disposal. But remember, many of those commands will apply
only to window 1:Def.
1:Def name is bold, |1:Def - 15:46:37 up 16:25, 9 users, :
thus all commands |Tasks: 76 total, 1 running, 75 sle:
will be available. |Cpu(s): 0.7% user, 1.3% system, :
|Mem: 126588k total, 123688k used,:
|Swap: 265032k total, 8232k used,:
Tough luck windows |1__PID_USER______PR__NI_%CPU____TIME+_:
#1 & 2 - you lost | 7343 jtwm 16 0 0.9 0:00.59:
one line each -- | 7339 jtwm 9 0 0.0 0:00.02:
guess you'll just |__7337_root_______9___0__0.0___0:01.30:
have to learn how |2__PID__PPID_Command____________TIME+_:
to live with it. | 997 952 kdeinit 17:59.59:
| 1115 952 kdeinit 2:16.47:
The #3 & #4 windows | 4634 12.3 15620 0 15m 860 14m :
better not gloat | 7337 11.3 14396 92 13m 36 13m :
over 1 extra line. | 923 10.6 30524 16m 13m 1120 12m :
That user could yet |___991__7.2__9492__316_9176___12_9164_:
sock 'em with the |4_UID_USER_____GROUP____TTY________PID:
'n' command and | 43 xfs xfs ? 806:
take those lines, | 0 ykde users pts/7 5561:
plus others, away! | 0 wgnome users pts/7 5560:
| 0 root root pts/7 5325:
So, what say we start applying some of those "full range of interac-
tive commands"?
Onward + Downward...
-*- STACKIN' & WHACKIN' Windows -*-
Whoa, hold on mate. Someone has already whacked these windows. See,
there are no task areas for windows 1:Def and 4:Usr. Well, we can at
least retrace their steps...
Here's what was done, after issuing the 'A' command and entering
alternate-display mode.
1) When #1 was the 'current' window, '-' was pressed,
toggling Off the associated task display
( if 'l t m' had been applied to its summary, too )
( then there'll be only a msg line when 'current' )
2) Then the 'w' key was struck to cycle backward,
making 4:Usr the 'current' window
(could have used 'a a a', if one likes to type)
3) Then step #1 was repeated, and bye-bye window #4
4) Finally, window #2 was made the 'current' window
( Q. how many keystrokes were used? )
( A. minimum of 2: 'a a' or 'w w'. )
No 'l','t','m','1' |2:Top - 15:48:35 up 16:27, 9 users, :
commands have been |Tasks: 75 total, 1 running, 74 sle:
issued here, |Cpu(s): 2.0% user, 0.7% system, :
but... |Mem: 126588k total, 123712k used,:
|Swap: 265032k total, 8232k used,:
#2's been changed; |2__PID__PPID_Command____________TIME+_:
user applied a 'c' | 997 952 kdeinit: konsol 18:00.70:
command (when it | 1115 952 kdeinit: konsol 2:16.47:
was current) - now | 1803 1116 led tiptop.HELP 1:55.30:
shows cmd lines vs. | 923 922 X :0 1:09.60:
program names; | 973 1 klaptopdaemon 0:59.63:
still seems to be | 981 952 /usr/bin/artsd 0:48.63:
sorted on TIME+ | 987 1 kdeinit: kdeskt 0:24.34:
though |___991_____1_kdeinit:_kicker___0:04.59:
This #3 guy appears | 4634 12.3 15620 0 15m 860 14m :
to still be running | 7337 11.3 14396 92 13m 36 13m :
with the supplied | 923 10.6 30544 16m 13m 1120 12m :
defaults, but no | 991 7.2 9492 316 9176 12 9164 :
telling what damage | 7329 7.0 9036 140 8896 36 8860 :
might have been | 1115 6.9 8956 160 8796 36 8760 :
done to it's | 987 6.4 8668 524 8144 20 8124 :
summary info stuff | 1131 6.4 8268 144 8124 36 8088 :
And that's what brought us to this current state. No, wait. Oh
lordy, will you look at that -- someone has changed the name of win-
dow #2 from 'Job' to 'Top'!
How'd they do that? Well, they just issued the 'g' interactive com-
mand, of course. That command is available whenever alternate-display
mode is active and always impacts just the 'current' window. Gosh,
you can even issue the 'g' command when 'l' has toggled Off the very
summary area line containing the window name!
Almost Done...
-*- ALL TOGETHER Now, Window(s) -*-
Here, the window 1:Def task display has been toggled Off but it
remains the 'current' window. Since there is no task area, many com-
mands will be restricted. However, the commands ('l', 't', 'm', '1')
affecting the summary area, as well as some other global commands
('k', 'Z', etc.), would still be active.
Notice that the Mem and Swap lines are not shown. This means that the
loser (oops, user) has, in fact, issued the 'm' command! Now, if you
were to cycle the 'current' window with the 'a' or 'w' commands, the
task display would remain the same (except possibly growing/shrinking
slightly) but the summary area would change periodically.
The comments to the left of the image provide additional insights into
how things came to be. Note especially the comments for window 4:Usr
-- the one with some empty rows...
1:Def no highlight, +--------------------------------------+
thus disabled cmds: |1:Def - 15:50:32 up 16:29, 9 users, :
b,i,n,u,x,y, etc. |Tasks: 75 total, 2 running, 73 sle:
& m = lost Mem/Swap |Cpu(s): 10.6% user, 0.0% system, :
2:Job was very busy: |2__PID__PPID_Command____________TIME+_:
'n' cmd, w/ 7 tasks | 80 1 ( khubd ) 0:00.00:
'c' cmd, cmd line | 6 0 ( kreclaimd ) 0:00.00:
'O' cmd, sort cmd | 9 1 ( mdrecoveryd ) 0:00.00:
'R' cmd, sort bkwd | 11358 1 /bin/bash/ /usr 0:00.00:
'x' cmd, hi column | 1297 1 /sbin/mingetty 0:00.00:
(when 2 WAS current) | 683 1 xinetd -stayali 0:00.00:
3:Mem has altered |3__PID_%MEM__VIRT_SWAP__RES_CODE_DATA_:
some std defaults: | 4634 12.3 15620 0 15m 860 14m :
'y' turned Off | 7337 11.3 14396 92 13m 36 13m :
'x' turned On | 923 10.6 30544 16m 13m 1120 12m :
(when 3 WAS current) | 991 7.2 9492 316 9176 12 9164 :
Huh? 4:Usr has some |4_UID_USER_____GROUP____TTY________PID:
blank rows! ? ? ? ? | 0 jtwm root pts/2 5561:
Aha, the 'i' command | 0 root root ? 5560:
applied (when 4 WAS | :
current); could be | :
reversed with '=', | :
when 4 IS current! +--------------------------------------+
Ok now, how about that 'current' window 1:Def and its unseen tasks?
At any time, you can quickly retrieve lost tasks in a number of ways:
1) Press '-', toggling just the 'current' window
2) Press '_', toggling all visible/invisible windows
( 1:Def is the only window currently not shown )
( afterward, it'll be the only window showing! )
* 3) Press '+', forcing all task displays to become visible
4) Press 'A' to return to full-screen mode,
with only 1:Def tasks shown and without a window name
Now that should be enough ways of getting a task area visible again to
satisfy almost any user, don't ya think?
Note: Use #3 above when you've messed up your screen beyond
redemption. The four task displays will reappear, nice and even.
They will also have retained any customizations you had previously
applied, except for the 'i' (idle tasks) and 'n' (max tasks) com-
That's It ! Piece of Cake !! Enjoy them there windows !!!