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

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

Автор Π¦ΠΈΠ»ΡŽΡ€ΠΈΠΊ ОлСг Π˜Π²Π°Π½ΠΎΠ²ΠΈΡ‡

Если ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π· вытСсняСтся Π² ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ своСй Ρ€Π°Π±ΠΎΡ‚Ρ‹ с основным ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ, Ρ‚ΠΎ Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ ΠΊΠΎΠ»Π΅Π±Π°Π½ΠΈΠ΅ с высокой частотой ΠΌΠ΅ΠΆΠ΄Ρƒ основным ΠΈ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°ΠΌΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² QNX 6.2.1 Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… для спорадичСской диспСтчСризации ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ (ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ) максимальноС количСство ΠΏΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ Π±ΡŽΠ΄ΠΆΠ΅Ρ‚Π° Π·Π° ΠΏΠ΅Ρ€ΠΈΠΎΠ΄.

Как ΡƒΠΆΠ΅ ΠΎΠΏΠΈΡΡ‹Π²Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, структура

shed_param
содСрТит Π² своСм составС, Π² частности, Π΅Ρ‰Π΅ ΠΈ структуру ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² для спорадичСской диспСтчСризации (ΠΏΡ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠ°Ρ… диспСтчСризации эта Ρ‡Π°ΡΡ‚ΡŒ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ):

struct {

Β _INT32 __ss_low_priority;

Β _INT32 __ss_max_repl;

Β struct timespec __ss_repl_period;

Β struct timespec __ss_init_budget;

} __ss;

Π³Π΄Π΅

low_priority
β€” Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚;
max_repl
β€” максимальноС количСство ΠΏΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ Π±ΡŽΠ΄ΠΆΠ΅Ρ‚Π° Π·Π° ΠΏΠ΅Ρ€ΠΈΠΎΠ΄;
repl_period
β€” ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ пополнСния Π±ΡŽΠ΄ΠΆΠ΅Ρ‚Π° ΠΈ
init_budget
Β β€” Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Π±ΡŽΠ΄ΠΆΠ΅Ρ‚.

БообраТСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ «симмСтричный» тСст Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ это дСлалось для ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ контСкстов процСссов (стр. 44), Π½ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ ( Ρ„Π°ΠΉΠ» p5t.cc). ΠŸΡ€ΠΈ этом ΠΌΡ‹ постараСмся максимально ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ функционирования, имСвшиС мСсто Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Β«Π—Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ процСссов» ( Ρ„Π°ΠΉΠ» p5.сс) (СстСствСнно, ΠΈΠ·-Π·Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ различия ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² тСксты ΠΊΠΎΠ΄ΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‚ сущСствСнно ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ).

Π—Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

#include <stdlib.h>

#include <stdio.h>

#include <inttypes.h>

#include <iostream.h>

#include <unistd.h>

#include <pthread.h>

#include <errno.h>

#include <sys/neutrino.h>

unsigned long N = 1000;

// потоковая функция:

void* threadfunc(void* data) {

Β uint64_t t = ClockCycles();

Β for (unsigned long i = 0; i < N; i++) sched_yield();

Β t = ClockCycles() - t;

Β // Π΄Π°Ρ‚ΡŒ спокойно Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ 2-ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° Π²Ρ‹Π²ΠΎΠ΄Π°

Β delay(100);

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

Β  << ", on sched - " << (t / N) / 2 << endl;

Β  return NULL;

}

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

Β int opt, val;

Β while ((opt = getopt(argc, argv, "n:")) != -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;

Β Β default:

Β Β  exit(EXIT_FAILURE);

Β  }

Β }

Β const int T = 2;

Β pthread_t tid[T];

Β // ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ

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

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

Β Β  cout << "thread create error", exit(EXIT_FAILURE);

Β // ΠΈ Π΄ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒΡΡ ΠΈΡ… Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ...

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

Β  pthread_join(tid[i], NULL);

Β exit(EXIT_SUCCESS);

}

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

# nice -n-19 p5t -n100

2Β Β Β Β Β Β  : cycles - 79490; on sched - 397

3Β Β Β Β Β Β  : cycles - 78350; on sched β€” 391

# nice -n-19 p5t -n1000

2Β Β Β Β Β Β  : cycles - 753269; on sched - 376

3Β Β Β Β Β Β  : cycles - 752069; on sched - 376

# nice -n-19 p5t -n10000

2Β Β Β Β Β Β  : cycles - 7494255; on sched - 374

3Β Β Β Β Β Β  : cycles - 7493225; on sched - 374

# nice -n-19 p5t -n100000

2Β Β Β Β Β Β  : cycles - 74897795; on sched - 374

3Β Β Β Β Β Β  : cycles - 74895800; on sched β€” 374

# nice -n-19 p5t -n1000000

2Β Β Β Β Β Β  : cycles - 748850811, on sched - 374

3Β Β Β Β Β Β  : cycles - 748850432; on sched - 374

Как ΠΈ Π² случаС с процСссами, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‡Π΅Π½ΡŒ высокой ΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ «объСма вычислСний» Π½Π° 4 порядка, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎ своим Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π°ΠΌ значСния для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΠΎΡ‡Ρ‚ΠΈ Π² 2 Ρ€Π°Π·Π° мСньшС, Ρ‡Π΅ΠΌ для процСссов (стр. 45).

Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°

Как ΠΈ Π² случаС ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π²ΡˆΠ΅Π³ΠΎΡΡ Ρ€Π°Π½Π΅Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса, для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡ‚Ρ‡Π΅Ρ‚Π»ΠΈΠ²ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ случаи:

‒ «СстСствСнного» Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ выполнСния ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈΠ· ΠΊΠΎΠ΄Π° самого ΠΏΠΎΡ‚ΠΎΠΊΠ°;

β€’Β Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈΠ·Π²Π½Π΅, ΠΈΠ· ΠΊΠΎΠ΄Π° Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈΠ»ΠΈ ΠΏΠΎ сигналу. Для этого дСйствия, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ «СстСствСнного» Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ β€” ΠΎΡ‚ΠΌΠ΅Π½Π°.

Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° происходит ΠΏΡ€ΠΈ достиТСнии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΏΠΎΡ‚ΠΎΠΊΠ° своСго СстСствСнного ΠΊΠΎΠ½Ρ†Π° ΠΈ выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°

return
(явно ΠΈΠ»ΠΈ нСявно) ΠΈΠ»ΠΈ выполнСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π°: