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

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

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

Β cout << "evaluation time: " << (double)t / 1.E9

Β  << " sec." << endl;

Β return EXIT_SUCCESS;

}

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

delay(WRITE_DELAY)
ΠΈ
delay(READ_DELAY)
.

Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ СстСствСнноС ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ запросы ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ Π² ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ ( Ρ„Π°ΠΉΠ» sy11.cc). Для этого ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ структуру списка элСмСнтов, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ:

class dbase : public list<element> {

Β static const int READ_DELAY = 1, WRITE_DELAY = 2;

Β pthread_mutex_t loc;

public:

Β dbase(void) { pthread_mutex_init(&loc, NULL); }

Β ~dbase(void) { pthread_mutex_destroy(&loc); }

Β void add(const elements e) {

Β  pthread_mutex_lock(&loc);

Β  int pos = size() * rand() / RAND_MAX;

Β  list<element>::iterator p = begin();

Β  for (int i = 0; i < pos; i++) p++;

Β  insert(p, e);

Β  delay(WRITE_DELAY);

Β  pthread_mutex_unlock(&loc);

Β }

Β int pos(const elements e) {

Β  int n = 0;

Β  pthread_mutex_lock(&loc);

Β  for (list<element>::iterator i = begin(); i != end(); i++, n++)

Β Β  if (*i == e) {

Β Β Β  delay(READ_DELAY);

Β Β Β  break;

Β Β  }

Β  pthread_mutex_unlock(&loc);

Β  if (n == size()) n = -1;

Β  return n;

Β }

} data;

А Π² Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ†ΠΈΠΊΠ» запросов ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ Π²:

pthread_t *h = new pthread_t[n];

uint64_t t = ClockCycles();

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

Β element e = erand(n);

Β pthread_create(h + i, NULL, wrand(p) ? add : pos, (void*)e);

}

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

Β pthread_join(h[i], NULL);

t = ((ClockCycles() - t) * 1000000000) / cps;

delete h;

А ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ этим Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΊΠ°ΠΊ:

static void* add(void* par) { data.add((element)par); }

static void* pos(void* par) { data.pos((element)par); }

Π‘ΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ СстСствСнно, Ρ‡Ρ‚ΠΎ список элСмСнтов, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ (ΠΈ ΠΊΡƒΠ΄Π° ΠΈΠ·Ρ€Π΅Π΄ΠΊΠ° ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π½ΠΎΠ²Ρ‹Π΅), Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Ρ‰ΠΈΡ‰Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€ΠΈ считывании (Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ ΠΈΡ… ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ «со стороны»). ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π² прСдставлСнном Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΠΌΡ‹ чСрСсчур ΠΏΠ΅Ρ€Π΅ΡΡ‚Ρ€Π°Ρ…ΠΎΠ²Π°Π»ΠΈΡΡŒ: Π²ΠΎ врСмя считывания ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Ρ‰ΠΈΡ‰Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Π½ΠΎ Π½Π΅Ρ‚ нСобходимости Π·Π°Ρ‰ΠΈΡ‰Π°Ρ‚ΡŒ структуру Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ считывания. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ структуру Π΄Π°Π½Π½Ρ‹Ρ… ( Ρ„Π°ΠΉΠ» sy12.cc), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ чтСния/записи, оставив всС ΠΏΡ€ΠΎΡ‡Π΅Π΅ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ:

class dbase : public list<element> {

Β static const int READ_DELAY = 1, WRITE_DELAY = 2;

Β pthread_rwlock_t loc;

public:

Β dbase(void) { pthread_rwlock_init(&loc, NULL); }

Β ~dbase(void) { pthread_rwlock_destroy(&loc); }

Β void add(const elements e) {

Β  pthread_rwlock_wrlock(&loc);

Β  int pos = size() * rand() / RAND_MAX;

Β  list<element>::iterator p = begin();

Β  for (int i = 0; i < pos; i++) p++;

Β  insert(p, e);

Β  delay(WRITE_DELAY);

Β  pthread_rwlock_unlock(&loc);

Β }

Β int pos(const elements e) {

Β  int n = 0;

Β  pthread_rwlock_rdlock(&loc);

Β  for (list<element>::iterator i = begin(); i != end(); i++, n++)

Β Β  if (*i == e) {

Β Β Β  delay(READ_DELAY);

Β Β Β  break;

Β Β  }

Β  pthread_rwlock_unlock(&loc);

Β  if (n == size()) n = -1;

Β  return n;

Β }

} data;

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈΡˆΠ»ΠΎ врСмя ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹:

# nice -n-19 sy10 500 .2

evaluation time: 1.2296 sec.

# nice -n-19 sy11 500 .2

evaluation time: 1.24973 sec.

# nice -n-19 sy12 500 .2

evaluation time: 0.440904 sec.

ΠŸΡ€ΠΈ «ТСсткой» Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ΅ ΠΌΡ‹ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ° Π·Π° счСт ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ выполнСния запросов ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ, Π° ΠΏΡ€ΠΈ использовании Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния/записи β€” 3-ΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ. ΠŸΡ€ΠΎΠ΄Π΅Π»Π°Π΅ΠΌ Ρ‚ΠΎ ΠΆΠ΅ самоС, Π½ΠΎ Π² условиях Π³ΠΎΡ€Π°Π·Π΄ΠΎ мСньшСй интСнсивности обновлСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° запросов:

# nice -n-19 sy10 500 .02