Рис. 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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.