Source: https://www.andrew.cmu.edu/course/18-613/lectures/21-io.pdf