Hardware and Software Architectures for Fault Tolerance