Проектирование с использованием IDE (Отчет о выполнении научно-исследовательской работы), страница 6

Рис. 9

Рис. 10

Рис.11

При данной реализации отправки сообщения клиент не блокируется при отправке. Отправка сообщения занимает 30.400 мкс. После этого клиент может выполнять вычисления. Это обмен сообщениями без квитирования.

Далее стоит рассмотреть аналогичный механизм микроядра – отправка пульса функциями сообщений.

client:

#include <sys/neutrino.h>

#include <stdlib.h>

#include <stdio.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>

#define PATH "channel_pulse_"

int main(){

      int fd;

      char  sbuf[255], rbuf[255];

      fd = name_open( PATH, 0 );

      if( fd == -1 ){

            printf("Client name_open error\n" );

            exit( EXIT_FAILURE );

      }

      strcpy( sbuf, "Client pulse" );

      MsgSend( fd, &sbuf[0], sizeof(sbuf), &rbuf[0], sizeof(rbuf) );

      printf("CLIENT:\n  Client get = %s \n", rbuf );

      MsgSendPulse( fd, 0, 10, 5 );

      name_close( fd );

      return 0;  

}

Server

#include <stdio.h>

#include <errno.h>

#include <stdlib.h>

#include <string.h>

#include <sys/dispatch.h>

#include <string.h>

#define ATTACH_POINT "channel_pulse"

typedef struct _my_date{

      struct _pulse     pulse;

      char  buf[255];

} my_dat;

int main(){

      name_attach_t *attach;

      struct _msg_info *info;

      int   nbyte=255, rcvid, val;

      char  buf[255];

      my_dat dat;

      if ((attach = name_attach(NULL, ATTACH_POINT, 0)) == NULL) {

            printf("name attach fail\n");

      return EXIT_FAILURE;

      }

      while(1){

            rcvid = MsgReceive( attach->chid, &buf[0], sizeof(buf), NULL );

            if( rcvid > 0 ){

                  //Message

                  printf("SERVER:\n  Serv get = %s\n", buf );

                  strcpy( buf, "Server pulse" );

                  MsgReply( rcvid, 0, &buf[0], sizeof( buf ) );

            } else if( rcvid == 0 ){

                  //Pulse

                  printf("Server get pulse!\n" );

            }

      }//end while(1)

      name_detach(attach, 0);

      return 0;

}

Рис. 12

Рис. 13

В этом случае отправка пульса занимает 14.962 мкс. Это в 2 раза меньше, чем при использовании функций POSIX.

Таким образом, в ходе этого эксперимента выяснилось, что быстродействие обмена средствами POSIX значительно меньше, чем быстродействие при использовании собственных функций микроядра, что подчеркивает ориентированность исследуемой ОС на системы управления с использованием ОСРВ.

Для сравнения разных вариантов отправки пульса, рассмотрим отправку пульса специальными функциями.

client:

#include <sys/neutrino.h>

#include <stdlib.h>

#include <stdio.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>

#define PATH "channel_msg_"

#define MY_PULSE1  _PULSE_CODE_MINAVAIL+1