Two famous methods of Dynamic Scheduling are scoreboarding and Tomasulo's algorithm. This is like a ticket taker who doesn't make people with their tickets ready wait for people who have to find the somewhere in their purse. Actually a refinement of the same advantage, it maximizes the throughput of the functional units. This prevents, for example, a stalled instruction from hogging the only available multiplier unit so that a later, independent multiply must wait. There is a limit to the amount of rescheduling that can be done, because programs have many dependencies between consecutive instructions, preventing the program from finding another instruction that can be run.
Studies show that instructions which are more seperated in the code are less likely to be dependent.
Branch Prediction complicates the algorithm. If we stall on branches, the benefit of dynamic scheduling will be small, since branches occur roughly every 7 instructions, so that the basic block to find indepent instructions in is only about 6 instructions. This can be improved by speculatively executing instructions, and only perfoming the instruction once the prediction turns out to be true. Interupts become messy, because its unclear what the precise state of the machine is upon recieving the interupt, since some instructions are not running, while later ones are running. So precise interrupts are very difficult to implement.