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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QNX/UNIX: Анатомия ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 42

Автор ОлСг Π¦ΠΈΠ»ΡŽΡ€ΠΈΠΊ

β€’ Π£ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° всСгда Π΅ΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ-Π²Π»Π°Π΄Π΅Π»Π΅Ρ†, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² дальнСйшСм. ИмСнно поэтому ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для синхронизации ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ синхронизации Π² смыслС разграничСния Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ доступа ΠΊ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρƒ ΠΊΠΎΠ΄Π° β€” ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ часто Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ критичСской сСкциСй ΠΊΠΎΠ΄Π°. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ сСмафора Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ΡˆΠ΅: ΠΏΡ€ΠΈ возмоТности (ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда) Π΅Π³ΠΎ примСнСния Π² Ρ‚ΠΎΠΌ контСкстС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ это Π΄Π΅Π»Π°Ρ‚ΡŒ?), ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΈ для синхронизации ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² смыслС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΡ… взаимодСйствия Π² качСствС элСмСнта, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ порядком выполнСния. ПокаТСм это Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. Для этого Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ трансформируСм ΠΊΠΎΠ΄ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ тСста для сСмафора (Ρ„Π°ΠΉΠ» sy21.cc):

Бинхронизация ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² сСмафорами

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <inttypes.h>

#include <iostream.h>

#include <unistd.h>

#include <pthread.h>

#include <errno.h>

#include <semaphore.h>


unsigned long N = 1000;

unsigned int T = 2;

static sem_t* sem;

static bool debug = false;

static char* str; // строка диагностики

static volatile int ind = 0;

uint64_t *t;


void* threadfunc(void* data) {

 unsigned long i = 0;

 char tid[8];

 sprintf(tid, "%X", pthread_self());

 // врСмСнная ΠΌΠ΅Ρ‚ΠΊΠ° Π½Π°Ρ‡Π°Π»Π° Π²ΠΎ всСх ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ… устанавливаСтся

 // Π½Π° врСмя достиТСния этой Ρ‚ΠΎΡ‡ΠΊΠΈ Π² послСднСм (Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ) ΠΏΠΎΡ‚ΠΎΠΊΠ΅

 if ((int)data == T - 1) {

  uint64_t с = ClockCycles();

  for (int i = 0; i < T; i++ ) t[i] = c;

 }

 // Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ Ρ†ΠΈΠΊΠ» ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π·Π° счСт синхронизации

 while (i++ < N) {

  sem_wait(sem + (int)data);

  if (debug) str[ind++] = *tid;

  sem_post(sem + ((int)data +1) % T);

 }

 t[(int)data] = ClockCycles() - t[(int)data];

 return NULL;

}


