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

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

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

 FsLow = GetFileSize(hFile, NULL);

 nRec = FsLow / RECSIZE; /* ΠžΠ±Ρ‰Π΅Π΅ число записСй. */

 nRecTh = nRec / NPr; /* ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ записСй Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ. */

 /* Π Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ для Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ массива дСскрипторов ΠΈ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π² памяти мСсто для Ρ„Π°ΠΉΠ»Π°. Π‘Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ вСсь Ρ„Π°ΠΉΠ». */

 ThArg = malloc(NPr * sizeof(THREADARG));

 /* АргумСнты ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². */

 ThreadHandle = malloc(NPr * sizeof(HANDLE));

 pRecords = malloc(FsLow + sizeof(TCHAR));

 ReadFile(hFile, pRecords, FsLow, &nRead, NULL);

 CloseHandle(hFile);

 LowRecNo = 0; /* Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠ΅ сортировку. */

 for (iTh = 0; iTh < NPr; iTh++) {

  ThArg[iTh].iTh = iTh;

  ThArg[iTh].LowRec = pRecords + LowRecNo;

  ThArg[iTh].HighRec = pRecords + (LowRecNo + nRecTh);

  LowRecNo += nRecTh;

  ThreadHandle[iTh] = (HANDLE)_beginthreadex (NULL, 0, ThSort, &ThArg[iTh], CREATE_SUSPENDED, &ThId);

 }

 for (iTh = 0; iTh < NPr; iTh++) /* Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ сортировки. */

  ResumeThread(ThreadHandle [iTh]);

 WaitForSingleObject(ThreadHandle[0], INFINITE);

 for (iTh = 0; iTh < NPr; iTh++) CloseHandle(ThreadHandle [iTh]);

 StringEnd = (LPTSTR)pRecords + FsLow;

 *StringEnd = '\0';

 if (!NoPrint) printf("\n%s", (LPCTSTR)pRecords);

 free(pRecords);

 free(ThArg);

 free(ThreadHandle);

 return 0;

 } /* ΠšΠΎΠ½Π΅Ρ† tmain. */


static VOID MergeArrays(LPRECORD, LPRECORD);


DWORD WINAPI ThSort(PTHREADARG pThArg) {

 DWORD GrpSize = 2, RecsInGrp, MyNumber, TwoToI = 1;

 LPRECORD First;

 MyNumber = pThArg->iTh;

 First = pThArg->LowRec;

 RecsInGrp = pThArg->HighRec – First;

 qsort(First, RecsInGrp, RECSIZE, KeyCompare);

 while ((MyNumber % GrpSize) == 0 && RecsInGrp < nRec) {

  /* ΠžΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ слияниСм отсортированныС массивы. */

  WaitForSingleObject(ThreadHandle[MyNumber + TwoToI], INFINITE);

  MergeArrays(First, First + RecsInGrp);

  RecsInGrp *= 2;

  GrpSize *= 2;

  TwoToI *= 2;

 }

 _endthreadex(0);

 return 0; /* ΠŸΠΎΠ΄Π°Π²ΠΈΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‰ΠΈΡ… сообщСний. */

}


