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

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

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

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

Π Π°Π½Π΅Π΅ ΠΌΡ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠ»ΠΈ ΠΎΡ†Π΅Π½ΠΊΡƒ Π·Π°Ρ‚Ρ€Π°Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ процСссора Π½Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ контСкстами для процСссов ΠΈ для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (тСстовыС Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΏΠΎ ΠΈΡ… структурС ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π»ΠΈ ΠΊΠ°ΠΊ «симмСтричныС»). ΠŸΡ€ΠΎΠ΄Π΅Π»Π°Π΅ΠΌ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‚ΠΎ ΠΆΠ΅ самоС, Π½ΠΎ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ процСссов Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ посылкой ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠΎΠΌ сигнала (ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ контСкстов Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅

pause()
β€” ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΊ ΠΏΡ€ΠΈΠ΅ΠΌΡƒ сигнала) ( Ρ„Π°ΠΉΠ» p6s.cc):

Π—Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ процСссов посылкой сигналов

#include <stdlib.h>

#include <stdio.h>

#include <inttypes.h>

#include <iostream.h>

#include <unistd.h>

#include <sched.h>

#include <sys/neutrino.h>

// "пустыС" ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ сигналов

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, "n:q")) != -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;

Β  // ΠΊΠ»ΡŽΡ‡ q опрСдСляСт схСму ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигнала

Β  case 'q':

Β Β  que = true;

Β Β  break;

Β  default:

Β Β  exit(EXIT_FAILURE);

Β  }

Β }

Β // установка ΡΠΈΠ³Π½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²

Β sigset_t sig;

Β sigemptyset(&sig);

Β sigaddset(&sig, SIGUSR1);

Β sigprocmask(SIG_UNBLOCK, &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, &act, NULL) < 0)

Β Β cout << "set signal handler" << endl, exit(EXIT_FAILURE);

Β pid_t pid = fork();

Β if (pid == -1)

Β  cout << "fork error" << 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 << getpid() << " -> " << did << "\t: cycles - " << t <<

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

exit(EXIT_SUCCESS);

}

Π­Ρ‚ΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΡƒΡŽ схСму ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигналов (модСль Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Ρ… сигналов), ΠΈ схСму ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ с ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒΡŽ поступлСния сигналов (модСль сигналов Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ), ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈ стартС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΡƒΠΊΠ°Π·Π°Π½ ΠΊΠ»ΡŽΡ‡

-q
. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ тСстовых запусков:

# nice -n-19 p6s -n1000

2904115 -> 2912308 : cycles - 5792027; on signal - 2896

2912308 -> 2904115 : cycles - 5828952; on signal β€” 2914

# nice -n-19 p6s -n10000

2920499 -> 2928692 : cycles - 57522753, on signal - 2876

2928692 -> 2920499 : cycles - 57530378; on signal
- 2876

# nice -n-19 p6s -n100000

2936883 -> 2945076 : cycles - 573730469; on signal - 2868

2945076 -> 2936883 : cycles - 573738122; on signal - 2868

# nice -n-19 p6s -n1000000

2953267 -> 2961460Β : cycles - 5747418203, on signal - 2873

2961460 -> 2953267 : cycles - 5747425310; on signal - 2873

Вспомним, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ тСстов простого ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ процСссов (см. Π² Π³Π»Π°Π²Π΅ 2) ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π»ΠΈ Ρ†ΠΈΡ„Ρ€Ρƒ порядка 600 процСссорных Ρ†ΠΈΠΊΠ»ΠΎΠ² Π½Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. БСйчас Ρƒ нас Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ большС: порядка 2850 Ρ†ΠΈΠΊΠ»ΠΎΠ², ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… «лишниС» 2250 β€” это Π½Π΅ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° посылку ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌ сигнала, Π²ΠΎΠ·Π±ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΈ Π΅Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ (Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΡ… ΠΏΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ). Π­Ρ‚ΠΎ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΉ ΠΎΡ†Π΅Π½ΠΊΠΎΠΉ трудоСмкости ΠΎΠ±ΠΌΠ΅Π½Π° сигналами.

ΠŸΡ€ΠΎΠ΄Π΅Π»Π°Π΅ΠΌ Ρ‚ΠΎ ΠΆΠ΅ самоС, Π½ΠΎ ΡƒΠΆΠ΅ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ сигналов Π² порядкС ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈΡ… поступлСния:

# nice -n-19 p6s -n1000 -q

2838579 -> 2846772 : cycles - 5772106; on signal - 2886

2846772 -> 2838579 : cycles - 5782138; on signal - 2891