вторник, 26 октября 2010 г.

Использование OmniThread Libray (OTL) для создания многопоточных приложений - 17

Информация об окружении

В данном разделе мы поговорим об интерфейсах предоставляющих различную информацию об окружении. С помощью них мы можем получить данные о системе, информацию, о количестве процессоров в системе, потоках. Эти интерфейсы представлены в модуле OtlCommon.pas.

Основной интерфейс, предоставляющий данную информации об окружении, является IOmniEnvironment. Он в свою очередь имеет следующие свойства и методы:
Интерфейс IOmniEnvironment
  IOmniEnvironment = interface ['{4F9594E2-8B88-483C-9616-85B50493406D}']

    . . .

    property Process: IOmniProcessEnvironment read GetProcess;

    property System: IOmniSystemEnvironment read GetSystem;

    property Thread: IOmniThreadEnvironment read GetThread;

  end; { IOmniEnvironment }

Данный интерфейс возвращает информацию о  процессе (Process), системе (System) и потоке (Thread). Как видите данный интерфейс, возвращает ссылки на другие интерфейсы, дающие более подробную информацию. Стоит сказать также, что программист в некоторых случаях может управлять данной информацией (изменять ее). Это в основном касается интерфейсов IOmniProcessEnvironment и IOmniAffinity которых мы рассмотрим далее.
Рассмотрим более подробно данные интерфейсы:
Интерфейс IOmniProcessEnvironment
IOmniProcessEnvironment = interface ['{98D6BDA3-840B-4E19-B01D-633E6A239FE9}']

    function  GetAffinity: IOmniAffinity;

    function  GetMemory: TOmniProcessMemoryCounters;

    function  GetPriorityClass: TOmniProcessPriorityClass;

    function  GetTimes: TOmniProcessTimes;

    //

    property Affinity: IOmniAffinity read GetAffinity;

    property Memory: TOmniProcessMemoryCounters read GetMemory;

    property PriorityClass: TOmniProcessPriorityClass read GetPriorityClass;

    property Times: TOmniProcessTimes read GetTimes;

  end; { IOmniProcessEnvironment }

Интерфейс возвращает информацию о задействованных процессорах, используемой памяти, приоритете процесса и времени  выполнения.

Для определения памяти занимаемым процессом используются метод Memory который в свою очередь возвращает TOmniProcessMemoryCounters, которая на самом деле является структурой _PROCESS_MEMORY_COUNTERS которая на выходе и передает нужную нам информацию о занимаемой процессом памяти. Аналогично информацию о памяти Вы смогли бы получить, если бы использовали GetProcessMemoryInfo, однако OTL  делает это за вас.
Сама структура  _PROCESS_MEMORY_COUNTERS определена как:
  _PROCESS_MEMORY_COUNTERS
  _PROCESS_MEMORY_COUNTERS = packed record

    cb: DWORD; // Размер структуры в байтах.

    PageFaultCount: DWORD;      

    PeakWorkingSetSize: DWORD;

    WorkingSetSize: DWORD;      // Занимаемая процессом память, нужный нам параметр

    QuotaPeakPagedPoolUsage: DWORD;

    QuotaPagedPoolUsage: DWORD;

    QuotaPeakNonPagedPoolUsage: DWORD;

    QuotaNonPagedPoolUsage: DWORD;

    PagefileUsage: DWORD;   

    PeakPagefileUsage: DWORD;

  end;

Переменная  WorkingSetSize и дает нужный нам объем занимаемой памяти

Информация о приоритете процесса возвращается как одно из значений
  TOmniProcessPriorityClass = (pcIdle, pcBelowNormal, pcNormal, pcAboveNormal,

                               pcHigh, pcRealtime);

Информация о времени работы процесса возвращается в структуре TOmniProcessTimes.
TOmniProcessTimes
  TOmniProcessTimes = record

    CreationTime: TDateTime; {Дата создания}

    UserTime    : int64;     {Время выполнения в пользовательском режиме}     

    KernelTime  : int64;     {Время выполнения в режиме ядра}

  end; { TOmniProcessTimes }

                                                                                                         
Время выполнения представлено структурой данных FILETIME. Такая структура содержит два 32-битные значения (DWORD), которые объединяются в 64-битную переменную (Int64), в которой хранится число  в 100-наносекундных интервалах (0.1 сек), прошедших с первого января 1601 года по Гринвичу. Дополнительные сведения о структуре _FILETIME см. в библиотеке MSDN.

Информация о задействованных процессорах системы возвращается в методе Affinity в интерфейсе IOmniAffinity, который определен как
IOmniAffinity
  IOmniAffinity = interface

    property AsString: string;

    property Count: integer; {Задействовано процессоров}

    property Mask: DWORD; {CPU affinity mask – маска родства}

  end;

Маска родства, указывает, на каком процессоре(ах) выполняется поток данного процесса. В основном данные этой маски служат для управления планировщиком операционной системы и применяются для балансировки нагрузки. Подробнее смотрите в MSDN.

Пойдем далее, информация о системе представлена в интерфейсе IOmniSystemEnvironment:
Интерфейс IOmniSystemEnvironment
  IOmniSystemEnvironment = interface ['{9BE1EFE3-4ABB-4C2F-B2A4-B014D0949FEC}']

    function GetAffinity: IOmniAffinity;

  //

    property Affinity: IOmniAffinity read GetAffinity;

  end; { IOmniSystemEnvironment }

Как видите, данный интерфейс в методе Affinity, возвращает уже знакомый нам интерфейс IOmniAffinity.

Информация о потоке, представлена в интерфейсе IOmniThreadEnvironment, который определен как:
IOmniThreadEnvironment
  IOmniThreadEnvironment = interface
['{5C11FEC7-9FBE-423F-B30E-543C8240E3A3}']

    function  GetAffinity: IOmniAffinity;

    function  GetID: cardinal;

    {Информация о задействованных процессорах}

    property Affinity: IOmniAffinity read GetAffinity;   

    property ID: cardinal read GetID; {Идентификатор потока}

  end; { IOmniThreadEnvironment }

Комментариев нет:

Отправить комментарий