Controller uses a driver program (such as mdrv.exe or r3vuser.exe) to run your Vusers.
If you run each Vuser as a process, then the same driver program is launched (and loaded) into the memory again and again for every instance of the Vuser. Loading the same driver program into memory uses up large amounts of RAM (random access memory) and other system resources. This limits the numbers of Vusers that can be run on any load generator.
Alternatively, if you run each Vuser as a thread, Controller launches only one instance of the driver program (such as mdrv.exe), for every 50 Vusers (by default). This driver process/program launches several Vusers, each Vuser running as a thread. These threaded Vusers share segments of the memory of the parent driver process. This eliminates the need for multiple re-loading of the driver program/process, and saves memory space, thereby enabling more Vusers to be run on a single load generator.
You can toggle between these options in runtime settings (F4): Select General > Miscellaneous > Multithreading.
Note: This option is available for selected protocols. The Multithreading section is visible only when it is applicable for the current protocol.