int main(int argc, char *argv[]) {

 int opt, val;

 while ((opt = getopt(argc, argv, "n:t:v")) != -1) {

  switch(opt) {

  case 'n':

   if (sscanf(optarg, "%i", &val) != 1)

    cout << "parse command line error" << endl, exit(EXIT_FAILURE);

   if (val > 0) N β€” val;

   break;

  case 't':

   if (sscanf(optarg, "%i", &val) != 1)

    cout << "parse command line error" << endl, exit(EXIT_FAILURE);

   if (val > 0) T = val;

   break;

  case 'v':

   debug = true;

   break;

  default:

   exit(EXIT_FAILURE);

  }

 }

 if (debug) str = new char[T * N + 1];

 pthread_t* tid = new pthread_t[T];

 sem = new sem_t[T];

 t = new uint64_t[T];

 for (int i = 0; i < T; i++) {

  // всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΊΡ€ΠΎΠΌΠ΅ послСднСго, Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Ρ‹

  // Π½Π° своих сСмафорах сразу ΠΆΠ΅ послС старта

  if (sem_init(sem + i, 0, (i == (T - 1)) ? 1 : 0))

   perror("semaphore init"), exit(EXIT_FAILURE);

  if (pthread_create(tid + i, NULL, threadfunc, (void*)i ! = EOK)

   perror( "thread create error"), exit(EXIT_FAILURE);

 }

 for (int i=0; i < T; i++)

  pthread_join(tid[i], NULL);

 for (int i = 0; i < T; i++) sem_destroy(sem + i);

 delete [] sem;

 for (int i = 0; i < T; i++)

  cout << tid[i] << "\t: cycles - " << t[i] << ";\ton semaphore - " <<

   t[i] / T / N << endl;

 delete [] tid;

 delete [] t;

 if (debug) {

  str[ind] = "\0"; cout << str << endl;

  delete [] str;

 }

 exit(EXIT_SUCCESS);

}

ЛогичСски ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ измСнилось ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

β€’ Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ 2 ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Ρ… (симмСтричных) ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ ΠΈΡ… количСство (ΠΊΠ»ΡŽΡ‡ -t ΠΏΡ€ΠΈ запускС прилоТСния).

β€’ ΠŸΠΎΡ‚ΠΎΠΊΠΈ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π΅ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ сСмафорС β€” Π²Π²Π΅Π΄Π΅Π½ массив сСмафоров ΠΏΠΎ числу ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²: ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ блокируСтся Π½Π° «своСм» сСмафорС, Π½ΠΎ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ (послС ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ выполнСния своСго Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°) сСмафор Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ «сосСда».

β€’ Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ Π½Π΅Ρ‚ Π½ΡƒΠΆΠ΄Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°Ρ€ΡŒΠ΅Ρ€ для ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ старта всСх созданных ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²: сСмафоры всСх создаваСмых ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ; ΡΡ‚Π°Ρ€Ρ‚ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Ρ‚ΡƒΡ‚ ΠΆΠ΅ блокируСтся Π½Π° своСм сСмафорС, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послСдний ΠΈΠ· Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… выполняСтся, Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡΡΡŒ Π½Π° сСмафорС.

β€’ Π˜Π· ΠΊΠΎΠ΄Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊΠ°ΠΊΠΈΠ΅ Π±Ρ‹ Ρ‚ΠΎ Π½ΠΈ Π±Ρ‹Π»ΠΎ срСдства ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ управлСния (sched_yield()) β€” всС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ вСтвлСния осущСствляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ состояниями сСмафоров.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ. ЗапускаСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с диагностичСским Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (ΠΊΠ»ΡŽΡ‡ -v; ΠΎΠ½ Ρƒ нас Π±Ρ‹Π» Π² тСстах ΠΈ Ρ€Π°Π½Π΅Π΅, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ ΠΎ Π½Π΅ΠΌ Π½Π΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ):

# nice -n-19 sy21 -n20 -t12 -v

2      : cycles - 664874; on semaphore - 2770

3      : cycles - 649150; on semaphore - 2704

4      : cycles - 638906, on semaphore - 2662

5      : cycles - 622987; on semaphore - 2595

6      : cycles - 611781; on semaphore - 2549

7      : cycles - 594515; on semaphore - 2477

8      : cycles - 571003; on semaphore - 2379

9      : cycles - 552834; on semaphore - 2303

10     : cycles - 536817; on semaphore - 2236

11     : cycles - 519357; on semaphore - 2163

12     : cycles - 500388; on semaphore - 2084

13     : cycles - 296633; on semaphore - 1235

D23456789ABCD23456789ABCD23456789ABCD23456789ABCD23456789ABCD23456789ABCD23456789ABCD23456789ABCD23456789ABCD23456789ABCD23456789ABCD23456789ABCD23456789ABCD23456789ABCD23456789ABCD23456789ABCD23456789ABCD23456789ABCD23456789ABCD23456789ABC

Π’ строкС диагностики (Π²Π½ΠΈΠ·Ρƒ) Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π²ΠΈΠ΄Π½ΠΎ рСгулярноС Ρ‡Π΅Ρ€Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΎΠ½ΠΎ начинаСтся с индСкса послСднСго созданного ΠΏΠΎΡ‚ΠΎΠΊΠ° (13 Π² ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅). Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Π΅ΠΌ Ρ‚ΠΎ ΠΆΠ΅ самоС, Π½ΠΎ Π½Π° большой Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅ ΠΈ с ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ диагностикой, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ «чистоС» врСмя контСкстных ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π½Π΅ искаТСнноС Π·Π°Ρ‚Ρ€Π°Ρ‚Π°ΠΌΠΈ Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ формирования диагностики (Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… размСрностСй Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π·Π½ΠΎΠΌ количСствС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²):

# nice -n-19 sy21 -n100000 -t12

2      : cycles - 1509597589; on semaphore - 1257

3      : cycles - 1509581545; on semaphore - 1257

4      : cycles - 1509570283; on semaphore - 1257

5      : cycles - 1509552472; on semaphore - 1257

6      : cycles - 1509537934; on semaphore - 1257

7      : cycles - 1509519299; on semaphore - 1257

8      : cycles - 1509502312; on semaphore - 1257

9      : cycles - 1509482667; on semaphore - 1257

10     : cycles - 1509466343; on semaphore - 1257

11     : cycles - 1509449264; on semaphore - 1257

12     : cycles - 1509431112; on semaphore - 1257

13     : cycles - 1509222808, on semaphore - 1257


# nice -n-19 sy21 -n100000 -t7

2      : cycles - 859768389; on semaphore - 1228

3      : cycles - 859756956; on semaphore - 1228

4      : cycles - 859745649; on semaphore - 1228

5      : cycles - 859736698; on semaphore - 1228

6      : cycles - 859724685; on semaphore - 1228

7      : cycles - 859707720; on semaphore - 1228

8      : cycles - 859554045; on semaphore β€” 1227


# nice -n-19 sy21 -n50000 -t13

2      : cycles - 832789852; on semaphore - 1281

3      : cycles - 832813231; on semaphore - 1281

4      : cycles - 832835011; on semaphore - 1281

5      : cycles - 832851360; on semaphore - 1281

6      : cycles - 832868482; on semaphore - 1281

7      : cycles - 832884308; on semaphore - 1281

8      : cycles - 832900935; on semaphore - 1281

9      : cycles - 832916093; on semaphore - 1281

10     : cycles - 832931944; on semaphore - 1281

11     : cycles - 832946479; on semaphore - 1281

12     : cycles - 832962202; on semaphore - 1281

13     : cycles - 832976433; on semaphore - 1281

14     : cycles - 832782465; on semaphore - 1281


# nice -n-19 sy21 -n50000 -t17

2      : cycles - 1142879872; on semaphore - 1344

3      : cycles - 1142906138; on semaphore - 1344

4      : cycles - 1142927650; on semaphore - 1344

5      : cycles - 1142943675; on semaphore - 1344

6      : cycles - 1142959582; on semaphore - 1344

7      : cycles - 1142974919; on semaphore - 1344

8      : cycles - 1142991068; on semaphore - 1344

9      : cycles - 1143005896; on semaphore - 1344

10     : cycles - 1143021518, on semaphore - 1344

11     : cycles - 1143036136; on semaphore - 1344

12     : cycles - 1143053448; on semaphore - 1344

13     : cycles - 1143068415; on semaphore - 1344

14     : cycles - 1143083676; on semaphore - 1344

15     : cycles - 1143098361; on semaphore - 1344

16     : cycles - 1143114009; on semaphore - 1344

17     : cycles - 1143128525; on semaphore - 1344

18     : cycles - 1142872665; on semaphore - 1344

Π•ΡΡ‚ΡŒ нСкоторая коррСляция Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ контСкста с Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ ΠΈ количСством ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π½ΠΎ ΠΎΠ½Π° Π² ΡˆΠΈΡ€ΠΎΠΊΠΎΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ этих ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ 8%. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ эта числСнная Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя: Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° сСмафорС, ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π° контСкст Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСмафора. Если Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π½ΡŒΡˆΠ΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π»ΠΈ ΠΎΡ†Π΅Π½ΠΊΠΈ для ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ (посрСдством sched_yield()) ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ контСкста ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² 375 процСссорных Ρ†ΠΈΠΊΠ»ΠΎΠ², Π° для Π·Π°Ρ…Π²Π°Ρ‚Π°-освобоТдСния сСмафора β€” порядка 870, Ρ‚ΠΎ эти Ρ†ΠΈΡ„Ρ€Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΡΠΎΠ³Π»Π°ΡΡƒΡŽΡ‚ΡΡ с ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ сСйчас Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ.

РассматриваСмыС ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ слуТат ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ цСлям. ΠœΡŒΡŽΡ‚Π΅ΠΊΡ, ΠΊΠ°ΠΊ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ сказано Ρ€Π°Π½Π΅Π΅, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ для Ρ€Π΅Π³Π»Π°ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ доступа ΠΊ участкам ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€Ρ‹ ΠΆΠ΅ большС ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для Ρ€Π΅Π³Π»Π°ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ порядка доступа ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…. ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠΌΠΈ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ этого класса ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π·Π°Π΄Π°Ρ‡ΠΈ Β«ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ-ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒΒ», ΠΊΠΎΠ³Π΄Π° M ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… (читая эти Π΄Π°Π½Π½Ρ‹Π΅ с Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π²Π½Π΅ΡˆΠ½ΠΈΡ… устройств, ΠΈΠ»ΠΈ создавая ΠΈΡ… ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… вычислСний, ΠΈΠ»ΠΈ Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ способом), Π° N ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΉ нСзависимо Π±Π΅Ρ€ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ.