




























































































Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Programação Concorrente com Pthreads
Tipologia: Notas de estudo
1 / 280
Esta página não é visível na pré-visualização
Não perca as partes importantes!





























































































Celso Maciel da CostaCelso Maciel da Costa^ Celso Maciel da CostaCelso Maciel da Costa
Plano do LivroPlano do LivroPlano do LivroPlano do Livro
Este livro é indicado para os cursos de graduação da área de computação e informática que possuem disciplinas de Sistemas Operacionais, especialmente os cursos de Ciência da Computação, Sistemas de Informação, Engenharia de Computação e Licenciatura em Computação. Também poderá ser usado como texto básico em disciplinas de Sistemas Operacionais e Programação Concorrente nos cursos de Pós-Graduação (Especialização, Mestrado e Doutorado).
Para o ensino de Programação Concorrente, devem ser estudados os capítulos 3, 5 e o anexo dedicado à biblioteca Pthreads.
O livro é formado por nove capítulos e um anexo. Cada capítulo se encerra com uma relação de exercícios. Nos capítulos que contém programas, todos estão escritos em C. Os programas concorrentes são escritos em C e com a biblioteca Pthreads.
Os sistemas operacionais Linux e Windows NT são estudados ao longo do livro. Para isso, sempre que pertinente, após a descrição dos aspectos conceituais referentes a um determinado tópico, são apresentadas, como estudo de caso, as soluções implementadas nos sistemas operacionais Linux e Windows NT.
O termo Windows NT utilizado ao longo do texto engloba uma família de sistemas, baseada no Windows NT, desde a primeira versão, NT 3.1 de 1993, até NT 6.0 de 2007, conhecido como Windows Vista.
O livro possui um anexo, dedicado à Programação Concorrente com Pthreads. Neste anexo são apresentados o protótipo e a semântica das principais primitivas de programação que permitem o gerenciamento (criação, destruição, ...) e a sincronização de threads. Exemplos de programas são apresentados, efetuando-se, desta forma, o estudo da interface de programação através de exemplos.
Com relação ao ensino, desde o final de seu curso de mestrado o Prof. Celso leciona disciplinas relacionadas a sistemas operacionais. Inicialmente, na UFRGS, nos anos de 1985 a 1994, e, atualmente, na PUCRS, a partir de
Na UFRGS lecionou disciplinas de Programação de Sistemas, de Sistemas Operacionais e de Projeto de Sistemas Operacionais nos cursos de graduação e de Pós-Graduação (Especialização e Mestrado). Na PUCRS leciona disciplinas de Sistemas Operacionais nos cursos de graduação (Sistemas de Informação, Ciência da Computação e Engenharia de Computação) e de Sistemas Distribuídos. Além disso, a partir de 1985, ministrou inúmeras palestras e seminários em sistemas operacionais e áreas relacionadas.
111 1 EvoluçãoEvoluçãoEvoluçãoEvolução eeee
FuncionamentoFuncionamentoFuncionamentoFuncionamento dosdosdosdos
Sistemas OperacionaisSistemas OperacionaisSistemas OperacionaisSistemas Operacionais
Este capítulo apresenta a evolução dos sistemas operacionais, a partir de suas origens. Serão apresentados também os objetivos, a descrição do funcionamento dos Sistemas Operacionais, a estruturação dos SO e o funcionamento das chamadas de sistema.
Sistemas operacionais são programas que controlam todos os recursos do computador e fornecem a base para o desenvolvimento dos programas de aplicação. É um gerenciador de recursos, responsável pela gerência do processador, pela gerência de memória, pela gerência de arquivos, pela gerência dos dispositivos de entrada e saída e pelos mecanismos de acesso aos dados. Os sistemas operacionais virtualizam todos os recursos de hardware que gerenciam, criando uma máquina virtual. Por exemplo, os usuários tratam com arquivos, que são entidades lógicas gerenciadas pelo sistema operacional. Uma operação de escrita em um arquivo será traduzida pelo sistema operacional em uma operação de gravação de dados no periférico, completamente transparente ao usuário. Monoprogramação e Multiprogramação
Nos sistemas operacionais monoprogramados existe um único programa de usuário em execução. Nos multiprogramados existem vários programas de usuário em execução simultânea. A figura a seguir mostra a organização de um sistema operacional monoprogramado. É formado por cinco componentes lógicos:
Fig. 1.1 - Sistema Operacional Monoprogramado
Gerenciador de Arquivos
Tratador de Interrupções
Seqüênciador de Programas
Programas de Usuários
Driver dos Dispositivos
máquinas não possuíam sistema operacional e era necessário programar diretamente o hardware. A figura 1.3, apresentada a seguir ilustra esses primeiros ambientes computacionais.
Fig. 1.3 – Primeiros sistemas computacionais
Nos primeiros sistemas computacionais, os programas eram escritos em assembler e tinham completo controle sobre a máquina. Cada usuário fazia a reserva de um determinado tempo de utilização do computador. Os problemas existentes eram significativos:
a) O usuário não conseguia terminar o seu trabalho no tempo reservado, o que poderia implicar em recomeçar a tarefa em uma nova data/hora; b) O usuário gastava muito do tempo reservado depurando o programa, com a máquina ociosa; c) O usuário terminava antes do tempo reservado o seu trabalho e a máquina permanecia ociosa até a chegada de um novo usuário; d) Somente um usuário por vez podia utilizar a máquina.
Uma solução empregada foi à adoção de um operador humano, com a função de receber os diferentes programas dos usuários, executá-los e entregar os resultados. Naturalmente que nem sempre os programas eram executados na
ordem em que eram recebidos, podendo esta ordem ser determinada por fatores políticos.
citados anteriormente. No entanto, a máquina continuava sendo monousuário e era executado um programa de cada vez. Além disso, a seqüência de execução era feita manualmente, pelo operador humano.
Outros problemas importantes existentes eram a necessidade de cada usuário desenvolver seus próprios drivers de acesso aos periféricos e as suas próprias rotinas, por exemplo, matemáticas.
Uma outra evolução, mais significativa, foi o desenvolvimento do conceito de monitor residente.
Um monitor residente é um pequeno núcleo concebido para fazer seqüenciamento automático da execução de programas. O monitor é formado, basicamente, pelos drivers de entrada e saída, por rotinas de biblioteca (reutilização de código), que possuem código de procedimentos e por um seqüenciador automático. O funcionamento do monitor é o seguinte:
Loop: carregar o código para execução; executar; go to Loop;
Com monitor residente, os programas e as diretivas (informações para o monitor de início de código, de início de dados, etc.) são perfurados em cartões (fig. 1.4 a seguir), e entregues pelo usuário para o operador humano para processamento, recebendo o resultado da execução posteriormente.
Os problemas existentes com monitor residente eram como saber a natureza do programa a executar, por exemplo, Cobol, Fortran ou Assembler, como distinguir um programa de outro e como distinguir código do programa dos dados. Uma solução para estes problemas foi à introdução do uso de cartões de controle, que fornecem ao monitor residente as informações necessárias à execução dos programas, como mostrado a seguir.
$JOB: indica o início de um programa; $FTN: indica que a linguagem é Fortran; $LOAD: indica que o programa deve ser carregado para a memória para execução;
$RUN: indica que o programa deverá ser executado; $DATA: indica início de dados; $EOJ: indica fim de programa. Com cartões de controle, o monitor residente possui as seguintes funcionalidades: Interpretar os cartões de controle, carregar os programas na memória, disparar a execução dos programas.
O monitor residente é um sistema operacional Batch monoprogramado, no qual o computador permanece ainda subutilizado, pois os programas são executados seqüencialmente.
Sistemas Operacionais Batch multiprogramados
Sistemas operacionais Batch multiprogramados representam uma evolução ao conceito de monitor residente apresentado anteriormente. Nestes sistemas, os programas de mesmas características são agrupados e executados em uma seqüência, sem a intervenção do operador, e vários programas são mantidos na memória ao mesmo tempo, sendo o tempo de CPU distribuído entre os programas residentes na memória.
Um exemplo de seqüência de programas a ser executado em um sistema operacional batch multiprogramado é o seguinte:
$JOB userName 1 ; identificar o usuário $FTN ; carregar o compilador Fortran cartão 1 ; cartões contendo o código do programa cartão 2
cartão n
$LOAD ; carregar o programa compilado $RUN ; executar o programa cartão de dados 1 ; cartões de dados cartão de dados 2
cartão de dados n $EOJ ; final do programa $JOB userName 2 ; identifica o usuário $FTN ; carregar o compilador Fortran cartão 1 ; cartões contendo o código do programa cartão 2
cartão n $LOAD ; carregar o programa compilado $RUN ; executar o programa cartão de dados 1 ; cartões de dados cartão de dados 2
cartão de dados n $EOJ ; final do programa
usuários, simultaneamente, um em cada terminal, podem fazer uso da máquina. Os componentes de um sistema operacional de tempo compartilhado são os mesmos de um sistema operacional multiprogramado. Porém, o seqüenciamento de execução é feito por um interpretador de comandos, que possui a função de interagir com o usuário.
Sistemas Operacionais de Tempo real
Sistemas operacionais de tempo real são usados para controlar um dispositivo em uma aplicação dedicada, tais como controle de experimentações científicas, imagens médicas, controle de um processo industrial, na robótica, na aviação, etc. Em muitos destes sistemas, sensores coletam dados que são enviados ao computador, os dados são analisados e é executada uma ação, correspondente ao tratamento do sinal recebido e são enviados sinais de resposta.
A principal característica dos sistemas de tempo real é que existe uma restrição temporal, que implica na necessidade do sistema em garantir uma resposta atendendo os requisitos de tempo.
Os sistemas operacionais de tempo real podem ser classificados como
caracterizado pela necessidade responder a um evento, de uma certa forma, em um intervalo de tempo determinado, sob pena de que uma falha grave poderá ser provocada se isso não ocorrer. Este intervalo de tempo representa o deadline no qual uma resposta necessita ser gerada pelo sistema. Por exemplo, sensores colocados em um automóvel são capazes de detectar a faixa branca pintada nas laterais de uma estrada, gerar um sinal que será interpretado pelo sistema operacional que deverá sinalizar a ocorrência deste evento e será gerado, por exemplo, um sinal sonoro, de alerta ao motorista. Se o sinal sonoro não for acionado em um período determinado de tempo, um acidente poderá ocorrer. Existe, portanto, um intervalo de tempo determinado em que o sistema deverá responder a ocorrência do evento.
as restrições de tempo não forem obedecidas a falha que ocorrerá não será catastrófica, por exemplo, sistemas multimídia.
Um sistema operacional de tempo real possui tarefas que serão executadas quando da ocorrência dos eventos aos quais estão associadas. O componente fundamental de tal sistema é o escalonador de tarefas, que via de regra é acionado por uma interrupção disparada em um intervalo de tempo específico (ex. 20 ms). As tarefas possuem uma prioridade e o escalonador atribui o processador a tarefa de maior prioridade, garantindo o cumprimento dos deadlines de atendimento.
Um aspecto que deve ser ressaltado é que atualmente existem inúmeras aplicações de tempo real que necessitam de outros componentes, tais como drivers de rede, interface gráfica, etc. Estas necessidades são típicas de sistemas operacionais de uso geral, mas cada vez mais estão se tornando necessárias para aumentar as funcionalidades dos sistemas de tempo real. Pelas suas características, um sistema operacional de uso geral somente poderá ser utilizado para uma aplicação de tempo real que não possua deadlines críticos.
Sistemas Operacionais de Rede
Um sistema operacional de rede pode ser visto como sendo formada por um conjunto de máquinas interligadas por uma rede de comunicação, cada uma rodando o seu próprio sistema operacional e compartilhando recursos, por exemplo, um servidor de impressão. O acesso remoto a uma outra máquina se faz explicitamente, com comandos de login remoto. Além disso, o usuário necessita conhecer a localização dos arquivos e executar operações específicas para movê-los de uma máquina para outra.
Um sistema operacional de rede pode ser construído a partir de um sistema operacional tradicional, com a incorporação de um conjunto de funções que permitem a comunicação entre os diferentes processadores e o
O NFS suporta sistemas heterogêneos e possui um bem definido protocolo cliente/servidor. A operação “ mount” retorna um V-Node, que é um identificador de arquivo válido na rede. As operações read e write são executadas independente da localização física do arquivo e transparente ao usuário. Uma máquina é cliente NFS se ela monta ou “ importa” arquivos ou diretórios. Uma máquina é servidora se ela “ exporta” arquivos ou diretórios (figura abaixo).
Operações sobre arquivos
Virtual File System
Local Distante
RPC Call
RPC reply
Fig. 1.5 - Visão Geral do funcionamento do NFS
Um sistema pode ser cliente e servidor, unicamente cliente, unicamente servidor, uma máquina servidora pode ter várias máquinas clientes e uma máquina pode ser cliente de vários servidores.
O funcionamento do NFS é centrado no VFS, que possui as seguintes características:
o É Implementado no núcleo do sistema; o Permite acesso a diferentes tipos de sistema de arquivos (Unix, DOS,..); o A cada sistema de arquivos montado corresponde uma estrutura VFS no núcleo; o O sistema de arquivos virtual é mapeado no sistema de arquivos real se o arquivo é local.
A figura a seguir apresenta a arquitetura do NFS.
Cliente Servidor
Importa Exporta
Fig. 1.6 - Visão Geral do NFS