2 \usepackage[utf8
]{inputenc}
3 \usepackage[T1]{fontenc}
5 \usepackage[portuguese
]{babel
}
7 %\title{Trabalho Prático 2}
8 %\author{Kauê Soares da Silveira - 171671}
11 \autor{Kauê Soares da Silveira \\
171671} %\and
12 \instituicao{Universidade Federal do Rio Grande do Sul
}
13 \orientador[Professor:
]{Alexandre Carissimi
}
14 \titulo{Trabalho Obrigatório
2: Comparação de Mecanismos de Comunicação
}
15 \comentario{INF01151 - Sistemas Operacionais II N
}
25 O objetivo do trabalho é analisar a facilidade de implementação, uso e desempenho dos mecanismos de comunicação UDP / TCP, RPC e RMI. Para isto, foram implementadas diferentes versões de dois serviços (null e sort, descritos a seguir), uma para cada um dos mecanismos.
27 O serviço null é um serviço que não faz nada. Não recebe argumentos de entrada e não retorna resultado para o cliente
\footnote{Na realidade o serviço implementado não foi exatamente esse, ver Cap.
\ref{problemas
}}.
29 Já o serviço sort recebe um vetor de
250 inteiros inicializado com a identidade e tem por objetivo ordená-lo em ordem descrescente. O vetor resultado é então retornado.
31 \chapter{Metodologia Empregada
} \label{secmet
}
33 Cada medição de tempo foi feita através da média de
1000 repetições. Este processo foi efetuado
30 vezes, para cada forma de comunicação abordada, com intervalos de
1 minuto para garantir o encerramento das conexões TCP, obtendo-se a média e o desvio padrão, e permitindo calcular o intervalo de confiança (Tab.
\ref{tabconf
}).
35 Para os serviços utilizando o protocolo TCP, foi considerado o tempo de estabelecimento e encerramento da conexão, assim como o tempo da requisição em si.
37 Todos os clientes / servidores foram escritos na linguagem de programação C, exceto os referentes ao mecanismo RMI, os quais foram escritos na linguagem Java.
39 \chapter{Descrição da Plataforma Experimental
}
42 \item[Sistema Operacional
] (uname -a): Linux gabriela
2.6.31-
19-generic \
#56-Ubuntu SMP Thu Jan
28 01:
26:
53 UTC
2010 i686 GNU/Linux
43 \item[Processador
] (cat /proc/cpuinfo):
45 \item[model name
] : AMD Athlon(tm)
64 Processor
3000+
46 \item[cpu MHz
] :
1999.843
47 \item[cache size
] :
512 KB
49 \item[Memória
] (cat /proc/meminfo):
51 \item[MemTotal
] :
509012 kB
53 \item[Conexão
] :
100 mbps
54 \item[JVM
] : java version "
1.6.0\_0"; OpenJDK Runtime Environment (IcedTea6
1.6.1) (
6b16-
1.6.1-
3ubuntu
3); OpenJDK Server VM (build
14.0-b16, mixed mode).
57 \item[Target
]: i486-linux-gnu
58 \item[Thread model
]: posix
59 \item[gcc version
]:
4.4.1 (Ubuntu
4.4.1-
4ubuntu
9)
64 \item[Sistema Operacional
] (uname -a):
65 Linux liana
2.6.31-
19-generic \
#56-Ubuntu SMP Thu Jan
28 01:
26:
53 UTC
2010 i686 GNU/Linux
66 \item[Processador
] (cat /proc/cpuinfo):
68 \item[model name
] : Intel(R) Core(TM)
2 Duo CPU E7200 @
2.53GHz
69 \item[cpu MHz
] :
1596.000
70 \item[cache size
] :
3072 KB
72 \item[Memória
] (cat /proc/meminfo):
74 \item[MemTotal
] :
2058944 kB
76 \item[Conexão
] :
100 mbps
77 \item[JVM
] : java version "
1.6.0\_0"; OpenJDK Runtime Environment (IcedTea6
1.6.1) (
6b16-
1.6.1-
3ubuntu
3); OpenJDK Server VM (build
14.0-b16, mixed mode).
80 \item[Target
]: i486-linux-gnu
81 \item[Thread model
]: posix
82 \item[gcc version
]:
4.4.1 (Ubuntu
4.4.1-
4ubuntu
9)
88 \section{Facilidade de Implementação
}
89 Sockets tcp e udp estão num nível mais baixo de abstração, o que faz com sejam de implementação mais difícil e mais sujeita a erros. Já o RPC, por estar num nível de abstração um pouco mais alto, também é um pouco mais fácil de implementar. Seguindo esta mesma linha de raciocínio, RMI é o mecanismo com nível de abstração mais elevado e também o mais fácil de ser implementada.
91 \section{Facilidade de Uso
}
92 A classificação quanto á facilidade apresenta os mesmos critérios supramencionados, sendo RMI o mais fácil de utilizar, seguido do RPC, ficando por último as sockets TCP e UDP.
99 \begin{tabular
}{|l|ccc|
}
101 nome & média & desvio padrão & intervalo de
95\% de confiança para a média \\
104 &
36.50 &
12.30 &
[32.10,
40.90] \\
106 &
39.25 &
14.01 &
[34.24,
44.26] \\
108 &
11.85 &
2.29 &
[11.03,
12.67] \\
110 &
13.38 &
2.83 &
[12.36,
14.39] \\
112 &
220.25 &
104.33 &
[182.94,
257.56] \\
114 &
53.75 &
23.93 &
[45.19,
62.31] \\
116 &
232.00 &
97.64 &
[197.08,
266.92] \\
118 &
60.50 &
17.38 &
[54.28,
66.72] \\
120 &
349.00 &
53.20 &
[329.97,
368.03] \\
122 &
821.75 &
53.06 &
[802.77,
840.73] \\
126 \caption{Média, Desvio Padrão e Intervalo de Confiança de cada um dos métodos (em ns.)
}
130 \section{Comparação Qualitativa
}
135 \begin{tabular
}{|l|cccc|
}
137 nome & facilidade de uso & facilidade de implementação & nível de abstração & desempenho \\
139 udp / tcp & baixa & baixa & baixo & alto \\
140 rpc & média & média & médio & médio \\
141 rmi & alta & alta & alta & baixo \\
144 \caption{Comparação qualitativa das abordagens
}
150 Como espeficicado na tabela, facilidade de uso, de implementação e nível de abstração estão intimamente relacionados, e são inversamente proporcionais ao desempenho. A escolha por um ou outro método vai depender da linguagem que se pretende usar e do grau de desempenho implicado pelo domínio da aplicação que se deseja programar.
152 Comparando tcp com udp, é possível perceber que a segunda apresenta uma média de tempo de execução
30\% menor, o que é de se esperar, visto que não é um protocolo orientado à conexão (diferentemente do tcp), e portanto acaba apresentando um overhead de execução menor.
154 Já comparando os desempenhos dos serviços null e sort, podemos ver que o aumento no tempo de execução ficou entre
10 e
20\%, a não ser no caso de RMI em que este aumento foi de mais de
100\%. Isso nos mostra que o tempo para ordenar um vetor de
250 elementos não foi significante em relação ao tempo necessário para a comunicação em si, exceto no RMI, em que a manipulação de vetores realmente se mostrou bastante onerosa comparada com a comunicação.
156 \chapter{Principais Problemas Encontrados
}
158 Funções send (respectivamente, recv) do TCP / UDP precisam enviar (respectivamente, receber) algum dado, ou seja, não é possível implementar um servidor NULL exatamente da forma como foi especificado. Em vista disso, mas ainda com a finalidade de minimizar a comunicação, foi utilizado um parâmetro do tipo char, tanto para a chamada quanto para o retorno. Afim de preservar a justiça das comparações, parâmetros semelhantes foram utilizados nas outras implementações do serviço NULL.
160 O protocolo TCP prevê um status TIMED
\_WAIT após o pedido de término da execução e antes que esta seja efetivamente terminada. Isso gera problemas com testes automatizados de alta carga, pois eventualmente ocorre excesso de conexões e estas começam a ser recusadas. Para evitar este problema, foram introduzidas paradas periódicas de um minuto, como explicado no capítulo sobre a metodologia empregada (Cap.
\ref{secmet
}).
162 A escassez de documentação sobre o Java RMI fez com que houvessem alguns problemas nas implementações referentes ao mesmo, principalmente em relação ao CLASSPATH (as classes "stub"
{} não eram "enxergadas"
{} por cliente e servidor ao mesmo tempo). Problema resolvido após algumas tentativas, modificando a hierarquia dos arquivos das classes e reiniciando o rmiregistry.
166 Os diferentes mecanismos de comunicação de processos tem suas vantagens e desvantagens, assim como aplicações onde seu uso é mais ou menos adequado. Alguns dos aspectos mais relevantes destes mecanismos foram aqui comparados (facilidade de implementação, uso e desempenho).
168 Porém, existem outras características que devem consideradas, tais como tolerância à falhas e segurança, pois estas também têm grande importância.
170 É fundamental termos em mente todos estes aspectos para poder decidir com confiança qual dos mecanismos é o mais adequado para nosso software, levando em consideração o contexto em que este estará executando.