Процесс - концепция уровня ОС, описывающая ресурсы (память, потоки, подключенные библиотеки и проч.), используемые выполняющейся программой. Системы, которые могут выполнять много процессов одновременно, называются многозадачными.
Каждый процесс имеет один первичный поток, и может создавать дополнительные. Поток представляет собой выполняющийся одновременно с другими потоками программный код. Все потоки в рамках одного процесса разделяют общую память. Приложения, использующие несколько параллельно выполняющихся потоков, называются многопоточными.
Создание многопоточных приложений может приводить к появлению дополнительных ошибок, не возникающих в однопоточных приложениях. Например, если один поток начинает изменять какой-либо ресурс, а другой пытается прочитать его значение до полного изменения. Для избавления от таких ошибок применяется синхронизация: при обращении потока к какому-то ресурсу применяются механизмы, заставляющие другие потоки, пытающиеся получить доступ к тому же ресурсу, приостановить свое выполнение, пока ресурс не будет освобожден. Однако использование синхронизации может приводить в свою очередь к другим ошибкам, например, так называемым deadlock -ам, когда два или более потоков взаимно ожидают освобождения захваченных остальными ресурсов. При этом возобновление их работы становится невозможным. Также данные ошибки из-за трудности предсказания работы планировщика, управляющего выделением процессорного времени потокам, часто могут быть трудно воспроизводимыми и плохо поддаваться отладке. Чтобы избежать таких проблем, многопоточные приложения требуют внимательного и аккуратного подхода к разработке архитектуры взаимодействия потоков.
|
|
Для получения информации о процессах и потоках в.NET используются классы пространства имен System.Diagnostic, например:
Process | Предоставляет доступ к локальным и удаленным процессам, а также позволяет запускать и останавливать процессы программным образом |
ProcessModule | Представляет модуль (*.dll или *.ехе), который должен загружаться в определенный процесс. |
ProcessStartlnfо | Позволяет указывать набор значений, которые должны использоваться при запуске процесса посредством метода Process.Start () |
ProcessThread | Представляет поток внутри определенного процесса. Этот тип применяется для диагностики потоков в процессе, но не для запуска новых |
Некоторые члены класс Process:
Handle | Дескриптор (IntPtr), который был назначен процессу операционной системой |
Id | Идентификатор (PID) соответствующего процесса. |
MachmeName | Имя компьютера, на котором выполняется соответствующий процесс. |
MainWmdowTitle | Заголовок главного окна процесса (если нет главного окна — пустая строка). |
ProcessName | Это свойство позволяет получать имя процесса (совпадает с именем приложения) |
Responding | Отвечает ли приложение на запросы системы (не зависло ли оно) |
StartTime | Время запуска процесса |
Threads | Потоки процесса |
CloseMainWindow() | Отправляет процессу с GUI сообщения о закрытии главного окна |
GetCurrentProcess() | Возвращает текущий активный процесс |
GetProcesses() | Возвращает списо выполняющихся в данный момент процессов |
Kill() | Завершает соответствующий процесс |
Start () | Запускает новый процесс (имеет несколько версий, позволяющих контролировать запуск, передавать приложению параметры и т.п.) |
Пример запуска приложения при помощи метода Start():
|
|
Process ieProc = null;
// Запустить Internet Explorer и перейти на страницу facebook.com.
ieProc = Process.Start("IExplore.exe", "www.facebook.com");
Console.ReadLine();
// Завершить процесс
ieProc.Kill();