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

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

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

  pthread_mutex_unlock(&_mutex);

 }

 T pop() {

  data_event.wait();

  pthread_mutex_lock(&_mutex);

  T res = data_queue.front();

  data_queue.pop();

  pthread_mutex_unlock(&_mutex);

  return res;

 }

private:

 std::queue<T> data_queue;

 event data_event;

 pthread_mutex_t _mutex;

};

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд Π·Π°Π΄Π°Ρ‡Π° ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Π°: Π½Π°Π΄ΠΎ Π½Π΅ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ исполнСния Π΄Π²ΡƒΡ… участков ΠΊΠΎΠ΄Π°. ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΆΠ΅ Π½Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ сСмафором, ΠΊΠ°ΠΊ ΠΌΡ‹ описывали, ΠΊΠΎΠ³Π΄Π° рассказывали ΠΎ способах Π΅Π³ΠΎ примСнСния? Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ срСдство ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, Π½Π΅ зависящСС ΠΎΡ‚ Π΄ΠΎΠΏΡƒΡ‰Π΅Π½ΠΈΠΉ ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ стСпСни ΠΈΡ… зависимости. Когда ΠΌΡ‹ строим систСму Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, вопрос Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ нСявного влияния Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π° становится ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½Ρ‹ΠΌ. ΠœΡ‹ ΡƒΠΆΠ΅ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ эффСкт инвСрсии ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² ΠΈ Ρ‚Π΅ способы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π΅Π΅ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ эксклюзивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ ΠΈ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ

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

Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд эти Π΄Π²Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π² Π²Ρ‹ΡΡˆΠ΅ΠΉ стСпСни ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹, особСнно Ссли Ρ€Π΅Ρ‡ΡŒ Π·Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΎ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ сСмафорС, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅ΠΌ значСния счСтчика 0 Π»ΠΈΠ±ΠΎ 1. ΠΠ°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹, Ρ‡Ρ‚ΠΎ ΠΈ Π² обсуТдСниях, ΠΈ Π΄Π°ΠΆΠ΅ Π² Π½Π΅ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ утвСрТдСния, Ρ‡Ρ‚ΠΎ это Β«ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅Β». БСйчас ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ эти Π΄Π²Π° сходных ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ всСм: ΠΈ Π·Π°Ρ‚Ρ€Π°Ρ‚Π°ΠΌΠΈ процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° ΠΈΡ… обслуТиваниС, ΠΈ цСлями ΠΈ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠ·Π²Π°Π½Ρ‹ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ, ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Тизни… НачнСм с простой ΠΎΡ†Π΅Π½ΠΊΠΈ Π·Π°Ρ‚Ρ€Π°Ρ‚ процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° обслуТиваниС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ², послС Ρ‡Π΅Π³ΠΎ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ различия станут Π½Π°ΠΌ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ понятнСС.

Для провСдСния Ρ‚Π°ΠΊΠΈΡ… ΠΎΡ†Π΅Π½ΠΎΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ²ΡˆΡƒΡŽΡΡ Π½Π°ΠΌΠΈ схСму «симмСтричных» тСстов. ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΡ…? Π”Π°, здСсь Π½Π°ΠΌ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Π² явном Π²ΠΈΠ΄Π΅ ΠΎΠ±ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ «симмСтричными» тСстами просто Π² силу ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»ΠΎΠΊ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ написано Ρ€Π°Π½Π΅Π΅. Π˜Ρ‚Π°ΠΊ, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ тСста для ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° (Ρ„Π°ΠΉΠ» sy20m.cc):

БкоростныС ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°

unsigned long N = 1000;

static pthread_barrier_t bstart;

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

static bool debug = false;

static char* str;

static volatile int ind = 0;


void* threadfunc(void* data) {

 pthread_barrier_wait(&bstart);

 unsigned long i = 0;

 char tid[8];

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

 uint64_t t = 0, t1;

 while (i++ != N) {

  t1 = ClockCycles();

  pthread_mutex_lock(&mutex);

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

  pthread_mutex_unlock(&mutex);

  t += ClockCycles() - t1;

  sched_yield();

 }

 cout << pthread_self() << "\t: cycles - "

  << t << ", on mutex - " << t / N << endl;

 return NULL;

}


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

 int opt, val;

 while ((opt = getopt(argc, argv, "n,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 'v':

   debug = true;

   break;

  default:

   exit(EXIT_FAILURE);

  }

 }

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

 const int T = 2;

 pthread_t tid[T];

 if (pthread_barrier_init(&bstart, NULL, T) != EOK)

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

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

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

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

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

  pthread_join(tid[i], NULL);

 if (debug) {

  str[ind] = '\0';

  cout << str << endl;

  delete [] str;

 }

 exit(EXIT_SUCCESS);

}

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ выполнСния этого тСста:

# sy20m -n100000

3       : cycles - 14644442, on mutex - 146

2       : cycles - 14614219; on mutex - 146

# sy20m -n1000000

3       : cycles - 146505047; on mutex - 146

2       : cycles - 146388673; on mutex - 146

ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ вмСсто ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ сСмафор. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π·Π°Π³Ρ€ΠΎΠΌΠΎΠΆΠ΄Π°Ρ‚ΡŒ тСкст практичСски Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΊΠΎΠ΄ΠΎΠΌ, пСрСчислим Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΈ этом измСнСния (Ρ„Π°ΠΉΠ» sy20s.cc):

1. Π’мСсто ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° объявляСм Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ сСмафор, Π° статичСская инициализация ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° замСняСтся Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ (Π² Ρ‚Π΅Π»Π΅ Π³Π»Π°Π²Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹) динамичСской ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сСмафора с присвоСниСм Π΅ΠΌΡƒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния 1:

