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

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

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

 cout << ", server = " << data.cps << endl;

 tim = new uint64_t[num];

 uint64_t tim2;

 uint8_t *bufin = new uint8_t[blk];

 *bufou = new uint8_t[blk];

 // опрСдСляСм дСскриптор сСтСвого ΡƒΠ·Π»Π°

 int32_t node = netmgr_strtond(PATH, NULL);

 // это интСрСсноС мСсто: Ссли Π² ΠΈΠΌΠ΅Π½ΠΈ Π½Π΅Ρ‚ сСтСвого прСфикса ΠΏΡƒΡ‚ΠΈ,

 // Π½ΠΎ это имя удаСтся ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ, Ρ‚ΠΎ это Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ хост!

 if (node == -1 && fd > 0 && errno == ENOENT)

  node = ND_LOCAL_NODE;

 // ΠΏΠΎ адрСсным Π΄Π°Π½Π½Ρ‹ΠΌ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ Ρ€Π°Π½Π΅Π΅ ΠΏΠΎ read(), создаСм ΠΊΠ°Π½Π°Π»

 // для прямого ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями с Ρ‚Π΅ΠΌ ΠΆΠ΅ процСссом:

 int coid = ConnectAttach(node, data.pid, data.chid, _NTO_SIDE_CHANNEL, 0);

 if (coid < 0) exit("connect to message channel");

 cout << " - message exchange:" << flush;

 // ΠΎΠ±ΠΌΠ΅Π½ ΠΏΠΎ ΠΊΠ°Π½Π°Π»Ρƒ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… сообщСний

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

  tim[i] = ClockCycles();

  if (MsgSend(coid, bufou, blk, bufin, blk) == -1)

   exit("exchange data with channel");

  tim[i] = ClockCycles() - tim[i];

 }

 outtim();

 ConnectDetach(coid);

 // повторяСм Π² точности Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΎΠ±ΠΌΠ΅Π½, Π½ΠΎ ΠΏΠΎ запросу devctl()

 unsigned int DCTL = (blk<<16) + DCMD_SRR;

 cout << "- manager exchange:" << flush;

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

  tim[i] = ClockCycles();

  if (devctl(fd, DCTL, bufou, blk, NULL) ! = EOK)

   exit("DEVCTL error");

  tim[i] = ClockCycles() - tim[i];

 }

 outtim();

 close(fd);

 delete [] bufin;

 delete [] bufou;

 delete [] tim;

 return EXIT_SUCCESS;

}

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ исполнСния ΠΈ ΠΎΡ†Π΅Π½ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π°Π΅Ρ‚ Π½Π°ΠΌ эта клиСнтская ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° (Π·Π½Π°ΠΊΠΎΠΌ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½ΠΎ Π‘.К.О. ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π΅ΠΌΡƒ Π² Π²Ρ‹Π²ΠΎΠ΄Π΅ значСния ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠΉ срСднСй Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹, послС Ρ‡Π΅Π³ΠΎ Π² скобках β€” ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π½ΠΎΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ этого Π‘.К.О. ΠΊ измСряСмой Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π΅):

# nice -n-19 cli -b1 -m1000

SRR client: vers. 1.03

server path: /dev/srr, block size = 1 bytes, repeat = 1000

CPU speed [c.p.s.]: client = 534639500, server = 534639500

- message exchange: 2693 ~168 {6%}

- manager exchange: 6579 ~357 {5%}

# nice -n-19 cli -b10 -m1000

SRR client: vers. 1.03

server path: /dev/srr, block size = 10 bytes, repeat = 1000

CPU speed [c.p.s.]: client = 534639500, server = 534639500

- message exchange: 2726 ~258 {9%}

- manager exchange: 6725 ~378 {6%}

# nice -n-19 cli -b100 -m1000

SRR client: vers. 1.03

server path: /dev/srr, block size = 100 bytes, repeat = 1000

CPU speed [c.p.s.]: client = 534639500, server = 534639500

- message exchange: 3351 ~190 {6%}

- manager exchange: 7055 ~414 {6%}

# nice -n-19 cli -b1000 -m1000

SRR client: vers 1.03

server path: /dev/srr, block size = 1000 bytes, repeat = 1000

CPU speed [c.p.s.]: client = 534639500, server = 534639500

- message exchange: 3912 ~369  {9%}

- manager exchange: 8312 ~4024 {48%}

# nice -n-19 cli -b4000 -m1000

SRR client: vers 1.03

server path: /dev/srr, block size = 4000 bytes, repeat = 1000

CPU speed [c.p.s.] client = 534639500, server = 534639500

- message exchange: 5393  ~518 {10%}

- manager exchange: 10666 ~770 {7%}

# nice -n-19 cli -b6000 -m1000

SRR client vers 1.03

