Операционные системы реального времени. Программно-аппаратный экспериментальный комплекс, в составе которого инструментальный компьютер, страница 14

Видно, что функция, осуществляющая интерполяцию, ощутимо занимает время лишь при больших количествах точек, которые нужно рассчитать.

Это логично, поскольку алгоритм интерполяции тривиален: пока не придет новое значение функции ее значение будет равно последнему из набора уже пришедших. Точность такого алгоритма невелика, особенно для быстро меняющихся функций, а потому соотношение точности-ресурсоемкости вполне логично: точность невелика и затрат немного.

5.4.  Системный профайлинг для передачи сообщений: локальной и сетевой (независимые процессы).

Рассмотрим взаимодействие клиента и сервера в случае, когда обмен происходит на одной машине – локально.

На приведенных иллюстрациях смена состояний клиента и сервера та же, что и описанная в пункте 5.2.

Измерим время передачи сообщения – разница времен между событиями: MsgSendEnter и MsgSendExit.

Для локальной передачи она составляет примерно 4 мс.

Для случая передачи сообщения по сети мы не можем совместить трассы для клиента и для сервера на одном рисунке, поскольку они работают на разных машинах, однако время передачи сообщения как – разницу времен между событиями: MsgSendEnter и MsgSendExit – мы посчитать можем.

Она составляет примерно 19 мс.

Время передачи сообщения по сети больше, чем для локального варианта.

5.5.  Системный профайлинг для передачи сообщений между родственными процессами.

Линия жизни сервера и клиента:

Список событий:

Первое событие, которое нас интересует, - 2352 – это установка соединения между клиентом и сервером. После выхода из функции ConnectAttach (событие 2353), начинается отправка сообщения – MsgSendEnter. После этого клиент переходит в Reply-блокированное состояние, а сервер начинает обрабатывать сообщение, переходя из состояния Receive-блокированного в состояние Running. После обработки сообщения сервер посылает ответ клиенту, клиент переходит в состояние Ready (готов к исполнению). Сервер завершает свое выполнение, поскольку получение сообщения предполагается лишь однажды, цикл отсутствует.

5.6.  Системный профайлинг для передачи сообщений между потоками одного процесса.

Все выводы, сделанные в п.5.5. справедливы и для данного пункта. Различие заключается в том, что принятие сообщения во второй нити идет в цикле, а потому сервер после отправки ответа клиенту перейдет в состояние receive-блокированного.

Следует добавить, что нить main() в течение всего времени выполнения других нитей находится в состоянии join, поскольку в main() были вызваны функции pthread_join и она должна ждать завершения двух остальных нитей.

Время, затраченное на отправку сообщения родственному процессу или потоку данного процесса меньше, чем время отправки сообщения независимому процессу (по сети или локально).

5.7.  Системный профайлинг для отправки сигналов по сети.

Процесс, отправляющий сигнал.

Текст программы:

#include <stdlib.h>

#include <stdio.h>

#include <signal.h>

#include <unistd.h>

#include <sys/neutrino.h>

#include <errno.h>

#include <ctype.h>

int main(int argc, char *argv[]) {

int err1;

setbuf(stdout, 0);

setbuf(stdin, 0);

int recv;

char node_name[20];

int err = 0;

printf("Type process id:");

scanf("%d", &recv);

printf("Type Node name: ");

scanf("%s", node_name);

uint_t nd;

// получаем номер узла

nd = netmgr_strtond(node_name, 0);

// отправляем сигнал

err = SignalKill(nd,recv, 0, SIGUSR1, 0, 0);

printf("Signal was sent\n");

return EXIT_SUCCESS;

}

Консоль:

Type process id:602153

Type Node name: /net/qnx1

Signal was sent

Результат профайлинга:

Процесс, получающий сигнал.

Текст программы:

#include <stdlib.h>

#include <stdio.h>

#include <signal.h>

#include <unistd.h>

// обработчик сигнала

void handler();

int main() {