Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Programação Concorrente com Pthreads, Notas de estudo de Informática

Programação Concorrente com Pthreads

Tipologia: Notas de estudo

2012

Compartilhado em 01/04/2012

alessandro-rezende-12
alessandro-rezende-12 🇧🇷

4.5

(2)

15 documentos

1 / 280

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Sistemas
Operacionais
Programação Concorrente com Pthreads
Celso Maciel da Costa
Celso Maciel da CostaCelso Maciel da Costa
Celso Maciel da Costa
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c
pf4d
pf4e
pf4f
pf50
pf51
pf52
pf53
pf54
pf55
pf56
pf57
pf58
pf59
pf5a
pf5b
pf5c
pf5d
pf5e
pf5f
pf60
pf61
pf62
pf63
pf64

Pré-visualização parcial do texto

Baixe Programação Concorrente com Pthreads e outras Notas de estudo em PDF para Informática, somente na Docsity!

Sistemas

Operacionais

Programação Concorrente com Pthreads

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.

SumárioSumárioSumárioSumário

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.

1.11.11.11.1 Evolução dos Sistemas OperacionaisEvolução dos Sistemas OperacionaisEvolução dos Sistemas OperacionaisEvolução dos Sistemas Operacionais

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:

  • Tratador de Interrupções: software do SO responsável pelo tratamento das interrupções;
  • Drivers dos dispositivos: responsáveis pela execução das operações de entrada e saída. Existe um driver para cada classe de periférico;
  • Gerenciador de Arquivos: responsável pela implementação do sistema de arquivos, permitindo ao usuário o armazenamento e a recuperação de informações.
  • Seqüenciador de programas: módulo que, ao término da execução de um programa, faz com que o sistema passe a executar um novo programa;
  • Programas de usuários: representa o programa em execução. Existe um único programa de usuário na memória. Ao término da execução, um outro programa será carregado pelo seqüenciador de programas e passará a ser executado.

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.

O emprego de um operador humano eliminava os problemas a, b, e c,

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;

“ comandos da linguagem de programaçã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

Hard real-time system ou Soft real-time system. Um Hard real-time system é

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.

Soft real-time system são sistemas dedicados a aplicações nas quais se

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