Czas przejścia w tryb jądra <= 100ns [1] co daje max. kilkaset cyklów zegara CPU. Serio chcesz to poprawiać? To może mieć sens dla najlżejszych wywołań typu gettid/getpid, które kernel jest w stanie obsłużyć w kilku instrukcjach języka C, ale NIE będzie miało sensu dla wywołań związanych np. z alokacją pamięci, forkowaniem (fork od kuchni: [2]), siecią.
ZTCW to typowe stdliby minimalizują ilość odwołań do jądra przy alokacji pamięci. Alokują pamięć z wyprzedzeniem, np jednego megabajta i wszystkie małe alokacje są przetwarzane z użyciem tego bufora ze sporadycznymi odwołaniami do jądra, by zaalokować kolejny bufor, gdy wcześniejszy się przepełnia. Dealokacja też jest z opóźnieniem - dlatego np mimo zwolnienia całej zaalokowanej pamięci stdlib może trzymać sobie nadal kilka buforów.
Czas przejścia w tryb jądra <= 100ns [1]
W teście który pokazuje <= 100ns są takie uwagi:
My first idea was to make a cheap system call many times in a row, time how long it took, and compute the average time spent per syscall. The cheapest system call on Linux these days seems to be gettid. Turns out, this was a naive approach since system calls don't actually cause a full context switch anymore nowadays, the kernel can get away with a "mode switch" (go from user mode to kernel mode, then back to user mode). That's why when I ran my first test program, vmstat wouldn't show a noticeable increase in number of context switches.
Kolejne testy pokazują zgoła coś innego:
- przełączanie się bez blokowania się na dany rdzeń trwa >= 3000 ns,
- przełączenie się z blokowaniem na dany rdzeń trwa > 1000 ns,
- powyższe testy prawie nic nie robiły oprócz przełączania, więc nie było kosztu przeładowania pamięci podręcznej,
- przełączanie z przeładowaniem pamięci podręcznej bez blokowania się na dany rdzeń trwa jakieś 5000ns/ 1 KB przeładowanej pamięci,
- przełączanie z przeładowaniem pamięci podręcznej z blokowaniem na dany rdzeń trwa > 2000 ns,
- przeładowanie pamięci wynika z tego, że procedury rzeczywiście coś robią i korzystają ze struktur danych, które zajmują wiele kilobajtów pamięci,
int 80h (jak i każde inne przerwanie) ZTCW wymusza przełączenie w tryb jądra, więc tutaj system nie może "get away with", tylko przełączenie następuje na pewno i mamy tysiące nanosekund opóźnienia na jedno takie wywołanie.