At the high level (quite abstract):
http://cs.brown.edu/~ugur/8rulesSigRec.pdf
At the low level, basically it means (whether it is hardware or software):
a. no caching: software cache, hardware cache etc.
b. no pipelining of instructions: this is simply because at each branch points a lot of executed instructions may have to be thrown away, resulting in indeterminacy.
c. no asynchronous mechanism (eg, interrupt). use polling whenever possible. this is because in interrupt mehanism, we are not sure when the event will happen.
d. highly clock-based or clock triggered mechanism: this usually means a sophisticated way of distributing the clock signals inside the hardware (lookup "Clock Tree Sythesis").
e. I have used LynxOS RTOS before. It has high responsiveness and predictability in its processing. But if you look at its internals, you will see that it skips a lot of unlikely event error processing - especially if it is hardware resources (eg, memory). so memory is always assume to be available - simply because it has low threshold in its entire design - to ensure maximum limits are seldom reached. Of course, the moment you pushed the numbers to its limits (eg, spawning lots of processes) the realtime behavior of LynxOS does not exhibit anymore.