A Fault-Tolerant Scheduling Algorithm Based on Checkpointing and Redundancy for Distributed Real Time Systems