server path /dev/srr, block size = 6000 bytes, repeat = 1000

CPU speed [c.p.s.]: client = 534639500, server = 534639500

- message exchange: 7373  ~612 {8%}

- manager exchange: 12423 ~995 {8%}

# nice -n-19 cli -b1000 -m1000

SRR client: vers. 1.03

server path /dev/srr, block size = 10000 bytes, repeat = 1000

CPU speed [c.p.s.]: client = 534639500, server = 534639500

- message exchange: 14365 ~953  {7%}

- manager exchange: 16018 ~5399 {34%}

Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π½Π°ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ:

β€’ ΠžΠ±ΠΌΠ΅Π½ с сСрвСром, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΌ Π½Π° локальном хостС, происходит синхронно: ΠΊΠ»ΠΈΠ΅Π½Ρ‚, пСрСслав запрос сСрвСру, блокируСтся Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΎΡ‚ Π½Π΅Π³ΠΎ. Π’ этих условиях ΠΌΡ‹ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ процСссор Π½Π° 100% совмСстной Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ сСрвСра.

β€’ ΠžΠ±ΠΌΠ΅Π½ Π² эквивалСнтных условиях с сСрвСром, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΌ ΠΊΠ°ΠΊ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ рСсурса, Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ (Π² сравнСнии с прямым ΠΎΠ±ΠΌΠ΅Π½ΠΎΠΌ сообщСниями) Π² 1,12–2,44 Ρ€Π°Π· большСС количСство процСссорных Ρ†ΠΈΠΊΠ»ΠΎΠ² Π½Π° своС обслуТиваниС, ΠΈΠ»ΠΈ, Π² ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΅Π΄ΠΈΠ½ΠΈΡ†Π°Ρ…, максимально достиТимая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° мСньшС Π½Π° 12–144% .

β€’ Π‘Π°ΠΌΡ‹Π΅ нСблагоприятныС (144%) значСния относятся ΠΊ ΡΠ»ΡƒΡ‡Π°ΡŽ ΠΎΠ±ΠΌΠ΅Π½Π° ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΌΠΈ сообщСниями (1–10 Π±Π°ΠΉΡ‚); достаточно ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΠΎΠ΅ (~2) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ сохраняСтся Π΄ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, Ρ€Π°Π²Π½Ρ‹Ρ… 8–10 ΠšΠ±Π°ΠΉΡ‚.

β€’ ΠΠ°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ нСдопустимо Π²Π΅Π»ΠΈΠΊΠΈ (2693 Ρ†ΠΈΠΊΠ»ΠΎΠ² Π½Π° Π±Π°ΠΉΡ‚ ΠΏΡ€ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π΅ сообщСниями ΠΈ 6579 Ρ†ΠΈΠΊΠ»ΠΎΠ² Π½Π° Π±Π°ΠΉΡ‚ β€” для ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°) ΠΏΡ€ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΌΠΈ сообщСниями. Π‘ ростом объСма Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ†ΠΈΠΊΠ» ΠΎΠ±ΠΌΠ΅Π½Π°, этот ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΎΡ‡Π΅Π½ΡŒ Ρ€Π΅Π·ΠΊΠΎ ΠΏΠ°Π΄Π°Π΅Ρ‚ (Π½Π° Π±Π»ΠΎΠΊΠ°Ρ… ΠΏΠΎ 100 Π±Π°ΠΉΡ‚ ΡƒΠΆΠ΅ 33,5 ΠΈ 70 соотвСтствСнно, Ρ‚.Π΅. 2 порядка). Для систСм с интСнсивными ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΡ‚Ρ€Π΅ΠΌΠΈΡ‚ΡŒΡΡ максимально Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ число Π°ΠΊΡ‚ΠΎΠ² ΠΎΠ±ΠΌΠ΅Π½Π°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Ρ‚ΠΎ ΠΆΠ΅ самоС, Π½ΠΎ ΠΏΡ€ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π΅ с сСрвСром, Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ хостС сСти (ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π½ΠΈΠ·ΠΊΠΎΡΠΊΠΎΡ€ΠΎΡΡ‚Π½ΡƒΡŽ ΡΠ΅Ρ‚ΡŒ 10 ΠœΠ±ΠΈΡ‚/сСк, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ всС эффСкты Π±ΠΎΠ»Π΅Π΅ наглядны):

# nice -n-19 cli -nrtp -b1 -m500

SRR client: vers. 1.03

server path: /net/rtp/dev/srr, block size = 1 bytes, repeat = 500

CPU speed [c.p.s.]: client = 534639500, server = 451163200

- message exchange: 671017 ~391587 {58%}

- manager exchange: 712181 ~394844 {55%}

# nice -n-19 cli -nrtp -b10 -m500

SRR client: vers. 1.03

