ΠΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΊ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π· Π²ΡΡΠ΅ΡΠ½ΡΠ΅ΡΡΡ Π² ΠΏΠ΅ΡΠΈΠΎΠ΄ ΡΠ²ΠΎΠ΅ΠΉ ΡΠ°Π±ΠΎΡΡ Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠΌ, ΡΠΎ Π΅Π³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡΡΡ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»Π΅Π±Π°Π½ΠΈΠ΅ Ρ Π²ΡΡΠΎΠΊΠΎΠΉ ΡΠ°ΡΡΠΎΡΠΎΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΠΈ ΡΠΎΠ½ΠΎΠ²ΡΠΌ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ°ΠΌΠΈ. ΠΠΎΡΡΠΎΠΌΡ Π² QNX 6.2.1 Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°Ρ Π΄Π»Ρ ΡΠΏΠΎΡΠ°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠΉ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ (ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡ) ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ Π±ΡΠ΄ΠΆΠ΅ΡΠ° Π·Π° ΠΏΠ΅ΡΠΈΠΎΠ΄.
ΠΠ°ΠΊ ΡΠΆΠ΅ ΠΎΠΏΠΈΡΡΠ²Π°Π»ΠΎΡΡ Π²ΡΡΠ΅, ΡΡΡΡΠΊΡΡΡΠ°
shed_param
struct {
Β _INT32 __ss_low_priority;
Β _INT32 __ss_max_repl;
Β struct timespec __ss_repl_period;
Β struct timespec __ss_init_budget;
} __ss;Π³Π΄Π΅
low_prioritymax_replrepl_periodinit_budgetΠ‘ΠΎΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ
ΠΡΠΏΠΎΠ»Π½ΠΈΠΌ Β«ΡΠΈΠΌΠΌΠ΅ΡΡΠΈΡΠ½ΡΠΉΒ» ΡΠ΅ΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΠΎΠΌΡ, ΠΊΠ°ΠΊ ΡΡΠΎ Π΄Π΅Π»Π°Π»ΠΎΡΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠ² ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² (ΡΡΡ. 44), Π½ΠΎ ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΊ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ ( ΡΠ°ΠΉΠ» p5t.cc). ΠΡΠΈ ΡΡΠΎΠΌ ΠΌΡ ΠΏΠΎΡΡΠ°ΡΠ°Π΅ΠΌΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΈΠΌΠ΅Π²ΡΠΈΠ΅ ΠΌΠ΅ΡΡΠΎ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Β«ΠΠ°ΡΡΠ°ΡΡ Π½Π° Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²Β» ( ΡΠ°ΠΉΠ» p5.ΡΡ) (Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, ΠΈΠ·-Π·Π° ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π·Π»ΠΈΡΠΈΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΠ² ΡΠ΅ΠΊΡΡΡ ΠΊΠΎΠ΄ΠΎΠ² Π±ΡΠ΄ΡΡ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ).
#include <stdlib.h>
#include <stdio.h>
#include <inttypes.h>
#include <iostream.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include <sys/neutrino.h>
unsigned long N = 1000;
// ΠΏΠΎΡΠΎΠΊΠΎΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ:
void* threadfunc(void* data) {
Β uint64_t t = ClockCycles();
Β for (unsigned long i = 0; i < N; i++) sched_yield();
Β t = ClockCycles() - t;
Β // Π΄Π°ΡΡ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ 2-ΠΌΡ ΠΏΠΎΡΠΎΠΊΡ Π΄ΠΎ Π½Π°ΡΠ°Π»Π° Π²ΡΠ²ΠΎΠ΄Π°
Β delay(100);
Β cout << pthread_self() << "\t: cycles - " << t
Β << ", on sched - " << (t / N) / 2 << endl;
Β return NULL;
}
int main(int argc, char* argv[]) {
Β int opt, val;
Β while ((opt = getopt(argc, argv, "n:")) != -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;
Β Β default:
Β Β exit(EXIT_FAILURE);
Β }
Β }
Β const int T = 2;
Β pthread_t tid[T];
Β // ΡΠΎΠ·Π΄Π°ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΡΡΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ
Β for (int i = 0; i < T; i++)
Β if (pthread_create(tid + i, NULL, threadfunc, NULL) != EOK)
Β Β cout << "thread create error", exit(EXIT_FAILURE);
Β // ΠΈ Π΄ΠΎΠΆΠΈΠ΄Π°ΡΡΡΡ ΠΈΡ
Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ...
Β for (int i = 0; i < T; i++)
Β pthread_join(tid[i], NULL);
Β exit(EXIT_SUCCESS);
}Π Π΅Π·ΡΠ»ΡΡΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ:
# nice -n-19 p5t -n100
2Β Β Β Β Β Β : cycles - 79490; on sched - 397
3Β Β Β Β Β Β : cycles - 78350; on sched β 391
# nice -n-19 p5t -n1000
2Β Β Β Β Β Β : cycles - 753269; on sched - 376
3Β Β Β Β Β Β : cycles - 752069; on sched - 376
# nice -n-19 p5t -n10000
2Β Β Β Β Β Β : cycles - 7494255; on sched - 374
3Β Β Β Β Β Β : cycles - 7493225; on sched - 374
# nice -n-19 p5t -n100000
2Β Β Β Β Β Β : cycles - 74897795; on sched - 374
3Β Β Β Β Β Β : cycles - 74895800; on sched β 374
# nice -n-19 p5t -n1000000
2Β Β Β Β Β Β : cycles - 748850811, on sched - 374
3Β Β Β Β Β Β : cycles - 748850432; on sched - 374ΠΠ°ΠΊ ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ, ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ ΠΎΡΠ΅Π½Ρ Π²ΡΡΠΎΠΊΠΎΠΉ ΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΡΡ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Β«ΠΎΠ±ΡΠ΅ΠΌΠ° Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉΒ» Π½Π° 4 ΠΏΠΎΡΡΠ΄ΠΊΠ°, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎ ΡΠ²ΠΎΠΈΠΌ Π²Π΅Π»ΠΈΡΠΈΠ½Π°ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΏΠΎΡΡΠΈ Π² 2 ΡΠ°Π·Π° ΠΌΠ΅Π½ΡΡΠ΅, ΡΠ΅ΠΌ Π΄Π»Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² (ΡΡΡ. 45).
ΠΠ°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ°
ΠΠ°ΠΊ ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΠ±ΡΡΠΆΠ΄Π°Π²ΡΠ΅Π³ΠΎΡΡ ΡΠ°Π½Π΅Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°, Π΄Π»Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΎΡΡΠ΅ΡΠ»ΠΈΠ²ΠΎ ΡΠ°Π·Π»ΠΈΡΠ°ΡΡ ΡΠ»ΡΡΠ°ΠΈ:
β’Β Β«Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎΒ» Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ° ΠΈΠ· ΠΊΠΎΠ΄Π° ΡΠ°ΠΌΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°;
β’Β Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ° ΠΈΠ·Π²Π½Π΅, ΠΈΠ· ΠΊΠΎΠ΄Π° Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° ΠΈΠ»ΠΈ ΠΏΠΎ ΡΠΈΠ³Π½Π°Π»Ρ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Β«Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎΒ» Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ, Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΡΡΠ³ΠΎΠΉ ΡΠ΅ΡΠΌΠΈΠ½ β ΠΎΡΠΌΠ΅Π½Π°.
ΠΠ°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΡΠΈ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΠΏΠΎΡΠΎΠΊΠ° ΡΠ²ΠΎΠ΅Π³ΠΎ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ° ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°
return