Этот термин «виртуальный процесс» необычен, но на основании вашего описания я могу привести 2 реальных примера использования каждого из них.
Для многопоточности представьте, что у вас есть много данных в памяти и вы хотите выполнить некоторые вычисления на них ... вы можете разделить эти данные и получить отдельные потоки (по одному на ядро ЦП, в идеале), одновременно работая над разными блоками данные. Таким образом, вычисления будут выполняться быстрее в зависимости от того, сколько потоков вы создадите.
Для «виртуального процесса» представьте, что вам нужно извлечь 20 файлов с удаленных серверов ... большая часть «работы» ЦП заключается в том, чтобы просто ждать, пока байты не поступят из удаленной сети. Создание отдельных потоков для загрузки каждого из этих файлов не приведет к более быстрому прибытию файлов. Во всяком случае, наличие дополнительных потоков, между которыми ОС должна постоянно переключаться (и это переключит LOT, потому что большую часть времени каждый поток просто скажет «я все еще жду», а затем уступит управление). Таким образом, в этом случае лучше иметь один поток, выполняющий всю загрузку, с циклическим циклом между каждой из задач загрузки для считывания входящих данных из их буферов.