Explique sucintamenteparaque serve cada função pthread_* usada no servidor TCPmtechod.

pthread_attr_init(&ta);

Inicializa o atributo do tipo thread (ta) com um valor default (PTHREAD_CREATE _JOINABLE).

pthread_attr_setdetachstate(&ta,PTHREAD_CREATE_DETACHED);

Seta o atributo do tipo thread (ta) para outro valor (PTHREAD_CREATE _DETACHED).

Nesse estado setado, os recursos da thread são imediatamente liberados quando ela termina, mas a função pthread_join não pode ser usada para sincronizar o termino de uma thread.

pthread_mutex_init(&stats.st_mutex, 0);

Mutex é um dispositivo do sistema operacional que controla o compartilhamento de estrutura de dados que são acessados por várias linhas de execução (threads ou processos), bloqueando a alteração dessa estrutura por várias threads ao mesmo tempo, perdendo a integridade dos dados. Esa função inicializa um novo mutex do tipo pthread_mutex_t que está presente na estrutura de dados stats e por uma constante que indentifica o atributo do objeto do tipo mutex.

pthread_mutex_lock(&stats.st_mutex);

Bloqueia via mutex o acesso a estrutura de dados stats, assim, somente o thread que fez o bloqueio consegue alterar dados nessa estrutura.

pthread_mutex_unlock(&stats.st_mutex);

Desbloqueia via mutex o acesso a estrutura de dados stats, assim, qualquer thread pode alterar dados dessa estrutura.

pthread_create(&th, &ta, (void * (*)(void *))prstats, 0) < 0)

Cria uma nova thread (linha de execução). O atual processo passa a ter mais de uma linha de execução. O primeiro parametro é do tipo (pthread_t), o segundo parametro são os atributos dessa thread a ser criada, o terceiro parametro é a função que a thread passa a executar (prstats) e o último parametro é usado para o inicio da thread.

Algumas funções de biblioteca não são thread safe. O que isso significa? Dê um exemplo de função que se enquadra nessa categoria. É possível a várias linhas de execução (threads) de um mesmo processo usar esse tipo de funções? Como?

Thread-safe descreve uma parte ou rotina de um programa que pode ser chamada por multiplas linhas de um programa sem garantia de interação entre elas. Siginifica que uma thread não interfirar em dados de uma outra.

Apresente vantagens e desvantagens de construir servidores usando um único processo com várias linhas de execução (como, p.ex. TCPmtechod) com relação a usar vários processos, cada um com uma única linha de execução (como, p. ex., TCPechod).

A vantagem de se contruir um servidor com um processo e várias threads é o compartilhamento de variáveis entre as threads do mesmo processo, não precisando compartilhar estrutura de dados.

Mas, isso depende muito da implementação do servidor, pois, pode ser mais útil compartilhar especificamente alguns dados (como em processos) do que compartilhar todos (como em thread). No uso de processos, pode-se compartilhar dados especificos (não todos), usando memória compartilhada, entre outros.

A implementação do linux não diferente do ponto de vista interno uma thread de um processo (na sua criação / escalonamento), a única diferença mesmo é que a thread compartilha o mesmo segmento de dados do seu processo, ao contrário da dos processos.

As vantagens/desvantagens variam de acordo com a implementação / necessidade do código.

O servidor TCPmechod implementa concorrência aparente usando uma única linha de execução. Em que circunstâncias essa abordagem é melhor que as duas apresentadas anteriormente (concorrência real com vários processos, cada um com uma única linha de execução ou concorrência real um único processo com várias linhas de execução) ?

2005-09-20T10:19:19