Frank, Keith, Rob, thank you guys very much for your explanations, links, diagrams, and clarifications! You and this forum are a great resource.
The only way I know to ask some of these questions is to try to compare how I know things work on the system I use to what I am trying to learn here. I realize that is not ideal because things are so different (but I have no other frame of reference) for instance we have no stack, no heap, and you have work to do to make a program reentrant, especially in assembler. But once it is reentrant, you have to work pretty hard to cause a race condition (not our terminology btw). I realize I don't use the x86/UNIX terminology precisely yet, I apoligize for not stating my questions as clearly as they should be. I am not trying to learn how to do everything on day one so much as I am trying to learn how not to shoot myself in the foot on day one by making idiotic mistakes (although doubtless I will!) and have to do major cleanup later on code I write now. I'm trying to understand the environment of x86/UNIX so I get the basics down enough not to hurt myself.
For example if somebody starts out on MVS and doesn't understand how make his code reentrant (and that can be far from trivial) and have its own working storage, it will be painful later to fix. Here it *appears to me* that as far as reentrancy and getting your own working storage goes, that is handled just by the way .data and .bss are implemented and the programmer doesn't have to do anything else in the single threaded case to make sure he doesn't step on himself or anybody else. I understand, especially from Rob's post that in the multithreaded case there are other storage management issues to be dealt with, especially because of the stack.