Lista de exercícios – Linguagens de Programação II (LPII) Professor: Carlos Eduardo Batista 1) O que é programação concorrente? Quais são os aspectos a serem observados quando do planejamento de sistemas que utilizam processos concorrentes? Dica: Definir concorrência, e explicar como se aplica ao desenvolvimento de sistemas de software. Ver motivação de uso de programação concorrente e fazer o elo com a evolução dos sistemas operacionais e processadores. 2) Estabeleça uma relação entre os tipos de computadores paralelos e a taxonomia de Flynn. Dica: Definir quais conceitos utilizados para a taxonomia de Flynn se aplicam aos tipos de computadores paralelos estudados. 3) Explique (à luz da programação concorrente): a) Consistência de cache b) Consistência de processador c) Consistência de liberação 4) O que é computabilidade? Como a definição do uso de programação concorrente pode impactar na análise de computabilidade de um determinado problema? Dica: Definir computabilidade e estabelecer um elo com as questões de manutenção da integridade das informações que compõe os estados da execução de um sistema (contexto de todos os processos, realização da lógica proposta etc.) 5) O que é um processo? Quais são as informações que compreendem o contexto de um processo? Dica: Definir processo. Explicar quais informações devem ser armazenadas em memória para a existência do processo e ventilar para que servem os principais itens do contexto do processo. 6) Como é feita a gestão do ciclo de vida de processos? Quais os estados e transições possíveis? Dica: Explicar que existem chamadas de sistema para a gerência do ciclo de vida de processos; explicar estados e transições. 7) Como pode ser feita a inicialização e finalização de processos em C (em sistemas POSIX)? Cite exemplos de funções utilizadas para a gerência do ciclo de processos e explique brevemente como essas funções são implementadas. Dica: Citar que existem funções para isso e dar exemplos (fork, exit, kill, exec etc.); explicar as funções citadas e brevemente descrever o processo de invocação de chamadas de sistema para cada uma delas. 8) Descreva as propriedades de Safety e Liveness e porque elas são importantes no âmbito do desenvolvimento de programas concorrentes. 9) Quais características devem ser consideradas para paralelização de um conjunto de instruções (paralelizar um algoritmo). Discutir quais as possibilidades de “entrelaçamento” de instruções, ou seja, estabelecer situações onde a ordem das instruções sendo executadas em paralelo importa, situações onde há o acesso a seções críticas (compartilhamento de recursos) etc. 10) Explique os dois principais mecanismos utilizados para sincronização de processos concorrentes (exclusão mútua e sincronização condicional). 11) O que é o problema da seção crítica? Dê exemplos de situações onde tal problema acontece e cite formas de se contornar este problema. 12) Explique as seguintes propriedades necessárias para o acesso a seção crítica: a) Exclusão mútua b) Ausência de deadlock (definir deadlock) c) Ausência de atraso desnecessário d) Entrada eventual 13) Explique o que são locks (travas) e dê um exemplo de código (código em C/C++ ou pseudocódigo) do uso de locks para solução do problema da seção crítica. 14) Explique o que são barreiras, como podem ser utilizadas para realizar o sincronismo entre diferentes processo e dê um exemplo de uso em código (C/C++ ou pseudocódigo).