Создание профайлинг-лога сильно ухудшает производительность, подобно созданию лога трассировки, потому что надо описать прохождение каждой строчки. Поэтому на серверах, где нужна повышенная производительность, использовать профайлинг не рекомендуется. Однако существуют случаи , когда профайлинг необходимо запустить на реальной работающей системе системе.
Профайлинг позволяет узнать о состоянии системы в процессе выполнения программ, определить, какие программы выполнялись в заданный промежуток времени, сколько времени выполнялась та или иная функция или строчка в программе, состояние процессов в системе, временной анализ их взаимодействия, загруженность процессора
Рис. Пример профайлинга
Рис. Пример профайлинга
Временной анализ приложений (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;
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.