server path: /net/rtp/dev/srr, block size = 10 bytes, repeat = 500

CPU speed [c.p.s.]: client = 534639500, server = 451163200

- message exchange: 642456 ~380313 {59%}

- manager exchange: 743094 ~423717 {57%}

# nice -n-19 cli -nrtp -b100 -m500

SRR client: vers. 1.03

server path: /net/rtp/dev/srr, block size = 100 bytes, repeat = 500

CPU speed [c.p.s.]: client = 534639500, server = 451163200

- message exchange: 878686 ~432230 {49%}

- manager exchange: 907474 ~420140 {46%}

# nice -n-19 cli -nrtp -b1000 -m500

SRR client: vers. 1.03

server path: /net/rtp/dev/srr, block size = 1000 bytes, repeat = 500

CPU speed [c.p.s.]: client = 534639500, server = 451163200

- message exchange: 2064542 ~358333 {17%}

- manager exchange: 2113638 ~372487 {18%}

# nice -n-19 cli -nrtp -b3000 -m200

SRR client: vers. 1.03

server path: /net/rtp/dev/srr, block size = 3000 bytes, repeat = 200

CPU speed [c.p.s.]: client = 534639500, server = 451163200

- message exchange: 4134249 ~418168 {10%}

- manager exchange: 4181481 ~418139 {10%}

# nice -n-19 cli -nrtp -b5000 -m200

SRR client: vers. 1.03

server path: /net/rtp/dev/srr, block size = 5000 bytes, repeat = 200

CPU speed [c.p.s.]: client = 534639500, server = 451163200

- message exchange: 5805056 ~252663 {4%}

- manager exchange: 5825837 ~229120 {4%}

# nice -n-19 cli -nrtp -b8000 -m200

SRR client: vers. 1.03

server path /net/rtp/dev/srr, block size = 8000 bytes, repeat = 200

CPU speed [c.p.s.]: client = 534639500, server = 451163200

- message exchange: 8741090 ~446299 {5%}

- manager exchange: 8788642 ~427459 {5%}

# nice -n-19 cli -nrtp -b10000 -m200

SRR client: vers. 1.03

server path: /net/rtp/dev/srr, block size = 10000 bytes, repeat = 200

CPU speed [c.p.s.]: client = 534639500, server = 451163200

- message exchange: 8971296 ~451857 {5%}

- manager exchange: 9731224 ~301409 {3%}

Π’ этом Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ основной ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ вносится ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ физичСскому ΠΊΠ°Π½Π°Π»Ρƒ; Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ рСализациями ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями ΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° рСсурсов Π² Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ стСпСни Π½ΠΈΠ²Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½Π°.

Наш Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ (Ρ„Π°ΠΉΠ» clr.cc), Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ с Ρ‚Π΅ΠΌ ΠΆΠ΅ сСрвСром, вСсьма ΠΏΠΎΡ…ΠΎΠΆ Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ, Π½ΠΎ ΠΎΠ½ массированно Β«Π³ΠΎΠ½ΠΈΡ‚Β» ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° сСрвСр, ΠΏΠΎΠ»ΡŒΠ·ΡƒΡΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² (ΠΊΠ»ΡŽΡ‡ -d) Π΄ΠΎ прСкращСния Π΅Π³ΠΎ выполнСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΏΠΎ ^C. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ β€” срСдняя ΠΏΠ»ΠΎΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π·Π° вСсь ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» Ρ€Π°Π±ΠΎΡ‚Ρ‹.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ клиСнтский процСсс

#include "common.h"


static bool conti = true;

// Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ процСсса ΠΏΠΎ сигналу ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (SIGINT - ^C)

inline static void trap(int signo) { conti = false; }


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

 cout << "SRR repeater: " << VERSION << endl;

 int opt, val;

 unsigned int blk = 100;

 char PATH[_POSIX_PATH_MAX] = "";

 bool lowlvl = true;

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

  switch(opt) {

  case 'n': // имя сСтСвого ΡƒΠ·Π»Π°

   strcpy(PATH, "/net/");

   strcat(PATH, optarg);

   break;

  case 'b': // Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±Π»ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…

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

    exit("parse command line failed");

   break;

  case 'd': // ΠΎΠ±ΠΌΠ΅Π½ сообщСниями

   lowlvl = false;

   break;

  default:

   exit(EXIT_FAILURE);

  }

 }

 strcat(PATH, DEVNAME);

 cout << "server path: " << PATH

  << ", block size = " << blk << " bytes" << endl;

 // ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΡ‹ сразу ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ процСссора ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

 result data;

 cout << "CPU speed [c.p.s.]: client = " << data.cps;

 uint64_t cps = data.cps;

 // пытаСмся ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ сСрвСру-ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρƒ

 int fd = open(PATH, O_RDONLY);