Π‘ΠΎΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ
Π Π°Π½Π΅Π΅ ΠΌΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠ»ΠΈ ΠΎΡΠ΅Π½ΠΊΡ Π·Π°ΡΡΠ°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° Π½Π° ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°ΠΌΠΈ Π΄Π»Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈ Π΄Π»Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ² (ΡΠ΅ΡΡΠΎΠ²ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΠΏΠΎ ΠΈΡ ΡΡΡΡΠΊΡΡΡΠ΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π»ΠΈ ΠΊΠ°ΠΊ Β«ΡΠΈΠΌΠΌΠ΅ΡΡΠΈΡΠ½ΡΠ΅Β»). ΠΡΠΎΠ΄Π΅Π»Π°Π΅ΠΌ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, Π½ΠΎ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² Π²ΡΠΏΠΎΠ»Π½ΠΈΠΌ ΠΏΠΎΡΡΠ»ΠΊΠΎΠΉ ΠΈ ΠΏΡΠΈΠ΅ΠΌΠΎΠΌ ΡΠΈΠ³Π½Π°Π»Π° (ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠ² Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ΅
pause()
#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