Application virtualization refers to several techniques that make running applications protected, flexible and easy to manage. Modern operating systems keep programs isolated from each other. If one program crashes, the remaining programs generally keep running. However, bugs in the operating system or apps can cause the entire system to come to a screeching halt or, at the least, impede ongoing operations, which is why virtualization became desirable. Following are several application virtualization methods. See virtualization, network virtualization and storage virtualization. Terminals to a Central Computer The oldest network architecture, all applications and data are stored in a centralized mainframe or server cluster. The user's PC functions like an input/output terminal to the central machine. See thin client. Application Streaming Rather than installing all applications in every user's machine, applications are delivered to each user as needed. This enables apps to be updated centrally and also provides a way to measure each person's actual usage. See application streaming. Write Once, Run Everywhere An interpreted programming language enables the same program to run on different hardware, with Java being the major example (see Java Virtual Machine). The applications are said to be "virtualized" because they run on any platform that has a runtime engine for that language. Dynamic Application Assignment This approach treats servers in the datacenter as a pool of operating system resources and assigns those resources to applications based on demand in real time. The pioneer in this area is Data Synapse Inc. (see FabricServer). The applications are said to be "virtualized" because they can run in any server.