Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² срСдС WindowsΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 51

Автор ДТонсон Π₯Π°Ρ€Ρ‚

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ поиск ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ тСкстового шаблона

Настало врСмя ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° процСссы Windows Π² дСйствии. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π½ΠΈΠΆΠ΅ Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° grepMP создаСт процСссы для поиска ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ тСкстового шаблона Π² Ρ„Π°ΠΉΠ»Π°Ρ…, ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ процСссу Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Π°ΠΉΠ». Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠ΅Ρ‚ UNIX-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ grep, хотя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ Π½Π°ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠ° ΠΊ любой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, которая полагаСтся Π½Π° стандартный Π²Ρ‹Π²ΠΎΠ΄. РассматривайтС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ поиска ΠΊΠ°ΠΊ "Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ ящик" ΠΈ считайтС, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° являСтся просто исполняСмой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ процСссом.

Командная строка ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

grepMP шаблон F1 F2 … FN

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 6.1 выполняСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π²ΠΈΠ΄Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ:

β€’ Π”ля поиска ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ шаблона Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΎΡ‚ F1 Π΄ΠΎ FN, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ процСсс, Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΉ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ исполняС ΠΌΡ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ процСсса ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° создаСт ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°: grep шаблон FK.

β€’ ΠŸΠΎΠ»ΡŽ hStdOut структуры STARTUPINFO Π½ΠΎΠ²ΠΎΠ³ΠΎ процСсса присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ дСскриптора Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСтся ΠΊΠ°ΠΊ наслСдуСмый.

β€’ ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ всСх процСссов поиска, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ для этого Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ WaitForMultipleObjects.

β€’ ΠŸΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ всСх процСссов поиска осущСствляСтся ΠΏΠΎΠΎΡ‡Π΅Ρ€Π΅Π΄Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² (Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²). Π’Ρ‹Π²ΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° осущСствляСт процСсс, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ cat (ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 2.3).

β€’ Π’озмоТности Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WaitForMultipleObjects ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ лишь максимально допустимым количСством дСскрипторов, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ устанавливаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ MAXIMUM_WAIT_OBJECTS (64), поэтому ΠΎΠ½Π° вызываСтся ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ.

β€’ Π”ля опрСдСлСния ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΡΡ‚ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ нахоТдСния Π΄Π°Π½Π½Ρ‹ΠΌ процСссом Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ шаблона ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса grep.

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ 6.1 ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ Π½Π° рис. 6.3. 

Рис. 6.Π—. Поиск тСкстового шаблона Π² Ρ„Π°ΠΉΠ»Π°Ρ… с использованиСм Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΠ²


ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 6.1. grepMP: Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска тСкстового шаблона 

/* Π“Π»Π°Π²Π° 6. grepMP. */

/* ВСрсия ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ grep, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ нСсколько процСссов. */

#include "EvryThng.h"


int _tmain(DWORD argc, LPTSTR argv[])

/* Для выполнСния поиска Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ², ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС, создаСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ процСсс. ΠšΠ°ΠΆΠ΄ΠΎΠΌΡƒ процСссу прСдоставляСтся Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. */

