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

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

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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 44 45 46 47 48 49 50 51 52 ... 106
Перейти на страницу:

Соображения производительности

Ранее мы производили оценку затрат производительности процессора на переключение между контекстами для процессов и для потоков (тестовые задачи, которые мы по их структуре именовали как «симметричные»). Проделаем теперь то же самое, но синхронизацию процессов выполним посылкой и приемом сигнала (переключение контекстов будет происходить именно на операторе pause()— переходе к приему сигнала) ( файл p6s.cc):

Затраты на переключение процессов посылкой сигналов

#include &lt;stdlib.h&gt;

#include &lt;stdio.h&gt;

#include &lt;inttypes.h&gt;

#include &lt;iostream.h&gt;

#include &lt;unistd.h&gt;

#include &lt;sched.h&gt;

#include &lt;sys/neutrino.h&gt;

// &quot;пустые&quot; обработчики сигналов

static void nhand(int signo) {}

static void qhand(int signo, siginfo_t* info, void* context) {}

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

 unsigned long N = 1000;

 bool que = false;

 int opt, val;

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

  switch(opt) {

  case 'n':

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

    cout &lt;&lt; &quot;parse command line error&quot; &lt;&lt; endl, exit(EXIT_FAILURE);

   if (val &gt; 0) N = val;

   break;

  // ключ q определяет схему обработки сигнала

  case 'q':

   que = true;

   break;

  default:

   exit(EXIT_FAILURE);

  }

 }

 // установка сигнальных обработчиков

 sigset_t sig;

 sigemptyset(&amp;sig);

 sigaddset(&amp;sig, SIGUSR1);

 sigprocmask(SIG_UNBLOCK, &amp;sig, NULL);

 struct sigaction act;

 act.sa_mask = sig;

 act.sa_sigaction = qhand;

 act.sa_handler = nhand;

 act.sa_flags = que ? SA_SIGINFO : 0;

 if (sigaction(SIGUSR1, &amp;act, NULL) &lt; 0)

  cout &lt;&lt; &quot;set signal handler&quot; &lt;&lt; endl, exit(EXIT_FAILURE);

 pid_t pid = fork();

 if (pid == -1)

  cout &lt;&lt; &quot;fork error&quot; &lt;&lt; endl, exit(EXIT_FAILURE);

 // кому отправлять сигнал?

 pid_t did = (pid == 0 ? getppid() : pid);

 unsigned long i = 0;

 uint64_t t = ClockCycles();

 while (true) {

  kill(did, SIGUSR1);

  if (++i == N) break;

  pause();

 }

 t = ClockCycles() - t;

 cout &lt;&lt; getpid() &lt;&lt; &quot; -&gt; &quot; &lt;&lt; did &lt;&lt; &quot;t: cycles - &quot; &lt;&lt; t &lt;&lt;

  &quot;; on signal - &quot; &lt;&lt; (t / N) / 2 &lt;&lt; endl;

exit(EXIT_SUCCESS);

}

Этим приложением мы можем тестировать и традиционную схему обработки сигналов (модель надежных сигналов), и схему обработки с очередью поступления сигналов (модель сигналов реального времени), когда при старте программы указан ключ -q. Посмотрим на результаты тестовых запусков:

# nice -n-19 p6s -n1000

2904115 -&gt; 2912308 : cycles - 5792027; on signal - 2896

2912308 -&gt; 2904115 : cycles - 5828952; on signal — 2914

# nice -n-19 p6s -n10000

2920499 -&gt; 2928692 : cycles - 57522753, on signal - 2876

2928692 -&gt; 2920499 : cycles - 57530378; on signal - 2876

# nice -n-19 p6s -n100000

2936883 -&gt; 2945076 : cycles - 573730469; on signal - 2868

2945076 -&gt; 2936883 : cycles - 573738122; on signal - 2868

# nice -n-19 p6s -n1000000

2953267 -&gt; 2961460 : cycles - 5747418203, on signal - 2873

2961460 -&gt; 2953267 : cycles - 5747425310; on signal - 2873

Вспомним, что при изучении тестов простого переключения процессов (см. в главе 2) мы получали цифру порядка 600 процессорных циклов на переключение. Сейчас у нас затраты заметно больше: порядка 2850 циклов, из которых «лишние» 2250 — это не что иное, как затраты на посылку и прием сигнала, возбуждение функции обработчика и ее завершение (разделить их по компонентам мы не можем). Это и может служить ориентировочной оценкой трудоемкости обмена сигналами.

Проделаем то же самое, но уже при обработке сигналов в порядке очереди их поступления:

# nice -n-19 p6s -n1000 -q

2838579 -&gt; 2846772 : cycles - 5772106; on signal - 2886

2846772 -&gt; 2838579 : cycles - 5782138; on signal - 2891

1 ... 44 45 46 47 48 49 50 51 52 ... 106
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Лариса
Лариса 11.03.2026 - 20:17
Странно,здесь имя девочки Аграфена,а на других сайтах я прослушала три книги этого цикла с именем Дарвина.Зачем менять имя и путать читателей? Опечатка- не Дарвина,  а  Дарина.
Григорий
Григорий 09.04.2025 - 22:24
Лучшая книга всех времен
Женя
Женя 02.04.2025 - 16:08
Любимая книга