My understand of changing runlevels is that
init "diffs" the old and new runlevel and starts / kills services whose status will changed.
In the given example,
/etc/rc.multi would not be re-executed because it's already running. If you had
rm:45:wait:/etc/rc.multi in your
/etc/inittab, and went from runlevel 5 -> 3 -> 5,
/etc/rc.multi would be killed (-> 3) and then started (-> 5) because it's not set for runlevel 3.
From the manpage:
When init is requested to change the runlevel, it sends the warning signal SIGTERM to all processes that are undefined in the new runlevel. It then waits 5 seconds before forcibly terminating these processes via the SIGKILL signal.
/etc/inittab is rescanned as you described:
After it has spawned all of the processes specified, init waits for one of its descendant processes to die, a powerfail signal, or until it is signaled by telinit to change the system's runlevel. When one of the above three conditions occurs, it re-examines the /etc/inittab file. New entries can be added to this file at any time. However, init still waits for one of the above three conditions to occur.