{

 HANDLE hTempFile;

 SECURITY_ATTRIBUTES StdOutSA = /* Атрибуты Π·Π°Ρ‰ΠΈΡ‚Ρ‹ для наслСдуСмого дСскриптора. */

  {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};

 TCHAR CommandLine[MAX_PATH + 100];

 STARTUPINFO StartUpSearch, Startup;

 PROCESS_INFORMATION ProcessInfo;

 DWORD iProc, ExCode;

 HANDLE *hProc; /* Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° массив дСскрипторов процСссов. */

 typedef struct {TCHAR TempFile[MAX_PATH];} PROCFILE;

 PROCFILE *ProcFile; /* Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° массив ΠΈΠΌΠ΅Π½ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². */

 GetStartupInfo(&StartUpSearch);

 GetStartupInfo(&StartUp);

 ProcFile = malloc((argc – 2) * sizeof(PROCFILE));

 hProc = malloc((argc – 2) * sizeof(HANDLE));

 /* Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ процСсс "grep". */

 for (iProc = 0; iProc < argc – 2; iProc++) {

  _stprintf(CommandLine, _T("%s%s %s"), _T("grep "), argv[1], argv[iProc + 2]);

  GetTempFileName(_T("."), _T("gtm"), 0, ProcFile[iProc].TempFile); /* Для хранСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска.*/

  hTempFile = /* Π­Ρ‚ΠΎΡ‚ дСскриптор являСтся наслСдуСмым */

   CreateFile(ProcFile[iProc].TempFile, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, &StdOutSA, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

  StartUpSearch.dwFlags = STARTF_USESTDHANDLES;

  StartUpSearch.hStdOutput = hTempFile;

  StartUpSearch.hStdError = hTempFile;

  StartUpSearch.hStdInput = GetStdHandle(STD_INPUT_HANDLE);

  /* Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ процСсс для выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. */

  CreateProcess(NULL, CommandLine, NULL, NULL, TRUE, 0, NULL, NULL, &StartUpSearch, &ProcessInfo);

  /* Π—Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ дСскрипторы. */

  CloseHandle(hTempFile);

  CloseHandle(ProcessInfo.hThread);

  hProc[iProc] = ProcessInfo.hProcess;

 }

 /* Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ всС процСссы ΠΈ Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ…. */

 for (iProc = 0; iProc < argc – 2; iProc += MAXIMUM_WAIT_OBJECTS) WaitForMultipleObjects( /* Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ использованиС достаточно большого количСства процСссов */

  min(MAXIMUM_WAIT_OBJECTS, argc – 2 – iProc), &hProc [iProc], TRUE, INFINITE);

 /* ΠŸΠ΅Ρ€Π΅ΡΠ»Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ Π½Π° стандартный Π²Ρ‹Π²ΠΎΠ΄ с использованиСм ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ cat */ 

 for (iProc = 0; iProc < argc – 2; iProc++) {

  if (GetExitCodeProcess(hProc[iProc], &ExCode) && ExCode==0) {

   /* ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ шаблон β€” ВывСсти Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. */

   if (argc > 3) _tprintf(_T("%s:\n"), argv [iProc + 2]);

   fflush(stdout); /* ИспользованиС стандартного Π²Ρ‹Π²ΠΎΠ΄Π° нСсколькими процСссами. */

   _stprintf(CommandLine, _T("%s%s"), _Π’("cat "), ProcFile[iProc].TempFile);

   CreateProcess(NULL, CommandLine, NULL, NULL, TRUE, 0, NULL, NULL, &StartUp, &ProcessInfo);

   WaitForSingleObject(ProcessInfo.hProcess, INFINITE);

   CloseHandle(ProcessInfo.hProcess);

   CloseHandle(ProcessInfo.hThread);

  }

  CloseHandle(hProc [iProc]);

  DeleteFile(ProcFile[iProc].TempFile);

 }

 free(ProcFile);

 free(hProc);

 return 0;

ΠŸΡ€ΠΎΡ†Π΅ΡΡΡ‹ Π² многопроцСссорной срСдС

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 6.1 процСссы ΠΈ ΠΈΡ… основныС (ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ эти) ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ практичСски ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ нСзависимо Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°. ЕдинствСнная Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ проявляСтся лишь Π² ΠΊΠΎΠ½Ρ†Π΅ выполнСния Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ выполнСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² SMP-систСмах ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ Windows ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² процСсса Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… нСзависимых процСссорах. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ этого ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Ссли ΠΎΡ†Π΅Π½ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π΅ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния всСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ΡΡ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ для этого с вашСй стороны Π½Π΅ трСбуСтся ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… дСйствий.

Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ тСстирования ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π’. Π’Π²ΠΈΠ΄Ρƒ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ ряда Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ нСобходимости ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ², Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΡ‚ количСства процСссоров Π½Π΅ являСтся Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π°Π»ΠΈΡ†ΠΎ, ΠΈ это автоматичСски обСспСчиваСтся ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая прСдусматриваСт ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ выполнСния нСзависимых Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ нСзависимым процСссам.

ВмСстС с Ρ‚Π΅ΠΌ, сущСствуСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ привязки процСссов ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ процСссорам, Ρ‡Ρ‚ΠΎ позволяСт всСгда Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ процСссоры ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ свободными ΠΈ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΈΠ½Ρ‹Ρ…, критичСских Π·Π°Π΄Π°Ρ‡. Π­Ρ‚ΠΎ достигаСтся Π·Π° счСт примСнСния маски родства процСссора (processor affinity mask) (см. Π³Π»Π°Π²Ρƒ 9) Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π·Π°Π΄Π°Ρ‡ (job objects) ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² настоящСй Π³Π»Π°Π²Ρ‹. 

НаконСц, Π²Π½ΡƒΡ‚Ρ€ΠΈ процСсса ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ нСзависимыС ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΈ для этих ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ спланировано Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ с использованиСм ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… процСссоров SMP для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ…. Бвязь ΠΌΠ΅ΠΆΠ΄Ρƒ использованиСм ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ показатСлями ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ обсуТдаСтся Π² Π³Π»Π°Π²Π΅ 7.

Π’Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ характСристики процСсса

Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π²ΡˆΠΈΡΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ GetProcessTimes, которая Π² Windows 9x отсутствуСт, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ характСристики процСсса, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ: ΠΈΡΡ‚Π΅ΠΊΡˆΠ΅Π΅ врСмя (elapsed time), врСмя, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ ядром (kernel time), ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ врСмя (user time). 

BOOL GetProcessTimes(HANDLE hProcess, LPFILETIME lpCreationTime, LPFILETIME lpExitTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime) 

ДСскриптор процСсса ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π½Π° процСсс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ, Ρ‚Π°ΠΊ ΠΈ Π½Π° процСсс, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ»ΠΎΡΡŒ. Вычитая врСмя создания процСсса (creation time) ΠΈΠ· Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса (exit time), ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΈΡΡ‚Π΅ΠΊΡˆΠ΅Π΅ врСмя, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… FILETIME являСтся 64-Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ; для вычислСния ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ разности ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ этого Ρ‚ΠΈΠΏΠ° с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏ LARGE_INTEGER Π² структуру Ρ‚ΠΈΠΏΠ° union. Π Π°Π½Π΅Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΎΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² Π±Ρ‹Π»ΠΎ продСмонстрировано Π² Π³Π»Π°Π²Π΅ 3 Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ lsw.

Ѐункция GetThreadTimes Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ описанной, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ указания дСскриптора ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ посвящСна Π³Π»Π°Π²Π° 7.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ характСристики процСссов

Наш ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ (ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 6.2) прСдставляСт собой ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ timep (ΠΎΡ‚ time print β€” Π²Ρ‹Π²ΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²), Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ UNIX-ΠΊΠΎΠΌΠ°Π½Π΄Π΅ time (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠΎΠΌΠ°Π½Π΄Π° time поддСрТиваСтся процСссором ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для нашСй ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ имя). ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° позволяСт вывСсти всС Ρ‚Ρ€ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ характСристики, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² Windows 9x Π±ΡƒΠ΄Π΅Ρ‚ доступно лишь ΠΈΡΡ‚Π΅ΠΊΡˆΠ΅Π΅ врСмя процСсса.

Одним ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ являСтся ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΈ эффСктивности Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… вСрсий Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ копирования ΠΈ прСобразования Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ· ASCII Π² Unicode, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Π³Π»Π°Π²Π°Ρ….