static VOID MergeArrays(LPRECORD p1, LPRECORD p2) {

 DWORD iRec = 0, nRecs, i1 = 0, i2 = 0;

 LPRECORD pDest, p1Hold, pDestHold;

 nRecs = p2 – p1;

 pDest = pDestHold = malloc(2 * nRecs * RECSIZE);

 p1Hold = p1;

 while (i1 < nRecs && i2 < nRecs) {

  if (KeyCompare((LPCTSTR)p1, (LPCTSTR)p2) <= 0) {

   memcpy(pDest, p1, RECSIZE);

   i1++;

   p1++;

   pDest++;

  } else {

   memcpy(pDest, p2, RECSIZE);

   i2++;

   p2++;

   pDest++;

  }

 }

 if (i1 >= nRecs) memcpy(pDest, p2, RECSIZE * (nRecs – i2));

 else memcpy(pDest, p1, RECSIZE * (nRecs – i1));

 memcpy(p1Hold, pDestHold, 2 * nRecs * RECSIZE);

 free (pDestHold);

 return;

ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ

Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π’ прСдставлСны Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ сортировки Ρ„Π°ΠΉΠ»ΠΎΠ² большого Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, содСрТащих записи Π΄Π»ΠΈΠ½ΠΎΠΉ 64 Π±Π°ΠΉΡ‚Π°, для случаСв использования ΠΎΠ΄Π½ΠΎΠΉ, Π΄Π²ΡƒΡ… ΠΈ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². SMP-систСмы ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΡƒΡ‡ΡˆΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. Упомянутый ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ "раздСляй ΠΈ властвуй" обСспСчиваСт Π½Π΅Ρ‡Ρ‚ΠΎ большСС, Ρ‡Π΅ΠΌ просто ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ проСктирования Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ²; ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ слуТит ΠΊΠ»ΡŽΡ‡ΠΎΠΌ ΠΊ использованию ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ SMP. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ для однопроцСссорных систСм ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Π² зависимости ΠΎΡ‚ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… характСристик систСмы. Π’ систСмах с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌ объСмом памяти (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ объСма физичСской памяти Π½Π΅ достаточно для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ наряду с ОБ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ процСссами Π² Π½Π΅ΠΉ умСстился вСсь Ρ„Π°ΠΉΠ») использованиС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ врСмя сортировки, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΡΠΎΡΡ‚ΡΠ·Π°ΡŽΡ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ собой Π² Π·Π°Ρ…Π²Π°Ρ‚Π΅ доступной физичСской памяти. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли памяти имССтся достаточно, Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ Π² случаС однопроцСссорных систСм. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ слСдуСт ΠΈΠ· прилоТСния Π’, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ сущСствСнно зависят ΠΎΡ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ распрСдСлСния Π΄Π°Π½Π½Ρ‹Ρ….

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ области хранСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

ΠŸΠΎΡ‚ΠΎΠΊΠ°ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ собствСнныС, нСзависимо распрСдСляСмыС ΠΈ управляСмыС ΠΈΠΌΠΈ области памяти, Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Π΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ процСсса. Одним ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² создания Ρ‚Π°ΠΊΠΈΡ… областСй являСтся Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateThread (ΠΈΠ»ΠΈ _beginthreadex) с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ lpvThreadParm, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ Π½Π° структуру Π΄Π°Π½Π½Ρ‹Ρ…, ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. ПослС этого ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ для Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… структур Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ Π½ΠΈΠΌ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ lpvThreadParm. Π­Ρ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 7.1.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Windows прСдоставляСт Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ области хранСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (Thread Local Storage, TLS), ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² собствСнным массивом ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ. ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ TLS ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½Π° рис. 7.3.

Π˜Π½Π΄Π΅ΠΊΡΡ‹ (строки) TLS ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π½Π΅ распрСдСлСны, Π½ΠΎ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ строки ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ минимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ число строк для любого процСсса опрСдСляСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ TLS_MINIMUM_AVAILABLE (Ρ€Π°Π²Π½Ρ‹ΠΌ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, 64). Число столбцов ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ создания Π½ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ….

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ рассмотрим ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ индСксами TLS. ЛогичСским пространством для этого слуТит основной ΠΏΠΎΡ‚ΠΎΠΊ, Π½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ индСксами ΠΌΠΎΠΆΠ΅Ρ‚ любой ΠΏΠΎΡ‚ΠΎΠΊ.

Ѐункция TlsAlloc Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ распрСдСлСнный индСкс (> 0) ΠΈΠ»ΠΈ –1 (0xFFFFFFFF) Π² случаС отсутствия доступных индСксов. 

DWORD TlsAlloc(VOID)

BOOL TlsFree(DWORD dwIndex) 

Рис. 7.3. Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ области хранСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² контСкстС процСсса


ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ значСния (ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Ρ‚ΠΈΠΏΠ° void), связанныС с Π΅Π΅ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ памяти, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ индСксы TLS.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚ всСгда Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠ±Π΅ΠΆΠ΄Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ индСкса TLS являСтся Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π±Ρ‹Π» распрСдСлСн с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ TlsAlloc, Π½ΠΎ Π½Π΅ Π±Ρ‹Π» освобоТдСн. 

LPVOID TlsGetValue(DWORD dwTlsIndex)

BOOL TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue) 