static sem_t sem;

...

if (sem_init(&sem, 0, 1) != 0)

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

2. Π€ΡƒΠ½ΠΊΡ†ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π²ΠΈΠ΄:

void* threadfunc(void* data) {

 ...

 while (i++ != N) {

  t1 = ClockCycles();

  sem_wait(&sem);

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

  sem_post(&sem);

  t += ClockCycles() - t1;

  sched_yield();

 }

 ...

}

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ исполнСния Π½Π° этот Ρ€Π°Π· ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ:

# sy20s -n100000

3       : cycles - 87048886; on semaphore - 870

2       : cycles - 87077787; on semaphore - 870

# sy20s -n1000000

3       : cycles - 869638168; on semaphore β€” 869

2       : cycles - 868725494, on semaphore - 868

Π”Π΅Π»Π°Π΅ΠΌ послСднюю ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ Π² этой Π³Ρ€ΡƒΠΏΠΏΠ΅ тСстов, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ спСцифику ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ сСмафора (Ρ„Π°ΠΉΠ» sy20n.cc):

1. ВмСсто ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° динамичСской ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ сСмафора ΠΌΡ‹ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ сСмафор:

static sem_t* sem;

...

const char semname[] = "/duble";

if ((sem = sem_open(semname, O_CREAT, S_IRWX0, 1)) == SEM_FAILED)

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

ПослСдний ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ заслуТиваСт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ коммСнтария. ВСхничСская докумСнтация ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ функция sem_open(), Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π°Ρ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ созданного дСскриптора сСмафора Ρ‚ΠΈΠΏΠ° sem_t, Π² случаС ошибки Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ -1 (Ρ‚Π°ΠΊ Π±Ρ‹Π»ΠΎ записано ΠΈ Π² самых Ρ€Π°Π½Π½ΠΈΡ… рСдакциях POSIX). Но использованиС конструкции Π²ΠΈΠ΄Π°:

if (sem_open( ... ) == -1)

просто Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΡΠΈΠ½Ρ‚Π°ΠΊΡΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ (нСсоотвСтствиС Ρ‚ΠΈΠΏΠΎΠ²) ΠΈ Π½Π΅ ΠΏΡ€ΠΎΠΉΠ΄Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ! ЕстСствСннСС Π±Ρ‹Π»ΠΎ Π±Ρ‹ для Ρ‚Π°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ NULL Π² случаС ошибки, Π½ΠΎ... Ρ‚Π°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π² POSIX. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… рСализациях UNIX опрСдСляСтся константа:

#define SEM_FAILED ((sem_t*)(-1))

Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ QNX ΠΎΠ½Π° Π½ΠΈΠ³Π΄Π΅ Π½Π΅ упоминаСтся, Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, ΠΎΠ½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, ΠΈ всС прСкрасно Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚!

2. Π€ΡƒΠ½ΠΊΡ†ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π²ΠΈΠ΄ (Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ sem, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ случая, вСдь Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ это ΡƒΠΆΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° sem_t):

void* threadfunc(void* data) {

 ...

 while (i++ != N) {

  t1 = ClockCycles();

  sem_wait(sem);

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

  sem_post(sem);

  t += ClockCycles() - t1;

  sched_yield();

 }

 ...

}

3. Π’Π΅ΠΏΠ΅Ρ€ΡŒ особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ созданию, Π½ΠΎ ΠΈ Π»ΠΈΠΊΠ²ΠΈΠ΄Π°Ρ†ΠΈΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ сСмафора (Ρ‚Π°ΠΊΠΎΠΉ сСмафор ΠΈΠΌΠ΅Π΅Ρ‚ врСмя ΠΆΠΈΠ·Π½ΠΈ ядра систСмы ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ своС сущСствованиС ΠΈ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ нашСго прилоТСния):

sem_close(sem);

sem_unlink(semname);

Запустим ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ -n, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ обСспСчит достаточноС врСмя Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹. ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, посмотрим ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ сСмафора Π½Π° пространство Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… ΠΈΠΌΠ΅Π½ систСмы Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния:

# ls -l /dev/sem

total 1

n------r-Ρ… 1 root root 1 Feb 10 18.56 duble

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

# nice -n-19 sy20n -n100000

3      : cycles - 1453746002, on semaphore - 14537

2      : cycles - 1454203573, on semaphore - 14542

НаконСц, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ количСствСнному Π°Π½Π°Π»ΠΈΠ·Ρƒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Ρ†ΠΈΡ„Ρ€:

β€’ ΠŸΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ β€” ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ сСмафоры, β€” каТущиСся Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд сходными, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ для своСго обслуТивания Π² эквивалСнтных условиях ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π·Π°Ρ‚Ρ€Π°Ρ‚, Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π΄ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ: 140 – 870 β€“ 14500 процСссорных Ρ†ΠΈΠΊΠ»ΠΎΠ² соотвСтствСнно, Ρ‡Ρ‚ΠΎ соотносится ΠΊΠ°ΠΊ 1:6,2:104.

β€’ Π’Π°ΠΊ ΠΆΠ΅ Ρ€Π°Π΄ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΈ ΠΈΡ… характСристики доступа: ΠΈΠ·Π½ΡƒΡ‚Ρ€ΠΈ процСсса (ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΆΠ΅ Π²Π»Π°Π΄Π΅Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ), ΠΈΠ· внСшнСго процСсса, ΠΈΠ· процСсса, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ Π½Π° ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌ сСтСвом узлС… Π’ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠΆΠ΅ рассматривали ΠΊΠ°ΠΊ «характСристики Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈΒ» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ катСгориям: процСсса (process-persistent), ядра (kernel-persistent) ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы (filesystem-persistent).