Жанры книг
Мы в соц.сетях
ParaKnig📚 » Компьютеры и Интернет » Интернет » QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович
<< На главную

QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович

Читать онлайн QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 91 92 93 94 95 96 97 98 99 ... 106
Перейти на страницу:
Второй клиентский процесс

#include &quot;common.h&quot;

static bool conti = true;

// завершение процесса по сигналу пользователя (SIGINT - ^C)

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

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

 cout &lt;&lt; &quot;SRR repeater: &quot; &lt;&lt; VERSION &lt;&lt; endl;

 int opt, val;

 unsigned int blk = 100;

 char PATH[_POSIX_PATH_MAX] = &quot;&quot;;

 bool lowlvl = true;

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

  switch(opt) {

  case 'n': // имя сетевого узла

   strcpy(PATH, &quot;/net/&quot;);

   strcat(PATH, optarg);

   break;

  case 'b': // размер блока данных

   if (sscanf(optarg, &quot;%i&quot;, &amp;blk) ! = 1)

    exit(&quot;parse command line failed&quot;);

   break;

  case 'd': // обмен сообщениями

   lowlvl = false;

   break;

  default:

   exit(EXIT_FAILURE);

  }

 }

 strcat(PATH, DEVNAME);

 cout &lt;&lt; &quot;server path: &quot; &lt;&lt; PATH

  &lt;&lt; &quot;, block size = &quot; &lt;&lt; blk &lt;&lt; &quot; bytes&quot; &lt;&lt; endl;

 // при инициализации мы сразу получаем скорость процессора клиента

 result data;

 cout &lt;&lt; &quot;CPU speed [c.p.s.]: client = &quot; &lt;&lt; data.cps;

 uint64_t cps = data.cps;

 // пытаемся подключиться к серверу-менеджеру

 int fd = open(PATH, O_RDONLY);

 if (fd &lt; 0) exit(&quot;server not found&quot;);

 // читаем его параметры

 if (read(fd, &amp;data, sizeof(result)) == -1)

  exit(&quot;parameter block read&quot;);

 cout &lt;&lt; &quot;, server = &quot; &lt;&lt; data.cps &lt;&lt; endl;

 // определяем дескриптор сетевого узла

 int32_t node = netmgr_strtond(PATH, NULL);

 if (node == -1 &amp;&amp; fd &gt; 0 &amp;&amp; errno == ENOENT)

  node = ND_LOCAL_NODE;

 // по адресным данным, полученным ранее по read(), создаем

 // канал для прямого обмена сообщениями с тем же процессом

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

 if (coid &lt; 0) exit(&quot;connect to message channel&quot;);

 // динамически готовим код команды devctl():

 unsigned int DCTL = (blk &lt;&lt; 16) + DCMD_SRR;

 cout &lt;&lt; &quot; . . . . . waiting ^C . . . . . &quot; &lt;&lt; flush;

 // устанавливается реакция на пользовательский ^C

 signal(SIGINT, trap);

 uint64_t num = 0;

 uint8_t *bufin = new uint8_t[blk], *bufou = new uint8_t[blk];

 uint64_t tim = ClockCycles();

 // в зависимости от выбранного механизма передаем с его помощью данные

 if (lowlvl)

  while (true) {

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

    exit(&quot;exchange data with channel&quot;);

   num++;

   if (!conti) break;

  }

 else {

  while (true) {

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

    exit(&quot;DEVCTL error&quot;);

   num++;

   if (!conti) break;

  }

 }

 tim = ClockCycles() - tim;

 cout &lt;&lt; 'r' &lt;&lt; (lowlvl ? &quot;message exchange:&quot; : &quot;manager exchange:&quot;) &lt;&lt;

  &quot; number = &quot; &lt;&lt; num &lt;&lt; &quot;; stream = &quot;

  &lt;&lt; (double)num * blk / ((double)tim / (double)cps) / 1E6 * 8 &lt;&lt;

  &quot; Mbit/sec&quot; &lt;&lt; endl;

 ConnectDetach(coid);

 close(fd);

 delete [] bufin;

 delete [] bufou;

 return EXIT_SUCCESS;

}

В результате мы получаем оценки максимальной плотности потока обмена, достижимые в выбранных (при помощи ключей) условиях на данном процессоре:

# clr -b1

SRR repeater: vers. 1.03

1 ... 91 92 93 94 95 96 97 98 99 ... 106
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Лариса
Лариса 11.03.2026 - 20:17
Странно,здесь имя девочки Аграфена,а на других сайтах я прослушала три книги этого цикла с именем Дарвина.Зачем менять имя и путать читателей? Опечатка- не Дарвина,  а  Дарина.
Григорий
Григорий 09.04.2025 - 22:24
Лучшая книга всех времен
Женя
Женя 02.04.2025 - 16:08
Любимая книга