TLS ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ памяти, ΡΠ²Π»ΡΡŽΡ‰Π΅ΠΉΡΡ глобальной Π² контСкстС ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π½ΠΎ нСдоступной Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ. ΠžΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ΡΡ всСми ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. НСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступа ΠΊ TLS Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, любой ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠΈΡ‚ΡŒ индСкс TLS Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π²Ρ‹Π·Π²Π°Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ TlsFree, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ слСдуСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ с ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ. TLS часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ DLL Π² качСствС Π·Π°ΠΌΠ΅Π½Ρ‹ глобальной памяти Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ; Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ этого ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π² своС распоряТСниС ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, TLS ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ способ взаимодСйствия с функциями DLL, ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ этот способ примСнСния TLS являСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнным. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π² Π³Π»Π°Π²Π΅ 12 (ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 12.4) TLS ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для создания Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ DLL с ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ; Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π²Π°ΠΆΠ½Ρ‹ΠΌ элСмСнтом этого Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΡΠ²Π»ΡΡŽΡ‚ΡΡ увСдомлСния DLL ΠΎ присоСдинСнии/отсоСдинСнии ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ процСссов ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ DllMain (Π³Π»Π°Π²Π° 5). 

ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρ‹ процСссов ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ выполнСния

Π―Π΄Ρ€ΠΎ Windows всСгда запускаСт Ρ‚ΠΎΡ‚ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ. ΠŸΠΎΡ‚ΠΎΠΊ Π½Π΅ являСтся Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ, Ссли ΠΎΠ½ находится Π² состоянии оТидания, приостановлСн ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠΎ Ρ‚ΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅.

ΠŸΠΎΡ‚ΠΎΠΊΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρ‹ Π½Π° Π±Π°Π·Π΅ классов ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° своих процСссов. Как ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»ΠΎΡΡŒ Π² Π³Π»Π°Π²Π΅ Π±, ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ CreateProcess ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ класса ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ (base priority):

β€’ IDLE_PRIORITY_CLASS, Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ 4.

β€’ NORMAL_PRIORITY_CLASS, Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ 9 ΠΈΠ»ΠΈ 7.

β€’ HIGH_PRIORITY_CLASS, Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ 13.

β€’ REALTIME_PRIORITY_CLASS, Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ 24.

Оба ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… класса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ€Π΅Π΄ΠΊΠΎ, ΠΈ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ (normal) классом. Windows NT (всС вСрсии) Π½Π΅ являСтся ОБ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (real-time), Ρ‡Π΅Π³ΠΎ нСльзя ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎ Windows Π‘Π•, ΠΈ Π² случаях, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Ρ… послСднСму, классом REALTIME_PRIORITY_CLASS слСдуСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ с ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ вытСснСния Π΄Ρ€ΡƒΠ³ΠΈΡ… процСссов. ΠΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ 9, Ссли фокус Π²Π²ΠΎΠ΄Π° с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ находится Π² ΠΎΠΊΠ½Π΅; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС этот ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ 7.

Один процСсс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ свой собствСнный ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ процСсса, Ссли это Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ Π·Π°Ρ‰ΠΈΡ‚Ρ‹. 

BOOL SetPriorityClass(HANDLE hProcess, DWORD dwPriority)

DWORD GetPriorityClass(HANDLE hProcess)

ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° процСсса, ΠΈ Π²ΠΎ врСмя создания ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ устанавливаСтся Ρ€Π°Π²Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρƒ процСсса. ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ значСния Π² ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π΅ Β±2 ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° процСсса. Π Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ пяти значСниям ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° присвоСны ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ символичСскиС ΠΈΠΌΠ΅Π½Π°:

β€’ THREAD_PRIORITY_LOWEST

β€’ THREAD_PRIORITY_BELOW_NORMAL

β€’ THREAD_PRIORITY_NORMAL

β€’ THREAD_PRIORITY_HIGHEST