Ответ 1
Представьте, что вы хотите показать своим друзьям, насколько прекрасен Тихоокеанский северо-запад. Вы решили отправиться в путешествие, чтобы щелкнуть несколько фотографий закат над Тихим океаном. Что вам действительно нужно, так это файлы изображений, отправляющиеся домой, где их можно загрузить в Facebook. На самом деле камеру, линзы и штатив нужно перетащить на Олимпийские игры и обратно. Вам также нужно привести фотографа (самого себя), который установит камеру и нажмите затвор. Фотограф должен быть перемещен туда и обратно с относительным комфортом, поэтому вы садитесь на место, где фотограф будет отдыхать во время поездки. Это место закрыто в блестящей металлической коробке с кучей других металлических, стеклянных и резиновых деталей, некоторые из которых поворачиваются и возвратно-поступательные. В конце концов, около двух тонн материала (и живого человека), совершающего многочасовую поездку, сжигают галлоны углеводородной жидкости - с целью перемещения нескольких бит информации с берега в Интернет.
Точно так же происходит с вашим приложением. Когда пользователь хочет открыть файл, используя диалоговое окно "Открыть файл", пользователь ожидает, что сможет:
- перейдите к каталогу, содержащему файл (каталог может находиться на локальном жестком диске или CD/DVD/BR или сетевом диске или архиве и т.д. Среда может быть зашифрована или сжата, что должно отображаться по-разному. не могут быть подключены, для чего пользователю может потребоваться запрос. Возможно, на носитель могут потребоваться учетные данные пользователя, которые должны быть заданы);
- подключиться к новому каталогу, используя его URI/UNC (сопоставить диск);
- найдите каталог для некоторых ключевых слов;
- копировать/удалять/переименовывать некоторые файлы;
- см. список файлов в этом каталоге;
- Предварительный просмотр содержимого каждого файла в каталоге;
- выберите, какой файл открыть;
- изменить свой ум и решить не открывать файл;
- делать много других связанных с файлом вещей.
Операционная система позволяет все это выполнить, по существу предоставляя вашему процессу большинство функций проводника Windows. И некоторые из них должны происходить в фоновом режиме, иначе пользователи будут жаловаться на то, как не реагировать на диалог Open File. Очевидный способ запуска некоторых задач в фоновом режиме - запустить их в разных потоках. Итак, что мы видим.
Как насчет нитей, оставшихся позади, спросите вы? Ну, некоторые из них остались там для случая, когда пользователь решит открыть другой файл: он экономит много времени, трафик и ввод текста в этом случае. Эта пользовательская проверка подлинности, используемая для этого одного конкретного процесса в последний раз? - сохранен. Значки предварительного просмотра для этих докучливых PDF файлов? -- все еще там. Длина и битрейт для каждого фильма в каталоге? - по-прежнему доступны, нет необходимости повторно анализировать их.
Конечно, нити не просто волшебным образом появлялись сами по себе. Посмотрите, сколько DLL было отображено в процессе. Посмотрев на некоторые из них, можно получить довольно интересную картину того, какая функциональность была добавлена.
Еще один интересный способ взглянуть на это - сбрасывать вызовы в момент создания каждого потока. Это показывает, какая DLL (а иногда и какой объект) их создала. Вот как x64 Win7 создает все потоки. Можно найти созданный поток кадров Explorer; некоторая активность OLE, которая будет использоваться для создания фильтров файлов, некоторые из которых могут генерировать значки предварительного просмотра, наложения и всплывающие подсказки; несколько потоков, принадлежащих поисковой подсистеме; перечислитель устройства оболочки (поэтому, если пользователь подключается к новому устройству, он автоматически появится в диалоговом окне открытия); монитор сетевой оболочки (то же самое) и другие материалы.
Хорошая новость: это происходит быстро и не добавляет слишком много накладных расходов на ваш процесс. Большинство потоков тратят большую часть времени на ожидание некоторых редких событий (например, USB-ключ, подключаемый к сети), поэтому процессор не тратит время на их выполнение. Каждый поток потребляет 1 Мбайт виртуального адресного пространства в вашем процессе, но всего лишь 4 КБ страниц реальной физической памяти. И большинство, если не все эти DLL файлы не используют загружаемую пропускную способность диска: они уже были в ОЗУ, поэтому они просто получили доступ к вашему процессу почти бесплатно.
В итоге пользователь получил множество полезных функций в мгновенном пользовательском интерфейсе, в то время как процесс должен был сделать очень мало для достижения всего этого.