Running Win16 Applications in Separate Memory Spaces
Like the DOS VDM, the Win16 VDM is a multithreaded process wherein each Win16 application is a different thread of execution. The Win16 VDM is multitasked, so you can run a shared WOW VDM concurrently with threads from other system processes (e.g., Win32 processes). However, because of the Win16 VDM design, the system can service only one thread representing one Win16 application within one VDM and WOW process at a time. While the system is servicing the thread for one Win16 application, the NT thread dispatcher (or scheduler) blocks the other threads within the same WOW environment. Whenever some process (e.g., a higher priority thread) preempts this thread, the thread dispatcher resumes with the thread that was last preempted.
For better performance, memory isolation, and application protection, you can run each 16-bit Windows application in its own VDM. Using a separate VDM for each application lets you run simultaneous Win16 application threads and provides better application stability by isolating the memory space of each 16-bit application. Running multiple application threads is of particular benefit on multiprocessor machines, which can execute these threads simultaneously. However, memory usage is a major disadvantage of using separate VDMs. Because you're launching a separate VDM (and WOW environment) for each Win16 application, you use more memory than if you run all Win16 applications in one shared VDM and WOW process. Therefore, you want to launch separate VDMs for each Win16 application only if your system has plenty of available RAM.
Another concern with running each Win16 application in its own memory space is that the application can cause interoperability problems for other applications that use shared memory to communicate. Although most applications use methods such as Dynamic Data Exchange (DDE) and Object Linking and Embedding (OLE) to share data, old applications might use shared memory and fail to communicate properly. If you encounter such applications, configure them to run in a shared memory space rather than a separate one.
To make each 16-bit application (including Win16 and DOS applications) run it its own memory space, you must edit the shortcut that launches the application. Start by right-clicking the application's shortcut icon and choosing Properties from the context menu. Next, select the Run in Separate Memory Space check box. After you make these changes, the application will run in a separate memory space every time you run the application. You can accomplish the same goal for dynamic executions of an application by selecting the Run in Separate Memory Space check box in the Start menu's Run window, as Screen 2 shows, or by entering the following command-line option:
start /separate <application filename>
Alternatively, you can run a Win16 application in a shared memory space with other Win16 applications by typing
start /shared <application filename>
Always configure crash-prone applications or those requiring maximum stability to run in separate memory space. If you avoid sharing memory address space (which errant applications in the same shared environment can violate) and system resource pools (memory heaps) with other Win16 applications, the application will be less likely to experience problems. You might want to create two shortcuts for each of your 16-bit applications: one to run the application in a separate memory space and another to run the application in a shared memory space.
Configuring WOW to Use Separate Memory Spaces by Default
Configuring Win16 applications on a case-by-case basis using shortcuts or command-line entries is useful only if you want to run some of your applications in separate memory spaces. To run all your Win16 applications in separate memory spaces all the time, you can edit the Registry so that your system defaults to using a separate memory space for each Win16 application. To enable this behavior, use a Registry editor (e.g., regedt32) to set the DefaultSeparateVDM value to yes in HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WOW. DefaultSeparateVDM specifies whether each Win16 application runs its own instance of ntvdm.exe and wowexec.exe in its own memory space. Setting the value to yes ensures that all future Win16 applications start with a separate memory space by default. Screen 3 shows this value in the Registry.
Other WOW-related Registry Entries
In addition to setting the DefaultSeparateVDM value, you can use the Registry to configure other aspects of the WOW application environment. Some values, such as the size of the WOW environment (for RISC machines) or the command-line options, are in the same WOW subkey as the DefaultSeparateVDM value. Other values are in different subkeys in the SOFTWARE hive.
To change the size of the WOW environment, locate the wowsize value in HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WOW. This setting applies to only RISC-based systems. Intel-based systems ignore this setting because NT provides all memory on Intel systems on an as-needed basis. This value (ranging from 0MB to 16MB) sets the size of the WOW environment, and NT determines the default value according to the system configuration. Because of the overhead associated with the WOW VDM, for each megabyte that you specify in this setting, NT allocates 1.25MB of memory. Therefore, a wowsize value of 4MB uses 5MB of memory, even though applications can access only 4MB.
Table 1 shows the recommended WOW VDM sizes for various systems according to the amount of installed memory. You can use this table as a guide for selecting the wowsize value for your RISC-based NT machine. Most applications will fail if you set the wowsize value to less than 3MB. Therefore, always set this value to at least 3MB, and set it higher if possible.
Most NT RISC system users don't have to worry about the wowsize value because most RISC-based computers have at least 32MB of memory. A large wowsize value will cause problems only when memory resources are limited and little or no memory is available for other applications or the system. Also, remember that the WOW VDM continues to run even after the Win16 application that invoked it has terminated.
Another Registry value in the WOW subkey that you can set for the WOW subsystem is wowcmdline. Only the WOW VDMs (those processes that Win16 applications invoke) use this value, which specifies the command-line parameters that NT issues when you invoke a 16-bit Windows application. You specify the path to ntvdm.exe and any of the following optional switches: -a, which specifies a command to pass to the VDM; -f, which specifies the directory to find ntvdm.exe; -m, which hides the VDM console window; or -w, which specifies the WOW VDM. The default value is %SystemRoot%\system32\ntvdm.exe -a%SystemRoot%\system32\krnl386.
You can find other WOW-related Registry entries at HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Windows NT\CurrentVersion\WOW. This Registry location references the Windows 3.x system.ini file. The values in the subkeys at this location are the same items you might find under the corresponding system.ini headings (NT maintains these settings for backward compatibility with Win16 applications).
That's All the WOW for Now
Although computer users running applications in a 32-bit environment often overlook the WOW subsystem, it is still an important part of NT for 16-bit Windows applications users. By following the tips outlined in this article, you can gain control over WOW's behavior and optimize the subsystem's configuration for your machine and application environment.
End of Article
Rob October 16, 2003