What Every Programmer Should Know about How CPUs Work