Processes on modern operating systems are a type of virtual machine. On Linux or Windows, processes are provided with the illusion of infinite memory. And there is the illusion of infinite parallel threads of execution, bounded only by storage. That is a kind of virtualization, just not full machine virtualization.
At the machine level the boundary between machine instructions and system calls and API becomes blurry. If you don't have a floating point unit, the instructions trap and a routine in the kernel can perform the same thing. Instruction sets are APIs. Many operating systems present their system calls as if they were special machine instructions.
This kind of phrasing is less common today, where "virtual machine" is usually equivalent to "full machine virtualization", but you'll encounter this broader sense in earlier literature.
The Visi-On API provides a handle-based memory manager. Handles are a kind of managed pointer that allow memory blocks to be moved around even though the hardware does not have virtual memory. So long as the program always follows the rules on acquiring and releasing the handle before using the underlying pointer, it enables a kind of poor man's virtual memory. The first version of Mac OS and Windows 3.x worked in a similar way. I'm guessing that the designers of Visi-On thought of this, and the other abstractions the API provides, as a kind of virtualization.
At the machine level the boundary between machine instructions and system calls and API becomes blurry. If you don't have a floating point unit, the instructions trap and a routine in the kernel can perform the same thing. Instruction sets are APIs. Many operating systems present their system calls as if they were special machine instructions.
This kind of phrasing is less common today, where "virtual machine" is usually equivalent to "full machine virtualization", but you'll encounter this broader sense in earlier literature.