Source: http://pages.cs.wisc.edu/~dusseau/Classes/CS537-F07/Lectures/lecture11.pdf