ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅Π°ΠΊΡΠΈΡ ΡΠΈΡΡΠ΅ΠΌΡ Π½Π° ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ QNX, Π½ΠΎΠΌΠ΅ΡΠ° ΠΊΠΎΡΠΎΡΡΡ Π²ΡΡΠ΅ SIGRTMAX (Π² ΠΈΡΡΠ»Π΅Π΄ΡΠ΅ΠΌΡΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΎΠΏΡΡΡ Π΄Π»Ρ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Π²ΠΊΠ»ΡΡΠΈΠΌ ΠΊΠ°ΠΊ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ (57β¦64), ΡΠ°ΠΊ ΠΈ ΡΠΈΠ³Π½Π°Π»Ρ ΠΈΠ· Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° 1β¦SIGRTMAX):
# ./s5 -b56 -e59 -n2
signal SIGRTMIN=41 - signal SIGRTMAX=56
set signal handler... Invalid argument
set signal handler... Invalid argument
set signal handler... Invalid argument
CHILD: signal mask set
signal sent: 56 with val = 0
signal sent: 56 with val = 1
signal sent: 57 with val = 0
signal sent: 57 with val = 1
signal sent: 58 with val = 0
signal sent: 58 with val = 1
signal sent: 59 with val = 0
signal sent: 59 with val = 1
PARENT: finished!
# CHILD: signal unblock
received signal 56 code = -2 val = 0
received signal 56 code = -2 val = 1
ΠΠ· Π²ΡΠ²ΠΎΠ΄Π° Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π½Π° ΡΠΈΠ³Π½Π°Π» Ρ Π½ΠΎΠΌΠ΅ΡΠΎΠΌ 56 ΡΠ΅Π°ΠΊΡΠΈΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠ°Ρ, Π° Π½Π° ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ ΡΠ΅Π°ΠΊΡΠΈΠΈ Π½Π΅Ρ Π²ΠΎΠ²ΡΠ΅. ΠΠ°ΠΊ ΠΈ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΠ· ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ΅Π°ΠΊΡΠΈΡ Π½Π° ΡΡΠΈ ΡΠΈΠ³Π½Π°Π»Ρ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈ ΠΏΠΎΠΏΡΡΠΊΠ° ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ sigaction() Π΄Π»Ρ Π½ΠΈΡ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Π²ΡΠ΄Π΅Π»ΡΠ΅Ρ ΡΠΈΠ³Π½Π°Π»Ρ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ (41β¦56), Π½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ UNIX (1β¦31), ΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ QNX (57β¦64), ΠΈ Π΄Π°ΠΆΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ, Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠΈΡΡΠ΅ΠΌΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ Π²ΠΎΠΎΠ±ΡΠ΅ (32β¦40). ΠΠΎΡΡΠ΅ΠΊΡΠ½Π΅Π΅ Π³ΠΎΠ²ΠΎΡΠΈΡΡ Π½Π΅ ΠΎΠ± ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π° ΠΎΠ± Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΎΠΌ ΡΠΏΠΎΡΠΎΠ±Π΅ ΡΠ°Π±ΠΎΡΡ Ρ Π»ΡΠ±ΡΠΌΠΈ ΡΠΈΠ³Π½Π°Π»Π°ΠΌΠΈ - ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² Π½Π° Π±Π°Π·Π΅ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ ΡΠΈΠ³Π½Π°Π»ΠΎΠ².
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ΠΠ»Ρ ΠΏΠΎΠ»Π½ΠΎΡΡ ΠΊΠ°ΡΡΠΈΠ½Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΡΠΈΠΏΠ° siginfo_t Π΄Π»Ρ QNX (Π²ΡΡΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π»ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΡ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, ΡΡΠ΅Π±ΡΠ΅ΠΌΡΡ POSIX). Π‘ΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π²Π΅ΡΡΠΌΠ° ΠΎΠ±ΡΠ΅ΠΌΠ½Π° (Π²ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° ΡΠ°Π·Π΄Π΅Π»Π° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π±Π΅Π·Π±ΠΎΠ»Π΅Π·Π½Π΅Π½Π½ΠΎ ΠΏΡΠΎΠΏΡΡΠ΅Π½Π° ΡΠ΅ΠΌΠΈ, ΠΊΠΎΠΌΡ ΡΡΠΎ Π½Π΅ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ), Π½ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ ΠΈΡΡΠ΅ΡΠΏΡΠ²Π°ΡΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠΌ ΡΠΈΠ³Π½Π°Π»Π΅:
typedef struct {
int si_signo;
int si_code; /* if SI_NOINFO, only si_signo is valid */
int si_errno;
union {
int __pad[7];
struct {
pid_t __pid;
union {
struct {
uid_t __uid;
union sigval __value;
} kill; /* si_code <= 0 SI_FROMUSER */
struct {
_CSTD clock_t __utime;
/* CLD_EXITED status, else signo */
int _status;
_CSTD clock_t __stime;
} __chld;
/* si_signo=SlGCHLD si_code=CLD_* */
} __pdata;
} __proc;
struct {
int __fltno;
void* __fltip;
void* __addr;
} fault; /* si_signo=SIGSEGV,ILL,FPE,TRAP,BUS */
} __data;
} siginfo_t;
#define si_pid __data.__proc.__pid
#define si_value __data.__proc.__pdata.__kill.__value
#define si_uid __data.__proc.__pdata.__kill.__uid
#define si_status __data.__proc.__pdata.__chld.__status
#define si_utime __data.__proc.__pdata.__chld.__utime
#define si_stime __data.__proc.__pdata.__chld.__stime
#define si_fltno __data.__fault.__fltno
#define si_trapno si_fltno
#define si_addr __data.__fault.__addr
#define si_fltip __data.__fault.__fltip
Π ΠΏΠΎΠ»Π½ΡΠΉ ΠΏΠ΅ΡΠ΅ΡΠ΅Π½Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΏΠΎΠ»Ρ si_code:
#define SI_USER 0
#define SI_RESERVED1 (-1)
#define SI_QUEUE (-2)
#define SI_TIMER (-3)
#define SI_ASYNCIO (-4)
#define SI_MESGQ (-5)
#define SI_NOTIFY (-6)
#define SI_IRQ (-7)
// QNX managers will never use this range.
#define SI_MINAVAIL (-128)
#define SI_MAXAVAIL (-64)
#define SI_NOINFO 127
#define SI_MAXSZ 126
ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ SI_QUEUE, ΡΠ°Π²Π½ΠΎΠ΅ -2, β ΡΡΠΎ ΠΈ Π΅ΡΡΡ ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΡ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² Π²ΡΠ²ΠΎΠ΄Π΅ ΡΠ΅ΡΡΠΎΠ²ΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ Π²ΡΡΠ΅.
Π‘ΠΎΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ
Π Π°Π½Π΅Π΅ ΠΌΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠ»ΠΈ ΠΎΡΠ΅Π½ΠΊΡ Π·Π°ΡΡΠ°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° Π½Π° ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°ΠΌΠΈ Π΄Π»Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈ Π΄Π»Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ² (ΡΠ΅ΡΡΠΎΠ²ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΠΏΠΎ ΠΈΡ ΡΡΡΡΠΊΡΡΡΠ΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π»ΠΈ ΠΊΠ°ΠΊ Β«ΡΠΈΠΌΠΌΠ΅ΡΡΠΈΡΠ½ΡΠ΅Β»). ΠΡΠΎΠ΄Π΅Π»Π°Π΅ΠΌ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, Π½ΠΎ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² Π²ΡΠΏΠΎΠ»Π½ΠΈΠΌ ΠΏΠΎΡΡΠ»ΠΊΠΎΠΉ ΠΈ ΠΏΡΠΈΠ΅ΠΌΠΎΠΌ ΡΠΈΠ³Π½Π°Π»Π° (ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠ² Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ΅ 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
# nice -n-19 p6s -n10000 -q
2854963 -> 2863156 : cycles - 57194634; on signal - 2859
2863156 -> 2854963 : cycles - 57199831; on signal - 2859
# nice -n-19 p6s -n1000000 -q
2871347 -> 2879540 : cycles - 571543013; on signal - 2857
2879540 -> 2871347 : cycles - 571550847; on signal - 2857
# nice -n-19 p6s -n1000000 -q
2887731 -> 2895924 : cycles - 5715903548; on signal - 2857
2895924 -> 2887731 : cycles - 5715908318; on signal - 2857
ΠΡΠΎ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΅ ΠΆΠ΅ ΡΠΈΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ, ΡΡΠΎ, Π²ΠΎΠΎΠ±ΡΠ΅-ΡΠΎ Π³ΠΎΠ²ΠΎΡΡ, Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΡ ΡΠ°Π½Π΅Π΅ ΡΡ Π΅ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΏΡΠΈΠ΅ΠΌΠ° ΡΠΈΠ³Π½Π°Π»ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ»ΡΠΊΠΎ Π»ΠΈΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΠ΅ΡΡΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ ΡΡ Π΅ΠΌΡ.
Π‘ΠΈΠ³Π½Π°Π»Ρ Π² ΠΏΠΎΡΠΎΠΊΠ°Ρ
ΠΠΎΠ΄Π΅Π»Ρ ΡΠ΅Π°ΠΊΡΠΈΠΉ Π½Π° ΡΠΈΠ³Π½Π°Π»Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π΅ ΠΏΡΠΎΡΠ°Π±ΠΎΡΠ°Π½Π° Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° Π² ΡΠ°ΠΌΠΊΠ°Ρ POSIX ΠΈ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π½Π° ΡΡΠ°Π΄ΠΈΠΈ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π² ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Ρ ΡΠ°Π·Π²ΠΈΡΠΎΠΉ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΡΡ (Π° QNX β ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊΠ°Ρ ΡΠΈΡΡΠ΅ΠΌΠ°) ΡΡΠ° ΡΡΠΎΡΠΎΠ½Π° Π²ΠΎΠΏΡΠΎΡΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡΡΡ, ΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΠΏΠΎΡΠΎΠΊΠΈ Π² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ Ρ ΡΠΈΠ³Π½Π°Π»Π°ΠΌΠΈ ΠΌΠΎΠ³ΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΌΠΎΡΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠ²Π½ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, Π° Π΅ΡΠ΅ ΠΈ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ Π½Π΅ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠ΅ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠ΅ ΠΈΠ»ΠΈ Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΠΈΠ½ΠΈΡΠΈΠΈΡΡΠ΅ΠΌΡΠ΅ ΡΠΈΠ³Π½Π°Π»Π°ΠΌΠΈ, ΠΌΠΎΠ³ΡΡ ΠΏΠΎΡΠΎΠ΄ΠΈΡΡ ΠΎΡΠ΅Π½Ρ ΡΠ΅ΡΡΠ΅Π·Π½ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π² ΡΠ»ΡΡΠ°Π΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΠΈ (ΠΌΡ Π΅ΡΠ΅ Π±ΡΠ΄Π΅ΠΌ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ ΡΡΠΈΠΌ Π²ΠΎΠΏΡΠΎΡΠ°ΠΌ ΠΏΠΎ ΡΠ΅ΠΊΡΡΡ). Π ΡΠ°Π· ΡΠ°ΠΊ, ΡΠΎ Π² ΡΡΠΈΡ ΡΠ»ΡΡΠ°ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ (ΡΠ΄Π°ΡΠ½ΡΡ ΠΈΠ»ΠΈ Π½Π΅ ΠΎΡΠ΅Π½Ρ).