IDE Momentics - profiling. Настройка IDE QNX Momentics для исследования клиент-серверного приложения на локальной машине, страница 2

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

Профайлинг позволяет узнать о состоянии системы в процессе выполнения программ, определить, какие программы выполнялись в заданный промежуток времени, сколько времени выполнялась та или иная функция или строчка в программе, состояние процессов в системе, временной анализ их взаимодействия, загруженность процессора

Рис. Пример профайлинга

Рис. Пример профайлинга

Временной анализ приложений (timeline) позволяет определить, когда, сколько времени выполнялось приложение, а также его статус. Рассмотрим временной анализ работы на примере клиент-сервер-агентского приложения. Текст программы приведен ниже.

Serv.c

#include <stdio.h>

#include <errno.h>

#include <stdlib.h>

#include <string.h>

#include <sys/dispatch.h>

#include <string.h>

#include <process.h>

#define ATTACH_POINT "channel_lab1"

name_attach_t         *attach;

struct _msg_info      *info;

int                                                 nbyte=255, rcvid, num_agent=0, table[5], i, buf_rcvid, num_client=0, rcvid_tab[200];

char                                        buf[255], msg[255], str[255], simb;

void send_to_agent();

int main(){

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

printf("name Attach fail ???\n");

return EXIT_FAILURE;

}

for( i=0; i< 5; i++ ){

spawnl( P_NOWAIT, "agent", "agent", NULL );

}

while(1){

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

if( rcvid > 0 ){

printf("Server get message = %s\n", buf );

sscanf( buf, "%s %d %s", str, &buf_rcvid, msg);

if( strcmp( str, "NewAgent" ) == 0 ){

printf("Server get msg from Agent\n");

// get message from Agent

num_agent++;

table[ num_agent-1 ] = rcvid;

if( buf_rcvid > 0 ){

MsgReply( buf_rcvid, 0, &msg[0], sizeof( msg ) );

if( num_client > 0 ){

// send work to agent

rcvid = rcvid_tab[ num_client-1 ];

num_client--;

send_to_agent();

}// end if( num_client > 0 )

}//end if( buf_rcvid > 0 )

}else{

/*

//Message from Client

printf("SERVER!!!\n   Get Message from client and send this to agent %d\n", num_agent );

itoa( rcvid, buf, 10 );

//strcpy( buf, "Hello Agent!!" );

MsgReply( table[num_agent-1], 0, &buf[0], sizeof( buf ) );

num_agent--;

*/

if( num_agent > 0 )   send_to_agent();

else{ num_client++; rcvid_tab[ num_client-1 ] = rcvid; }

}

}

}//end while(1)

name_detach(attach, 0);

return 0;

}

void send_to_agent(){

//Message from Client

printf("SERVER!!!\n   Get Message from client and send this to agent %d\n", num_agent );

itoa( rcvid, buf, 10 );

//strcpy( buf, "Hello Agent!!" );

MsgReply( table[num_agent-1], 0, &buf[0], sizeof( buf ) );

num_agent--;

}

Client.c

#include <sys/neutrino.h>

#include <stdlib.h>

#include <stdio.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>

#define PATH "channel_lab1"

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, "I am the client" );

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

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

name_close( fd );

return 0;     

}

Agent.c

#include <sys/neutrino.h>

#include <stdlib.h>

#include <stdio.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>

#define PATH "channel_lab1"

int main(){

int                                                 fd, i;

char                                        sbuf[255], rbuf[255];

fd = name_open( PATH, 0 );

if( fd == -1 ){

printf("AGENT name open error ???\n" );

exit( EXIT_FAILURE );

}

strcpy( sbuf, "NewAgent 0 not_msg" );

printf("Agent Start\n");

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

printf("Agent get %s\n", rbuf );

while(1){

sleep(10);

printf("Agent get %s\n", rbuf );

sprintf( sbuf, "NewAgent %s Hi_Client_from_Agent!", rbuf );

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

}     

name_close( fd );

return 0;     

}