Virtualization is a way of simultaneously running multiple operating systems on a physical computer. Virtualization can run on virtually every machine, from embedded systems-on-chip, to large datacenters and cloud environments. Simple on its surface, virtualization taps into possibilities that would be either unavailable or too involved to obtain from non-virtualized hardware. In this light, the aim of this paper is to provide a survey and analysis of virtualization and its applications, and trace ways of its usage in teaching of CS courses as well as the equipping of well-rounded CS laboratories with virtualization capabilities. The hope is that this survey will be of value to instructors, laboratory administrators as well as to advanced students undertaking a self-study of operating systems and their applications.