PROGRAMAÇÃO CONCORRENTE

Tamanho: px
Começar a partir da página:

Download "PROGRAMAÇÃO CONCORRENTE"

Transcrição

1 PROGRAMAÇÃO CONCORRENTE A programação concorrente foi usada inicialmente na construção de sistemas operacionais. Atualmente, ela é usada para desenvolver aplicações em todas as áreas da computação. Este tipo de programação tornou-se ainda mais importante com o advento dos sistemas distribuídos e das máquinas com arquitetura paralela. Neste capítulo serão apresentados os conceitos básicos e os mecanismos clássicos da programação concorrente. Maiores detalhes podem ser encontrados no livro [TOS03]. 1 Definição A grande maioria dos programas escritos são programas seqüenciais. Nesse caso, existe somente um fluxo de controle (fluxo de execução, linha de execução, thread) no programa. Isso permite, por exemplo, que o programador realize uma "execução imaginária" de seu programa apontando com o dedo, a cada instante, o comando que está sendo executada no momento. Um programa concorrente pode ser visto como se tivesse vários fluxos de execução. Para o programador realizar agora uma "execução imaginária", ele vai necessitar de vários dedos, um para cada fluxo de controle. O termo "programação concorrente" vem do inglês concurrent programming, onde concurrent significa "acontecendo ao mesmo tempo". Uma tradução mais adequada seria programação concomitante. Entretanto, o termo programação concorrente já está solidamente estabelecido no Brasil. Algumas vezes é usado o termo programação paralela com o mesmo sentido. É comum em sistemas multiusuário que um mesmo programa seja executado simultaneamente por vários usuários. Por exemplo, um editor de texto. Entretanto, ter 10 execuções simultâneas do editor de texto não faz dele um programa concorrente. O que se tem são 10 processos independentes executando o mesmo programa seqüencial (compartilhando o mesmo código). Cada processo tem a sua área de dados e ignora a existência das outras execuções do programa. Esses processos não interagem entre si (não trocam informações). Um programa é considerado concorrente quando ele (o próprio programa, durante a sua execução) origina diferentes processos. Esses processos, em geral, irão interagir entre si. 2 Motivação A programação concorrente é mais complexa que a programação seqüencial. Um programa concorrente pode apresentar todos os tipos de erros que aparecem nos programas seqüenciais e, adicionalmente, os erros associados com as interações entre os processos. Muitos erros dependem do exato instante de tempo em que o escalonador do sistema operacional realiza um chaveamento de contexto. Isso torna muitos erros difíceis de reproduzir e de identificar. Apesar da maior complexidade, existem muitas áreas nas quais a programação concorrente é vantajosa. Em sistemas nos quais existem vários processadores (máquinas paralelas ou sistemas distribuídos), é possível aproveitar esse paralelismo e acelerar a execução do programa. Mesmo em sistemas com um único processador, existem razões para o seu uso em vários tipos de aplicações. PROGRAMAÇÃO CONCORRENTE Prof. Simão Toscani 1

2 Considere um programa que deve ler registros de um arquivo, colocar em um formato apropriado e então enviar para uma impressora física (em oposição a uma impressora lógica ou virtual, implementada com arquivos). Podemos fazer isso com um programa seqüencial que, dentro de um laço, faz as três operações (ler, formatar e imprimir registro). Arq u iv o Pro ce s s o Im p re s s o ra fís ica Figura 1 - Programa seqüencial acessando arquivo e impressora. Inicialmente o processo envia um comando para a leitura do arquivo e fica bloqueado. O disco então é acionado para realizar a operação de leitura. Uma vez concluída a leitura, o processo realiza a formatação e inicia a transferência dos dados para a impressora. Como trata-se de uma impressora física, o processo executa um laço no qual os dados são enviados para a porta serial ou paralela apropriada. Como o buffer da impressora é relativamente pequeno, o processo fica preso até o final da impressão. O disco e a impressora nunca trabalham simultaneamente, embora isso seja possível. É o programa seqüencial que não consegue ocupar ambos. Vamos agora considerar um programa concorrente como o mostrado na figura 2 para realizar a impressão do arquivo. Dois processos dividem o trabalho. O processo leitor é responsável por ler registros do arquivo, formatar e colocar em um buffer na memória. O processo impressor retira os dados do buffer e envia para a impressora. É suposto aqui que os dois processos possuem acesso à memória onde está o buffer. Este programa é mais eficiente, pois consegue manter o disco e a impressora trabalhando simultaneamente. O tempo total para realizar a impressão do arquivo vai ser menor. Arq u i v o Pro ce s s o L e i to r B u ffe r Pro ce s s o Im p re s s o r Im p re s s o ra fís i ca Figura 2 - Programa concorrente acessando arquivo e impressora. O uso da programação concorrente é natural nas aplicações que apresentam paralelismo intrínseco, ditas aplicações inerentemente paralelas. Nessas aplicações pode-se distinguir facilmente funções para serem realizadas em paralelo. Este é o caso do spooling de impressão, exemplo que será apresentado a seguir. Pode-se dizer que, em geral, a programação concorrente tem aplicação natural na construção de sistemas que tenham de implementar serviços que são PROGRAMAÇÃO CONCORRENTE Prof. Simão Toscani 2

3 requisitados de forma imprevisível [DIJ65]. Nesse caso, o programa concorrente terá um processo para realizar cada tipo de serviço. A seguir é considerado um servidor de impressão para uma rede local. A figura 3 ilustra uma rede local na qual existem diversos computadores pessoais (PC) utilizados pelos usuários e existe um computador dedicado ao papel de servidor de impressão. O servidor usa um disco magnético para manter os arquivos que estão na fila de impressão. PC PC PC Usuários Servidor de Impressão Figura 3 - Rede local incluindo um servidor de impressão dedicado. É importante observar que o programa "servidor de impressão" possui paralelismo intrínseco. Ele deve: (1) receber mensagens pela rede; (2) escrever em disco os pedaços de arquivos recebidos; (3) enviar mensagens pela rede (contendo, por exemplo, respostas às consultas sobre o seu estado); (4) ler arquivos previamente recebidos (para imprimí-los); (5) enviar dados para a impressora. Todas essas atividades podem ser realizadas "simultaneamente". Uma forma de programar o servidor de impressão é usar vários processos, cada um responsável por uma atividade em particular. Obviamente, esses processos vão precisar trocar informações para realizar o seu trabalho. A figura 4 mostra uma das possíveis soluções para a organização interna do programa concorrente "servidor de impressão". Cada círculo representa um processo. Cada flecha representa a passagem de dados de um processo para o outro. Essa passagem de dados pode ser feita, por exemplo, através de variáveis que são compartilhadas pelos processos envolvidos na comunicação. Vamos agora descrever a função de cada processo. O processo "Receptor" é responsável por receber mensagens da rede local. Ele faz isso através de chamadas de sistema apropriadas e descarta as mensagens com erro. As mensagens corretas são então passadas para o processo "Protocolo". Ele analisa o conteúdo das mensagens recebidas à luz do protocolo de comunicação suportado pelo servidor de impressão. É possível que seja necessário a geração e o envio de mensagens de resposta. O processo "Protocolo" gera as mensagens a serem enviadas e passa-as para o processo "Transmissor", que as envia através de chamadas de sistema apropriadas. Algumas mensagens contêm pedaços de arquivos a serem impressos. É suposto aqui que o tamanho das mensagens tenha um limite (alguns Kbytes). Dessa forma, um arquivo deve ser dividido em várias mensagens para transmissão através da rede. Quando o processo "Protocolo" identifica uma mensagem que contém um pedaço de arquivo, ele passa esse pedaço de arquivo para o processo "Escritor". Passa também a identificação do arquivo ao qual o pedaço em questão pertence. Cabe ao processo "Escritor" usar as chamadas de sistema apropriadas para escrever no disco. Quando o pedaço de arquivo em questão é o último de seu arquivo, o processo "Escritor" passa para o processo "Leitor" o nome do arquivo, que está pronto para ser impresso. PROGRAMAÇÃO CONCORRENTE Prof. Simão Toscani 3

4 Receptor Transmissor Protocolo Escritor Leitor Impressor Figura 4 - Servidor de impressão como programa concorrente. O processo "Leitor" executa um laço no qual ele pega um nome de arquivo, envia o conteúdo do arquivo para o processo "Impressor" e então remove o arquivo lido. O envio do conteúdo para o processo "Impressor" é feito através de um laço interno composto pela leitura de uma parte do arquivo e pelo envio dessa parte. Finalmente, o processo "Impressor" é encarregado de enviar os pedaços de arquivo que ele recebe para a impressora. O relacionamento entre os processos "Leitor" e "Escritor" foi descrito antes, no início desta seção. O servidor de impressão ilustra o emprego da programação concorrente na construção de uma aplicação com paralelismo intrínseco. O resultado é uma organização interna clara e simples para o programa. Um programa seqüencial equivalente seria certamente menos eficiente. O restante deste capítulo é dedicado aos problemas e às técnicas existentes para a construção de programas concorrentes como esse. Hoje em dia existem várias linguagens que permitem construir programas concorrentes (Java, Ada, Pascal Concorrente, C estendido com bibliotecas para concorrência, etc.). Aqui será utilizada uma linguagem apropriada para ensino, denominada Vale4 (V4) [TOS04]. 3 Especificação do paralelismo Para construir um programa concorrente, antes de mais nada, é necessário ter a capacidade de especificar o paralelismo dentro do programa. Essa especificação pode ser feita de diversas maneiras. Uma delas utiliza os comandos fork, quit e join [CON63]. Outras maneiras serão apresentadas na seção 4. O comando (ou função) fork pode ser implementado de duas maneiras distintas: ele pode criar um novo processo ou criar apenas um novo fluxo de execução dentro de um processo já existente. A função fork retorna um número inteiro que é a identificação do novo processo ou do novo fluxo criado. Um fluxo de execução também é denominado linha de execução ou thread. PROGRAMAÇÃO CONCORRENTE Prof. Simão Toscani 4

5 Os comandos quit e join são auxiliares ao fork. Quando o comando quit é executado, o processo (ou thread) que o executa termina imediatamente. O comando join(id) bloqueia quem o executa até que termine o processo (ou thread) identificado por id. Primitiva fork no sistema Unix No sistema operacional Unix a operação fork cria um novo processo que é uma cópia idêntica (clone) do processo que executa esta operação. Por exemplo, o comando id = fork() cria um filho idêntico ao processo que executou a operação (isto é, cria uma cópia do processo original). O processo filho recebe cópias das variáveis do processo pai, bem como dos descritores de arquivos. Os valores iniciais das variáveis do filho são iguais aos valores das variáveis correspondentes do pai no momento da execução da função fork. Observe que não há compartilhamento de variáveis: as variáveis do pai ficam no espaço de endereçamento 1 do pai e as variáveis do filho, no espaço de endereçamento do filho. Em relação aos valores dessas variáveis, a única diferença inicial entre o pai e o filho é o valor da variável id, que é 0 para o filho e é o valor de retorno da função fork para o pai. O valor de retorno é o número de identificação do processo criado (process identification ou pid). Isto permite que os processos prossigam de acordo com suas identidades. Normalmente, o comando seguinte ao fork tem a seguinte forma: if id = 0 then { processamento do filho } else { processamento do pai } Um dos processos, por exemplo o filho, pode sobrepor um novo código sobre si, através da operação exec(p), onde P é um novo programa para ser executado (novo segmento de código e de dados para o processo). Fork, join e quit na linguagem Vale4 Na linguagem Vale4, o funcionamento do comando fork é similar ao do Unix, porém com uma grande diferença: o fork cria uma thread e não um processo. As threads mãe e filha são idênticas: executam o mesmo código e compartilham todas as variáveis do processo em que são definidas (é justamente nesse compartilhamento que está a diferença para o Unix). Na linguagem V4, a execução do comando id := fork() faz com que a variável global 2 id receba o valor retornado pela função fork, que é o número único 1 Basicamente, o espaço de endereçamento de um processo é formado por um segmento de código e um segmento de dados. O primeiro contém as instruções do processo e o segundo contém as variáveis e constantes do processo. Além disso, todo processo possui uma pilha que é usada para chamadas e retornos de procedimentos. 2 Variável declarada no processo hospedeiro, compartilhada entre mãe e filha. PROGRAMAÇÃO CONCORRENTE Prof. Simão Toscani 5

6 da thread criada. A thread original (mãe) e a thread criada (filha) executam em paralelo a partir do comando que segue ao fork. As duas threads irão se distinguir através da variável denominada mynumber 3. O valor dessa variável é sempre a identificação de quem a refere (isto é, o número único de quem a refere). Tipicamente, o comando que segue ao fork tem a seguinte forma: if id = mynumber then { processamento da filha } else { processamento da mãe } Observe que apenas para a thread filha o mynumber é igual ao valor da variável global id. Para criar processos (não threads) dinamicamente, a linguagem V4 oferece o comando new que será apresentado na seção que segue. Enquanto o comando fork cria uma nova thread, o comando new cria um novo processo. O comando join(id) permite que um processo (ou thread) P espere pelo término do descendente imediato (filho ou filha) identificado por id. Se o argumento id não identifica um processo ou thread, ou se id não corresponde a um descendente imediato de P, então um erro é reportado (erro de execução). O argumento de join pode ser também a palavra reservada any, que significa o desejo de esperar pelo término de qualquer um dos descendentes imediatos. Nesse caso, no retorno da primitiva, a variável any 4 vai conter a identidade do filho ou filha cuja execução terminou. Outra peculiaridade da primitiva join(id) é que ela pode ser usada como função ou como subrotina. Usada como função, ela retorna o valor que o filho (ou filha) id especificou no comando quit, ao morrer, conforme é explicado a seguir. O último comando do conjunto é o quit, que mata o seu executor. Podem ser usadas as formas quit ou quit(x). No segundo caso, o argumento X é um valor inteiro que o processo ou thread informa ao seu genitor, ao morrer. Se desejar pegar esse valor, o genitor usará a primitiva join, como função. 5 A propósito, um quit sem argumento equivale a um quit(0). Diferença entre thread e processo O que melhor distingue uma thread de um processo é o espaço de endereçamento. Todas as threads de um processo trabalham no mesmo espaço de endereçamento, que é a memória lógica do processo hospedeiro. Isto é, quando se tem um conjunto de threads dentro de um processo, todas as threads executam o código do processo e compartilham as suas variáveis. Por outro lado, quando se tem um conjunto de processos, cada processo trabalha num espaço de endereçamento próprio, com um conjunto separado de variáveis. 3 Tudo se passa como se cada processo ou thread tivesse uma variável local, denominada mynumber, contendo o número único desse processo ou thread. Na verdade, mynumber, que também pode ser referido como myself ou myid, é uma função primitiva que consulta o registro descritor do processo ou thread para obter o número de sua carteira de identidade e retorna esse número. 4 Semelhantemente ao que ocorre com mynumber, tudo se passa como se cada processo ou thread tivesse uma variável local, denominada any. 5 No caso de ser usada como subrotina, a primitiva join(id) desconsidera o valor informado pelo descendente id. PROGRAMAÇÃO CONCORRENTE Prof. Simão Toscani 6

7 No caso de um processo com N threads, tem-se um único registro descritor (o registro do processo hospedeiro) e N mini-descritores de threads. O mini-descritor de cada thread é usado para salvar os valores dos registradores da UCP (PC, PSW, etc.). Adicionalmente, cada thread possui uma pilha, que é usada para as chamadas e retornos de procedimentos. É mais fácil chavear a execução entre threads (de um mesmo processo) do que entre processos, pois tem-se menos informações para salvar e restaurar. Por esse motivo, as threads são chamadas também de "processos leves". Um exemplo Vamos usar a linguagem V4 para exemplificar o uso dos comandos fork, join e quit. O programa mostrado na figura 5 possui um único processo. A linha de execução inicial desse processo executa duas vezes o comando fork, criando duas threads adicionais (filhas 1 e 2). A thread original então espera que cada uma das filhas termine, escreve uma mensagem para cada uma e termina também. As duas threads criadas apenas colocam uma mensagem na tela e terminam. V4program process p1; f1: integer; /* identifica filha 1*/ f2: integer; /* identifica filha 2*/ { write('alo da mae'); nl; f1:= fork(); /* Cria filha 1 */ if f1 = mynumber then { write('alo da filha 1'); nl; quit}; f2:= fork(); /* Cria filha 2 */ if f2 = mynumber then { write('alo da filha 2'); nl; quit}; join(f1); write('filha 1 morreu'); nl; join(f2); write('filha 2 morreu'); nl } end program Figura 5 - Uso de comandos fork, join e quit. O comando write(x) escreve na tela do terminal do usuário. O argumento X pode ser uma constante, uma variável, um elemento de array ou um string entre apóstrofes. O comando nl ( new line ) faz com que a próxima impressão seja feita em uma nova linha. Duas possíveis saídas para o programa anterior seriam: Alo da mae Alo da mae Alo do filha 1 Alo do filha 1 Alo do filha 2 Filha 1 morreu Filha 1 morreu Alo do filha 2 Filha 2 morreu Filha 2 morreu PROGRAMAÇÃO CONCORRENTE Prof. Simão Toscani 7

8 4 Criação estática e criação dinâmica de processos Os processos de um programa concorrente podem ser criados de forma estática ou dinâmica. No primeiro caso, o programa contém a declaração de um conjunto fixo de processos, os quais são ativados simultaneamente, no inicio da execução do programa. No segundo caso, os processos são criados dinamicamente, durante a execução, através de instruções especiais para esse fim. Os mecanismos vistos até aqui (fork, join e quit) realizam criação dinâmica (e término dinâmico), pois os processos (ou threads) são criados somente quando instruções especiais são executadas. 6 Criação estática No caso da criação estática, os processos são declarados explícitamente 7 no programa fonte e vão existir desde o início da execução do programa concorrente. Normalmente, as linguagens de programação permitem especificar esses processos de duas maneiras: como processos individuais ou como um array de processos. Especificação de processos individuais: Neste caso, cada processo é especificado de forma individual, conforme exemplificado a seguir. V4program process P1; k: integer init 0; while k < 10 do { write(1); k:=k+1 }; process P2; k: integer init 0; while k < 10 do { write(2); k:=k+1 } endprogram O programa define 2 processos, denominados P1 e P2, que não compartilham variáveis (não existem variáveis globais no programa). Cada processo utiliza uma variável local, denominada k. O primeiro imprime 10 vezes o número 1 e o segundo, em paralelo, imprime 10 vezes o número 2. O resultado da execução pode ser qualquer seqüência de tamanho 20, contendo 6 Por exemplo, se a execução não passa por uma determinada instrução fork, então a thread correspondente não é criada. 7 A declaração explícita consiste em definir, para cada processo do programa, as suas variáveis locais e o seu segmento de código. PROGRAMAÇÃO CONCORRENTE Prof. Simão Toscani 8

9 10 vezes o número 1 e 10 vezes o número 2, embaralhados. Teoricamente, são possíveis 20!/(10!*10!) resultados diferentes. 8 Array de processos Neste caso, uma única declaração especifica um grupo de processos semelhantes, que se distinguem apenas pelo valor de uma variável local inteira, que é especificada no cabeçalho do processo, conforme é ilustrado a seguir, considerando o mesmo exemplo anterior. V4program process P (i := 1 to 2); k: integer init 0; while k < 10 do { write(i); k:=k+1 } endprogram Para o primeiro processo, a sua variável local i vale 1 e para o segundo, a sua variável local i vale 2. Este programa é equivalente ao anterior. Criação dinâmica É possível declarar explicitamente um modelo (uma "forma") para criar processos durante a execução, conforme é ilustrado a seguir. Neste caso tem-se o que se denomina criação dinâmica com declaração explícita de processos. V4program process type P (i: integer); k: integer init 0; while k < 10 do { write(i); k:=k+1 }; process Q; { new P(1); new P(2) } endprogram Através da especificação process type, explicita-se um modelo (template) de processo, o qual é utilizado para criar exemplares (cópias, clones) desse processo durante a execução. A criação de um novo exemplar se dá através do comando new, o qual permite passar parâmetros para o processo criado. No caso da linguagem Vale4, a primitiva new pode ser usada como 8 Combinações de uma seqüência de 20 escaninhos, escolhidos 10 a 10. PROGRAMAÇÃO CONCORRENTE Prof. Simão Toscani 9

10 função ou como subrotina; usada como função ela retorna a identificação interna (pid) do processo criado. 5 Exemplos de programas concorrentes Esta seção apresenta programas simples que ilustram características importantes dos programas concorrentes. Tratam-se de programas Vale4 completos, prontos para serem compilados e executados no ambiente V4. Para melhorar a legibilidade dos programas, é usada a seguinte notação: os identificadores declarados (variáveis, procedimentos, etc.) são apresentados em itálico. Compartilhamento de um procedimento O mesmo programa que foi utilizado na seção 3.5 para distinguir as diferentes maneiras de especificar (e criar) processos é reescrito para ilustrar o compartilhamento de um procedimento. V4program procedure imprime(i: integer); k: integer init 0; while k < 10 do { write(i); k:=k+1 }; process P1; imprime(1); process P2; imprime(2) endprogram Cada processo chama imprime fornecendo como argumento o número a ser impresso. Como nos exemplos anteriores, o resultado da execução desse programa é imprevisível, sendo possíveis (teoricamente) C resultados distintos Observação sobre as variáveis de um procedimento No exemplo anterior, existem duas execuções concorrentes do procedimento imprime, uma efetuada por P1 e outra por P2. Cada uma dessas execuções utiliza variáveis i (argumento) e k (variável local do procedimento). A observação importante é que cada processo utiliza cópias independentes dessas variáveis. O código do procedimento é compartilhado pelos dois processos, mas os dados (variáveis i e k) são privativos de cada processo. Isto é, cada processo trabalha sobre um conjunto de dados separado. Não se pode esquecer que, na chamada de um procedimento, os argumentos e as variáveis locais desse procedimento são alocados na pilha do processo chamador. Como cada processo (ou thread) trabalha com uma pilha própria, as execuções não interferem uma com a outra. Na programação concorrente é sempre assim, todo procedimento é automaticamente reentrável (ou puro). Isto significa que o mesmo código pode ser executado simultaneamente por vários PROGRAMAÇÃO CONCORRENTE Prof. Simão Toscani 10

11 processos sem que haja interferência entre eles, pois cada processo utiliza um conjunto separado de parâmetros e de variáveis locais. Compartilhamento de uma variável O programa a seguir implementa um sistema concorrente onde dois processos compartilham uma variável global S. Cada processo incrementa S de uma unidade, 100 vezes. V4program S : integer init 0; process p1; k: integer init 0; { loop S:= S+1; k:= k+1; exit when k = 100 endloop; nl; write('p1'); tab(2); write(s) }; process p2; k: integer init 0; { loop S:= S+1; k:= k+1; exit when k = 100 endloop; nl; write('p2'); tab(2); write(s) } endprogram Este programa utiliza os comandos loop e tab(k), os quais são explicados a seguir. O comando loop O comando loop implementa um ciclo infinito. No seu interior, o comando exit when <cond> significa que o ciclo acaba (isto é, que a execução vai para o comando seguinte ao endloop) quando a condição <cond> é verdadeira. Este comando pode substituir todos os demais comandos iterativos (while, repeat, for, etc.), com a vantagem de, em geral, tornar os programas mais claros. O comando tab(k) Este comando escreve K espaços em branco no terminal do usuário, sendo útil para formatar a impressão de resultados. Observação sobre a inicialização de variáveis Em V4, as variáveis não explicitamente inicializadas possuem valor inicial igual a 0, se inteiras, e igual a false, se booleanas. Quando usada, a cláusula initial (ou init) deve ser seguida de um único valor inicial. Se o uso é na declaração de uma lista de identificadores, então todos os PROGRAMAÇÃO CONCORRENTE Prof. Simão Toscani 11

12 identificadores da lista recebem esse único valor inicial. Se o uso é na declaração de um array, todos os elementos do array recebem esse único valor especificado. O problema da exclusão mútua No programa anterior, tem-se 2 processos manipulando a variável global S. Cada processo executa 100 vezes o comando S:=S+1. Este comando é compilado para a seguinte seqüência de código de máquina: push S push $1 add % coloca o valor de S na pilha % coloca a constante 1 na pilha % soma os dois últimos valores colocados na pilha pop S % guarda o resultado em S Como os pontos em que a UCP passa de um processo para outro são imprevisíveis, pode acontecer de um processo perder a UCP no meio da seqüência acima. 9 Vamos supor que o valor de S carregado na pilha seja 10 e que o processo perca a UCP. Nesse caso, quando este processo receber a UCP de volta, ele vai concluir a seqüência acima e armazenar o valor 11 em S. Todos os acréscimos a S feitos pelo outro processo nesse ínterim são perdidos. Como conseqüência, embora S inicie com o valor zero e cada processo some 1 a S cem vezes, o valor final de S dificilmente será igual a 200. Para o resultado ser 200, deve haver exclusão mútua no acesso à variável S, isto é, enquanto um processo estiver manipulando S, o outro não pode acessar S. A exclusão mútua é um requisito muito importante nos sistemas concorrentes. Em geral, é necessário garantir o acesso exclusivo aos dados compartilhados. A exclusão mútua só não é necessária quando os dados são compartilhados na modalidade "apenas leitura", isto é, quando os dados não são alterados pelos processos. Os trechos dos processos onde os dados compartilhados são manipulados, são denominados trechos críticos ou regiões críticas. Criação dinâmica de processos A criação dinâmica (e recursiva) de processos é ilustrada através do problema da torre de Hanói, descrito a seguir. Tem-se 3 torres (pilhas) e n discos de tamanhos diferentes. Inicialmente os n discos estão empilhados na torre 1, na ordem certa (maior na base, menor no topo). O problema consiste em movimentar todos os discos para uma determinada torre, sem que nunca um disco maior fique sobre um disco menor. Os discos devem ser transportados de um em um e a terceira torre pode ser usada como intermediária nessas movimentações. O programa inicia com o processo P criando um filho (escravo) Hanoi para movimentar 3 discos da torre 1 para a torre 2, usando a torre 3 como intermediária. Para movimentar n discos de a para b, usando c como torre intermediária, um escravo Hanoi faz o seguinte. Se n = 1 (só tem um disco para movimentar), então o trabalho é fácil e direto: o escravo movimenta o único disco de a para b (e mostra essa movimentação). Caso contrário, o escravo cria um escravo_1 para movimentar n-1 discos de a para c, usando b como torre intermediária. Quando esse serviço é concluído (escravo_1 termina o seu trabalho), o escravo original movimenta o disco que lhe 9 Sempre que um processo perde a UCP, o seu estado é salvo. Mais tarde, a execução do processo continua, como se nada tivesse acontecido. PROGRAMAÇÃO CONCORRENTE Prof. Simão Toscani 12

13 sobrou (que é o maior) de a para b (mostra essa movimentação) e cria um escravo_2 para concluir o serviço, que é movimentar n-1 discos de c para b usando a como torre intermediária. V4program process type Hanoi(n, a, b, c: integer); id, m: integer; if n = 1 then { nl; write(a); write(' --> '); write(b) } else { m:= n-1; }; id:= new Hanoi(m, a, c, b); join(id); nl; write(a); write(' --> '); write(b); id:= new Hanoi(m, c, b, a); join(id) process P; new Hanoi(3, 1, 2, 3) endprogram O resultado da execução deste programa será a ordem em que os discos deverão ser movimentados (movimento por movimento, um disco por vez). 6 Sincronizações básicas É comum um processo ter que esperar até que uma condição se torne verdadeira. Para essa espera ser "eficiente", o processo deve esperar no estado bloqueado (sem competir pela UCP). Dois tipos de bloqueio são considerados básicos: 1. bloquear até que um recurso se torne disponível; bloquear até que chegue um sinal de outro processo. Estes bloqueios são caracterizados pelas operações básicas lock/unlock e block/wakeup(p), descritas a seguir. Enquanto o primeiro par (lock/unlock) implementa sincronização do tipo exclusão mútua, o segundo par implementa uma forma básica de comunicação. lock;... ; unlock Um processo só entra num trecho delimitado pelo par lock/unlock se nenhum outro processo está executando em um outro trecho delimitado dessa maneira. Isto é, o primeiro processo que executa o comando lock passa e tranca a passagem (chaveia a fechadura) para os demais. O comando unlock deixa passar (desbloqueia) o primeiro processo da fila de processos que estão bloqueados por terem executado um lock (enquanto a fechadura estava trancada). Se a fila está vazia, a fechadura é destrancada (isto é, é deixada aberta). 10 O recurso pode ser, inclusive, "o direito de acessar os dados compartilhados". PROGRAMAÇÃO CONCORRENTE Prof. Simão Toscani 13

14 block/wakeup(p) Quando um processo P executa o comando block, ele se bloqueia até que um outro processo execute o comando wakeup(p). Este último comando acorda (desbloqueia) o processo especificado por P. Se wakeup(p) é executado antes, o processo P não se bloqueia ao executar o block. Na linguagem Vale4, o argumento de wakeup pode ser um nome de processo ou um número único de processo ou thread. Na verdade, os comandos lock e unlock não formam uma estrutura sintática (isto é, não precisam estar casados, como se fossem um abre e fecha parênteses), eles são comandos independentes. Na linguagem Vale4, as operações lock e unlock também podem ser referidas pelos nomes mutexbegin e mutexend, respectivamente. 7 Semáforos As variáveis semáforas são variáveis especiais que admitem apenas duas operações, denominadas P e V. 11 Sendo S é uma variável semáfora, as operações P e V têm a seguinte semântica: P(S) : espera até S ser maior que 0 e então subtrai 1 de S; V(S) : incrementa S de 1. As operações testar S e subtrair 1 (se S > 0) e incrementar S de 1 são executadas de forma atômica (indivisível), no kernel do SO. Se S = 1 e dois processos executam P(S) simultaneamente, um dos processos vai ficar bloqueado. Pode-se fazer analogia entre uma variável semáfora e um vaso contendo bolitas (bolinhas de gude). O valor numérico do semáforo corresponde ao número de bolitas dentro do vaso. Uma operação V corresponde a pôr uma bolita no vaso. Cada operação P tenta remover uma bolita; se nenhuma está disponível, então a operação bloqueia o processo e o coloca numa fila de espera. Quando uma bolita é colocada no vaso (operação V), ela é removida pelo primeiro processo da fila de espera, o qual prossegue sua execução. Sincronizações básicas com semáforos As variáveis semáforas permitem implementar os dois tipos básicos de bloqueio, conforme é explicado a seguir. Sincronização tipo lock/unlock: A sincronização do tipo exclusão mútua é implementada através de um semáforo com valor inicial 1. O acesso exclusivo a n regiões críticas seria implementado como segue: X : semaphore initial 1 11 P e V são as iniciais das palavras holandesas Proberen e Verhogen, que significam testar e incrementar, respectivamente. PROGRAMAÇÃO CONCORRENTE Prof. Simão Toscani 14

15 P1: P2:... Pn: P(X); P(X); P(X); REGIÃO CRÍTICA; REGIÃO CRÍTICA; REGIÃO CRÍTICA; V(X); V(X); V(X); Sincronização tipo block/wakeup(p): Este tipo de sincronização é implementado através de um semáforo com valor inicial zero. Por exemplo, se a operação B do processo P1 deve ser executada após a operação A do processo P2, programa-se da seguinte maneira: Y : semaphore initial 0 P1: P2: P(Y); % block... B; A;... V(Y); % wakeup(p1) Programas clássicos Esta seção apresenta 4 problemas clássicos da programação concorrente, todos resolvidos através do uso de semáforos e todos escritos de acordo com a sintaxe de Vale4. Produtor-consumidor com buffer limitado Este problema pode ser enunciado como segue. Um par de processos compartilha um buffer de N posições. O primeiro processo, denominado produtor, passa a vida a produzir mensagens e a colocá-las no buffer. O segundo processo, denominado consumidor, passa a vida a retirar mensagens do buffer (na mesma ordem em que elas foram colocadas) e a consumí-las. A relação produtor-consumidor ocorre comumente em sistemas concorrentes e o problema se resume em administrar o buffer que tem tamanho limitado. Se o buffer está cheio, o produtor deve se bloquear, se o buffer está vazio, o consumidor deve se bloquear. A programação desse sistema com buffer de 5 posições e supondo que as mensagens sejam números inteiros, é mostrada a seguir. Variáveis globais: buffer: array[5] of integer; cheios: semaphore initial 0; vazios: semaphore initial 5; PROGRAMAÇÃO CONCORRENTE Prof. Simão Toscani 15

16 Processo produtor: Processo consumidor: msg, in : integer; msg, out : integer; loop loop % produz mensagem msg P(cheios); P(vazios); out:= (out mod 5)+1; in:= (in mod 5)+1; msg:= buffer[out]; buffer[in]:= msg; V(vazios); V(cheios) % consome a mensagem endloop endloop O semáforo cheios conta o número de buffers cheios e o semáforo vazios conta número de buffers vazios. Conforme já foi referido, as variáveis inteiras que não são inicializadas tem seu valor inicial igual a zero. Observe que a solução não se preocupou em garantir exclusão mútua no acesso ao buffer. Isto porque os dois processos trabalham com variáveis locais in, out e msg e, certamente, irão acessar sempre posições diferentes do vetor global buffer. Jantar dos Filósofos Este problema ilustra as situações de deadlock e de postergação indefinida que podem ocorrer em sistemas nos quais processos adquirem e liberam recursos continuamente. Existem N filósofos que passam suas vidas pensando e comendo. Cada um possui seu lugar numa mesa circular, em cujo centro há um grande prato de spaghetti. A figura 6 ilustra a situação para 5 filósofos. Como a massa é muito escorregadia, ela requer dois garfos para ser comida. Na mesa existem N garfos, um entre cada dois filósofos, e os únicos garfos que um filósofo pode usar são os dois que lhe correspondem (o da sua esquerda e o da sua direita). O problema consiste em simular o comportamento dos filósofos procurando evitar situações de deadlock (bloqueio permanente) e de postergação indefinida (bloqueio por tempo indefinido). filósofo 3 garfo 3 garfo 2 filósofo 4 garfo 4 spaghetti filósofo 2 garfo 1 filósofo 5 garfo 5 filósofo 1 Figura 6 - A mesa dos 5 filósofos Da definição do problema, tem-se que nunca dois filósofos adjacentes poderão comer ao mesmo tempo e que, no máximo, N/2 filósofos poderão estar comendo de cada vez. Na solução a seguir, iremos nos concentrar no caso de 5 filósofos. Os garfos são representados por um vetor de PROGRAMAÇÃO CONCORRENTE Prof. Simão Toscani 16

17 semáforos e é adotada a seguinte regra: todos os 5 filósofos pegam primeiro o seu garfo da esquerda, depois o da direita, com exceção de um deles, que é do contra. Pode ser demonstrado que esta solução é livre de deadlocks. Foi escolhido o filósofo 1 para ser do contra. O programa a seguir é um programa Vale4 completo, no qual cada filósofo faz 10 refeições e morre. V4program garfo: array[5] of semaphore init 1; % array global procedure getforks(i: integer); j: integer; { j := i-1 ; % j é o garfo da esquerda if j = 0 then { P(garfo[1]); P(garfo[5]) } else { P(garfo[j]); P(garfo[i]) } }; procedure putforks(i: integer); j: integer; { j := i-1 ; % j é o garfo da esquerda if j = 0 then { V(garfo[1]); V(garfo[5]) } else { V(garfo[j]); V(garfo[i]) } }; process filosofo (i:= 1 to 5); k: integer init 10; while k > 0 do { getforks(i); nl; write( filosofo ); write(i); write( comecou a comer ); putforks(i); nl; write( filosofo ); write(i); write( parou de comer ); k:=k-1 } endprogram Barbeiro dorminhoco O problema consiste em simular o funcionamento de uma barbearia com as seguintes características. A barbearia tem uma sala de espera com N cadeiras e uma cadeira de barbear. Se não tem clientes à espera, o barbeiro senta numa cadeira e dorme. Quando chega um cliente, ele acorda o barbeiro. Se chega outro cliente enquanto o barbeiro está trabalhando, ele ocupa uma cadeira e espera (se tem alguma cadeira disponível) ou vai embora (se todas as cadeiras estão ocupadas). PROGRAMAÇÃO CONCORRENTE Prof. Simão Toscani 17

18 A solução a seguir usa 3 semáforos: clientes, fila e mutex. O semáforo clientes tranca o barbeiro, sendo suas bolitas produzidas pelos clientes que chegam. O valor desse semáforo indica o número de clientes à espera (excluindo o cliente na cadeira do barbeiro, que não está à espera). O semáforo fila tranca os clientes e implementa a fila de espera. O semáforo mutex garante exclusão mútua. Também é usada uma variável inteira, count, que conta o número de clientes à espera. O valor desta variável é sempre igual ao número de bolitas do semáforo clientes. Um cliente que chega na barbearia verifica o número de clientes à espera. Se esse número é menor que o número de cadeiras, o cliente espera, caso contrário, ele vai embora. A solução é apresentada a seguir, considerando o número de cadeiras na sala de espera igual a 3. Inicialmente, o barbeiro executa a operação P(clientes), onde fica bloqueado (dormindo) até a chegada de algum cliente. Quando chega um cliente, ele começa adquirindo a exclusão mútua. Outro cliente que chegar imediatamente após, irá se bloquear até que o primeiro libere a exclusão mútua. Dentro da região crítica, o cliente verifica se o número de pessoas à espera é menor ou igual ao número de cadeiras. Se não é, ele libera mutex e vai embora sem cortar o cabelo. Se tem alguma cadeira disponível, o cliente incrementa a variável count e executa a operação V no semáforo clientes. Se o barbeiro está dormindo, ele é acordado; caso contrário, é adicionada uma bolita no semáforo clientes. A seguir, o cliente libera a exclusão mútua e entra na fila de espera. O barbeiro adquire a exclusão mútua, decrementa o número de clientes, pega o primeiro da fila de espera e vai fazer o corte. Variáveis globais: clientes, fila: semaphore init 0; Processo barbeiro: loop mutex: semaphore init 1; count : integer initial 0; Processo cliente: P(mutex); P(clientes); /*dorme, se for o caso*/ if count < 3 P(mutex); count:= count 1; V(fila); /*pega próximo cliente*/ then { count:= count+1; V(clientes); /*acorda o barbeiro*/ V(mutex); V(mutex); P(fila); /*espera o barbeiro*/ /*corta o cabelo*/ endloop } else V(mutex) /*corta o cabelo*/ Quando termina o corte de cabelo, o cliente deixa a barbearia e o barbeiro repete o seu loop onde tenta pegar um próximo cliente. Se tem cliente, o barbeiro faz outro corte. Se não tem, o barbeiro dorme. PROGRAMAÇÃO CONCORRENTE Prof. Simão Toscani 18

19 Leitores e escritores O problema dos readers and writers [COU71] ilustra outra situação comum em sistemas de processos concorrentes. Este problema surge quando processos executam operações de leitura e de atualização sobre um arquivo global (ou sobre uma estrutura de dados global). A sincronização deve ser tal que vários readers (isto é, processos leitores, que não alteram a informação) possam utilizar o arquivo simultaneamente. Entretanto, qualquer processo writer deve ter acesso exclusivo ao arquivo. Na solução a seguir é dada prioridade para os processos readers. São utilizadas duas variáveis semáforas, mutex e w, para exclusão mútua, e uma variável inteira nr, para contar o número de processos leitores ativos. Note que o primeiro reader bloqueia o progresso dos writers que chegam após ele, através do semáforo w. Enquanto houver reader ativo, os writers ficarão bloqueados. Variáveis globais: mutex, w : semaphore initial 1; Processo leitor:... nr : integer initial 0; P(mutex); Processo escritor: nr:=nr+1;... if nr=1 then P(w);... V(mutex); P(w); READ P(mutex); V(w); nr:=nr-1;... if nr=0 then V(w);... V(mutex);... WRITE PROGRAMAÇÃO CONCORRENTE Prof. Simão Toscani 19

20 BIBLIOGRAFIA [CON63] CONWAY, M. E. A Multiprocessor system design. Proc. AFIPS Fall Joint Computer Conference, pp Las Vegas, Nevada, [COU71] COURTOIS, P. J., HEYMANS, F.and PARNAS, D. L. Concurrent Control with Readers and Writers. Comm. ACM 14, No. 10 (October), , [DIJ65] DIJKSTRA, E. W. Cooperating Sequential Processes. Technical Report EWD-123, Technological University, Eindhoven, the Netherlands, Reprinted in: Programming Languages (F. Genuys, ed.) pp Academic Press, New York, [HOA74] HOARE, C. A. R. Monitors: An Operating System Structuring Concept. Comm. ACM 17, No. 10 (October), , Erratum in Comm. ACM 18, No. 2, page 95 (January) [OLI04] [SHA84] [TAF97] [TOS03] [TOS04] OLIVEIRA, R, CARISSIMI, A., TOSCANI, S. Sistemas Operacionais. Série didática do II-UFRGS, 2004 (3 ª edição). SHATZ, S. M. Communication mechanisms for programming distributed systems. Computer 17, No. 6, pp.21-28, TAFT, S. T. DUFF, R. A. ADA 95 Reference Manual: language and standard libraries. Springer-Verlag, (Lecture Notes in Computer Science, Vol 1246). TOSCANI, S., OLIVEIRA, R., CARISSIMI, A., Sistemas Operacionais e Programação Concorrente. Série didática do II-UFRGS, TOSCANI, S. S. Kit de instalação da linguagem VALE4. Disponível em PROGRAMAÇÃO CONCORRENTE Prof. Simão Toscani 20

Sistemas Operacionais. Prof. André Y. Kusumoto

Sistemas Operacionais. Prof. André Y. Kusumoto Sistemas Operacionais Prof. André Y. Kusumoto andrekusumoto.unip@gmail.com Fundamentos Paradigma do produtor-consumidor Sincronização de Processos Produtor while (count == BUFFER_SIZE) ; //no-op //adiciona

Leia mais

Sistemas Operacionais. Sincronização: Semáforos Problema dos Leitores/Escritores

Sistemas Operacionais. Sincronização: Semáforos Problema dos Leitores/Escritores Sistemas Operacionais Sincronização: Semáforos Problema dos Leitores/Escritores Autoria Autores Eduardo André Mallmann 0905/96-9 João Paulo Reginatto 1530/96-0 Local Instituto de Informática UFRGS disciplina:

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais I Índice 2 Processos... 1 2.2.5 Semáforos... 1 2.2.6 Monitores... 2 2.2.7 Passagem de Mensagens... 5 2 Processos 2.2.5 Semáforos Para resolver este problema, Dijkstra propôs em 1965

Leia mais

Fundamentos de Sistemas Operacionais

Fundamentos de Sistemas Operacionais Fundamentos de Sistemas Operacionais Aula 4: Programação Concorrente Diego Passos Últimas Aulas Processos Compostos por: Código (programa). Estado (memória, registradores). Em um sistema com multiprogramação:

Leia mais

Aula 6: Comunicação entre processos. Instituto Federal da Bahia INF009 - Sistemas Operacionais Profª Flávia Maristela

Aula 6: Comunicação entre processos. Instituto Federal da Bahia INF009 - Sistemas Operacionais Profª Flávia Maristela Aula 6: Comunicação entre processos Instituto Federal da Bahia INF009 - Sistemas Operacionais Profª Flávia Maristela (-- motivação --) Processos em execução no sistema operacional podem ser: Independentes:

Leia mais

Introdução Aplicações Concorrentes Especificação de Concorrência em Programas Problemas de Compartilhamento de Recursos Exclusão Mútua Sincronização

Introdução Aplicações Concorrentes Especificação de Concorrência em Programas Problemas de Compartilhamento de Recursos Exclusão Mútua Sincronização Sincronização e Comunicação entre Processos Introdução Aplicações Concorrentes Especificação de Concorrência em Programas Problemas de Compartilhamento de Recursos Exclusão Mútua Sincronização Condicional

Leia mais

Fundamentos de Sistemas Operacionais

Fundamentos de Sistemas Operacionais Fundamentos de Sistemas Operacionais Aula 6: Monitores, Troca de Mensagens e Deadlock Diego Passos Última Aulas Mecanismos de Exclusão Mútua Operações atômicas. Protocolos de controle de acesso. Spin-locks.

Leia mais

Programação concorrente (processos e threads)

Programação concorrente (processos e threads) Programação concorrente (processos e threads) Programação concorrente Por que precisamos dela? Para utilizar o processador completamente Paralelismo entre CPU e dispositivos de I/O Para modelar o paralelismo

Leia mais

Sincronização e Comunicação entre Processos

Sincronização e Comunicação entre Processos Sincronização e Comunicação entre Processos Monitores/Semáforos Semáforos Mecanismos de sincronização nãoestruturados; Exige do desenvolvedor bastante cuidado, pois qualquer engano pode levar a problemas.

Leia mais

Comunicação entre processos

Comunicação entre processos Universidade Federal do Acre Centro de Ciências Exatas e Tecnológicas Bacharelado em Sistemas de Informação Comunicação entre processos Macilon Araújo Costa Neto macilon@ufac.br Capítulo 2 do livro do

Leia mais

Thread. Thread. Sistemas Operacionais. Leonard B. Moreira. UNIVERSIDADE ESTÁCIO DE SÁ fevereiro, / 41

Thread. Thread. Sistemas Operacionais. Leonard B. Moreira. UNIVERSIDADE ESTÁCIO DE SÁ   fevereiro, / 41 Thread Sistemas Operacionais Leonard B. Moreira UNIVERSIDADE ESTÁCIO DE SÁ e-mail: leonardbarreto@gmail.com.br fevereiro, 2013 1 / 41 Sumário 1 Introdução 2 Ambientes Monothread 3 Ambientes Multithread

Leia mais

Notas da Aula 7 - Fundamentos de Sistemas Operacionais

Notas da Aula 7 - Fundamentos de Sistemas Operacionais Notas da Aula 7 - Fundamentos de Sistemas Operacionais 1. Organização de um Processo em Memória Quando um processo é criado, o SO aloca uma porção da memória física da máquina para a criação do espaço

Leia mais

Capítulo 2. Multiprogramação. Conteúdo. Objetivo. Recordando. Recordando. DCA-108 Sistemas Operacionais

Capítulo 2. Multiprogramação. Conteúdo. Objetivo. Recordando. Recordando. DCA-108 Sistemas Operacionais DCA-108 Sistemas Operacionais Capítulo 2 Luiz Affonso Guedes www.dca.ufrn.br/~affonso affonso@dca.ufrn.br Multiprogramação Luiz Affonso Guedes 1 Luiz Affonso Guedes 2 Conteúdo Caracterização de um SO Moderno

Leia mais

Sincronização e comunicação entre processos

Sincronização e comunicação entre processos Sistemas Operacionais Prof. Esp. André Luís Belini Bacharel em Sistemas de Informações MBA em Gestão Estratégica de Negócios Sincronização e comunicação entre processos Em um sistema multiprogramável com

Leia mais

Problema do Produtor -Consumidor. Solução por semáforos

Problema do Produtor -Consumidor. Solução por semáforos Problema do Produtor -Consumidor Solução por semáforos Autoria Autores alunos da disciplina SO II Local Instituto de Informática UFRGS Versão v7 agosto de 2008 por C. Geyer Visão geral do assunto...2 Conceito...3

Leia mais

Programação Orientada a Objetos. Concorrência

Programação Orientada a Objetos. Concorrência Programação Orientada a Objetos Concorrência Cristiano Lehrer, M.Sc. Níveis de concorrência: Introdução Nível de instrução de máquina: Executando duas ou mais instruções de máquina simultaneamente. Nível

Leia mais

Sincronização e Comunicação entre Processos. Adão de Melo Neto

Sincronização e Comunicação entre Processos. Adão de Melo Neto Sincronização e Comunicação entre Processos Adão de Melo Neto 1 MOTIVAÇÃO 2 INTRODUÇÃO Em um sistema multiprogramado (concorrente) os processos alternam sua execução (ou seja, são executados alternadamente

Leia mais

Processos e Threads e em sistemas distribuídos. Prof. Me. Hélio Esperidião

Processos e Threads e em sistemas distribuídos. Prof. Me. Hélio Esperidião Processos e Threads e em sistemas distribuídos. Prof. Me. Hélio Esperidião Processos Sistemas operacionais modernos criam vários processadores virtuais, cada um para executar um programa. Para monitorar

Leia mais

Arquitetura de Computadores Sistemas Operacionais II

Arquitetura de Computadores Sistemas Operacionais II Definição de Processo Arquitetura de Computadores Sistemas Operacionais II Processo é o mesmo de Programa? Programa Estrutura estática Instruções + Dados Processo Entidade Ativa Instância de um Programa

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais Processos Semáforos Semáforos Mecanismo de sincronização que não requer espera ocupada Dijkstra propôs usar uma variável inteira para contar o n o de WAKEUPs para uso futuro Menos

Leia mais

INE5645 Programação Paralela e Distribuída - Prova 1 22/10/2012 Aluno: Parte 1 Controle de Concorrência Conceitos Básicos (2,5)

INE5645 Programação Paralela e Distribuída - Prova 1 22/10/2012 Aluno: Parte 1 Controle de Concorrência Conceitos Básicos (2,5) INE5645 Programação Paralela e Distribuída - Prova 1 22/10/2012 Aluno: Parte 1 Controle de Concorrência Conceitos Básicos (2,5) 1.1 (Verdade/Falso) Itens próprios de processos são: Espaço de endereçamento,

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais Prof. Fabio Augusto Oliveira Processos O processador é projetado apenas para executar instruções, não sendo capaz de distinguir qual programa se encontra em execução. A gerência de

Leia mais

Capítulo 2 Processos e Threads

Capítulo 2 Processos e Threads Capítulo 2 Processos e Threads 2.1 Processos 2.2 Threads 2.3 Comunicação interprocesso 2.4 Problemas clássicos de IPC 2.5 Escalonamento 1 Processos O Modelo de Processo Multiprogramação de quatro programas

Leia mais

Programação Concorrente

Programação Concorrente INE 5410 Programação Concorrente Professor: Lau Cheuk Lung (turma A) INE UFSC lau.lung@inf.ufsc.br Conteúdo Programático 1. 2. Programação Concorrente 3. Sincronização 1. Condição de corrida, região critica

Leia mais

Ambientes de Execução

Ambientes de Execução KERNEL Conceitos Conceitos POSIX Portable Operating System Interface for UNIX. Um conjunto de padrões da IEEE e ISO que definem como programas e sistemas operacionais de interface com os outros. Sistemas

Leia mais

Prof. Silvana Rossetto 9 de julho de DCC/IM/UFRJ

Prof. Silvana Rossetto 9 de julho de DCC/IM/UFRJ Computação Concorrente (MAB117) Gabarito Segunda Prova Prof. Silvana Rossetto 9 de julho de 2015 1 DCC/IM/UFRJ Questão 1 (2,5 pts) O código Java abaixo implementa uma solução para o problema do barbeiro

Leia mais

Programação: Vetores

Programação: Vetores Programação de Computadores I Aula 09 Programação: Vetores José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011-1 1/62 Motivação Problema Faça um programa que leia

Leia mais

Programação de Alto Desempenho - 2. Prof: Carla Osthoff

Programação de Alto Desempenho - 2. Prof: Carla Osthoff Programação de Alto Desempenho - 2 Prof: Carla Osthoff E-mail: osthoff@lncc.br 3- Modelos de programação paralela Shared Memory/Threads Posix Win32 treads OpenMP Message Passing MPI Data Parallel OpenCL/Cuda

Leia mais

Sistemas Operacionais I

Sistemas Operacionais I UFRJ IM - DCC Sistemas Operacionais I Unidade II - 18/9/2009 Prof. Antonio Carlos Gay Thomé Prof. Aux. Simone Markenson Pech 1 Conceituação Estruturas de Controle Modos de execução do S.O. Estados de um

Leia mais

Prof. Kleber R. Rovai

Prof. Kleber R. Rovai Msn: klrovai@hotmail.com E-mail: Skype: klrovai 2 1 Programa: sequência de instruções com diferentes fluxos de execução comandos condicionais e interativos (entidade passiva); Processo: um programa em

Leia mais

Computadores e Programação (DCC/UFRJ)

Computadores e Programação (DCC/UFRJ) Computadores e Programação (DCC/UFRJ) Aula 3: 1 2 3 Abstrações do Sistema Operacional Memória virtual Abstração que dá a cada processo a ilusão de que ele possui uso exclusivo da memória principal Todo

Leia mais

LabSO Gerência de Processos. Processos. Porque eu preciso entender este assunto?

LabSO Gerência de Processos. Processos. Porque eu preciso entender este assunto? LabSO Gerência de AULA 3 Flávia Maristela (flavia@flaviamaristela.com) Romildo Martins (romildo@romildo.net) Porque eu preciso entender este assunto? Para entender como um computador consegue executar

Leia mais

Fundamentos de Sistemas Operacionais

Fundamentos de Sistemas Operacionais Fundamentos de Sistemas Operacionais Aula 6 Gerenciamento de Memória Prof. Galvez Considerações Gerais Multiprogramação implica em manter-se vários processos em memória Memória necessita ser alocada de

Leia mais

Introdução a Sistemas Operacionais. Adão de Melo Neto

Introdução a Sistemas Operacionais. Adão de Melo Neto Introdução a Sistemas Operacionais Adão de Melo Neto 41 Definição de SO Sistema Operacional É um conjunto de rotinas (programa) executado pelo processador que controla o funcionamento do computador como

Leia mais

UNIVERSIDADE ESTADUAL VALE DO ACARAÚ- UEVA. Assunto: Programação Concorrente.

UNIVERSIDADE ESTADUAL VALE DO ACARAÚ- UEVA. Assunto: Programação Concorrente. UNIVERSIDADE ESTADUAL VALE DO ACARAÚ- UEVA Assunto: Programação Concorrente. Alunos: Valdeclébio Farrapo Costa Paulo Roberto Gabriel Barbosa Curso: Ciência da Computação Disciplina: Linguagem de Programação

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais Processos Exclusão Mútua Mecanismos para se Obter Exclusão MútuaM Mecanismos de Hardware: Inibição de Interrupções Instrução TSL (Test and Set Lock) Mecanismos de Software: Com Espera

Leia mais

SISTEMAS OPERACIONAIS

SISTEMAS OPERACIONAIS SISTEMAS OPERACIONAIS Conteúdo Introdução ao S.O Gerenciamento de processos. Gerenciamento de memória. Dispositivos de Entrada/Saída. Sistemas de arquivos. Gerenciamento de processos Processos Um processo

Leia mais

Teste de Sistemas de Operação 30 de Maio de 2009

Teste de Sistemas de Operação 30 de Maio de 2009 Teste de Sistemas de Operação 30 de Maio de 2009 Duração: 30 min B NOME: Indique apenas uma das alternativas. Respostas erradas descontam na nota. 1. Um pedido de entrada e saída sem buffering: (letra

Leia mais

Sistemas Operacionais. Comunicação entre processos

Sistemas Operacionais. Comunicação entre processos Sistemas Operacionais Comunicação entre processos Comunicação entre Processos Os SO s hoje são multi-tarefa Alguns processos precisam cooperar para cumprir seus objetivos Sugestões de implementação? Exemplos

Leia mais

LICENCIATURA EM COMPUTAÇÃO. Resenha Livro Sistemas Operacionais 4ª edição Capítulo quatro: Gerencia do processador

LICENCIATURA EM COMPUTAÇÃO. Resenha Livro Sistemas Operacionais 4ª edição Capítulo quatro: Gerencia do processador LICENCIATURA EM COMPUTAÇÃO Resenha Livro Sistemas Operacionais 4ª edição Capítulo quatro: Gerencia do processador SANTO AMARO 2012 JEANDERVAL SANTOS DO CARMO RESENHA Resenha do quarto capítulo: Gerencia

Leia mais

Programação Concorrente na Linguagem Vale 4

Programação Concorrente na Linguagem Vale 4 Programação Concorrente na Linguagem Vale 4 por Simão Sirineo Toscani VII Simpósio Brasileiro de Linguagens de Programação SBLP 2003 Ouro Preto,, MG, Brasil Pontifícia Universidade Católica do Rio Grande

Leia mais

LINGUAGEM C: FUNÇÕES FUNÇÃO 04/07/2017. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

LINGUAGEM C: FUNÇÕES FUNÇÃO 04/07/2017. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa. LINGUAGEM C: FUNÇÕES Prof. André Backes FUNÇÃO Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa. printf(): função que escreve na tela scanf(): função que lê o teclado

Leia mais

Sistemas Operacionais - UCSAL Professor : Marco Antônio C. Câmara Primeira Lista de Exercícios

Sistemas Operacionais - UCSAL Professor : Marco Antônio C. Câmara Primeira Lista de Exercícios 1ª Questão : Com base na figura ao lado, extraída do livro SISTEMAS OPERACIONAIS MODERNOS, de Andrew S. Tanenbaum, assinale cada uma das afirmações abaixo como (C)erta ou (E)rrada. No caso da afirmativa

Leia mais

Modelo de Programação Paralela

Modelo de Programação Paralela Modelo de Programação Paralela As arquiteturas paralelas e distribuídas possuem muitos detalhes Como especificar uma solução paralela pensando em todos esses detalhes? O que queremos? Eecutar a solução

Leia mais

Compiladores. Gerência de Memória

Compiladores. Gerência de Memória Compiladores Gerência de Memória Cristiano Lehrer, M.Sc. Atividades do Compilador Arquivo de origem Arquivo de destino Análise Otimização Geração de Código Intermediário Geração de Código Final Síntese

Leia mais

Exercícios Resolvidos (Problemas Clássicos e Outros)

Exercícios Resolvidos (Problemas Clássicos e Outros) 1) Produtor-consumidor com buffer limitado Exercícios Resolvidos (Problemas Clássicos e Outros) Este problema pode ser enunciado como segue. Um par de processos compartilha um buffer de N posições. O primeiro

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais Problemas Clássicos de Comunicação entre Processos Norton Trevisan Roman Marcelo Morandini Jó Ueyama Apostila baseada nos trabalhos de Kalinka Castelo Branco, Antônio Carlos Sementille,

Leia mais

Capítulo 6: Arquivos

Capítulo 6: Arquivos Capítulo 6: Arquivos Waldemar Celes e Roberto Ierusalimschy 29 de Fevereiro de 2012 1 Funções de entrada e saída em arquivos Nos capítulos anteriores, desenvolvemos programas que capturam seus dados de

Leia mais

Sistemas Operacionais. Tipos de SO

Sistemas Operacionais. Tipos de SO Sistemas Operacionais Tipos de SO Tipos de Sistemas Operacionais Tipos de Sistemas Operacionais Sistemas Monoprogramáveis/ Monotarefas Sistemas Multiprogramáveis/ Multitarefas Sistemas com Múltiplos Processadores

Leia mais

Notas da Aula 2 - Fundamentos de Sistemas Operacionais

Notas da Aula 2 - Fundamentos de Sistemas Operacionais Notas da Aula 2 - Fundamentos de Sistemas Operacionais 1. Ciclo de Vida de um Processo Todo processo passa por 3 fases durante sua vida: criação, execução e término. Um processo pode ser criado por outro

Leia mais

Processos Concorrentes

Processos Concorrentes Processos Concorrentes Walter Fetter Lages w.fetter@ieee.org Universidade Federal do Rio Grande do Sul Escola de Engenharia Departamento de Engenharia Elétrica ENG04008 Sistemas de Tempo Real Copyright

Leia mais

Conceito de Processo. Estados de Processos. Diagrama de Estados de Processos

Conceito de Processo. Estados de Processos. Diagrama de Estados de Processos Conceito de Processo Módulo 4: Processos Um Sistema Operacional executa uma variedade de programas: Sistemas de processamento em lotes (batch) processa jobs Sistemas de tempo partilhado (time shared) roda

Leia mais

14/05/2017. Conceitos de Processos. Conceitos de Processos. Conceito de processo

14/05/2017. Conceitos de Processos. Conceitos de Processos. Conceito de processo Conceito de processo Os computadores executam várias operações ao mesmo tempo. - Compilar um programa; - Enviar um arquivo para a impressora; - Exibir uma página web; - Reproduzir músicas; - Receber mensagens

Leia mais

GERENCIAMENTO DE TAREFAS. Prof. Me. Hélio Esperidião

GERENCIAMENTO DE TAREFAS. Prof. Me. Hélio Esperidião GERENCIAMENTO DE TAREFAS Prof. Me. Hélio Esperidião O CONCEITO DE TAREFA Uma tarefa pode ser definida como a execução de um fluxo sequencial de instruções para atender uma finalidade específica. Realizar

Leia mais

ENADE 2011 SISTEMAS OPERACIONAIS

ENADE 2011 SISTEMAS OPERACIONAIS ENADE 2011 SISTEMAS OPERACIONAIS SOs: conteúdos comuns Gerência de processos/processador Comunicação Concorrência e Sinc. de Processos Gerenciamento de Memória Alocação de Recursos e Deadlocks Sistemas

Leia mais

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Condicionais e de Repetição

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Condicionais e de Repetição Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Condicionais e de Repetição 1 Comando while Deseja-se calcular o valor de: 1 + 2 + 3 +... + N. Observação: não sabemos, a priori, quantos termos

Leia mais

Segundo trabalho prático de implementação Sistema de reserva de assentos

Segundo trabalho prático de implementação Sistema de reserva de assentos Segundo trabalho prático de implementação Sistema de reserva de assentos 1. Descrição do problema Computação Concorrente (MAB-117) 2016/2 Prof. Silvana Rossetto 1 DCC/IM/UFRJ 17 de novembro de 2016 Um

Leia mais

Sistemas Distribuídos Aula 3

Sistemas Distribuídos Aula 3 Sistemas Distribuídos Aula 3 Aula passada Processos IPC Características Ex. sinais, pipes, sockets Aula de hoje Threads Kernel level User level Escalonamento Motivação: Servidor Web Considere Servidor

Leia mais

Sistemas Operacionais

Sistemas Operacionais ANHANGUERA Sistemas Operacionais Prof. Esp. Rafael Gross Processos Sumário Introdução Conceito de processo Estrutura do processo Estados do processo Mudanças de estado do processo Criação e eliminação

Leia mais

Estrutura dos Sistemas Operacionais. Adão de Melo Neto

Estrutura dos Sistemas Operacionais. Adão de Melo Neto Estrutura dos Sistemas Operacionais Adão de Melo Neto 1 Sistema Operacional -São partes do SO -São ferramentas de apoio ao usuário -São formas de acessar as rotinas do kernel O Sistema Operacional é formado

Leia mais

Sistemas Operacionais II

Sistemas Operacionais II Sistemas Operacionais II Windows Conceitos Básicos Geraldo Braz Junior Departamento de Informática - UFMA 2 Introdução Job Coleção de um ou mais processos gerenciados como uma unidade; Define cotas e limites

Leia mais

Sistemas Distribuídos e Paralelos

Sistemas Distribuídos e Paralelos Sistemas Distribuídos e Paralelos Aula #6: Programação paralela em sistemas de memória compartilhada. ISUTIC - 2016 Eng. Alexander Rodríguez Bonet Aula de hoje Regiões paralelas. Cláusulas de âmbito. Partilha

Leia mais

Processos e Threads. Ciclo 2 AT3. Prof. Hermes Senger

Processos e Threads. Ciclo 2 AT3. Prof. Hermes Senger Processos e Threads Ciclo 2 AT3 Prof. Hermes Senger Nota O presente material foi elaborado com base no material didático do livro Sistemas Operacionais, 3ª edição, de H.M.Deitel, P.J. Deitel, D.R. Choffnes,

Leia mais

PROGRAMAÇÃO ORIENTADA A OBJETOS. Aula 12 - Threads e Concorrência em Java

PROGRAMAÇÃO ORIENTADA A OBJETOS. Aula 12 - Threads e Concorrência em Java Aula 12 - Threads e Concorrência em Java Conteúdo Programático desta aula Aplicar os conceitos e threads, processos concorrentes e sincronização em pequenos programas. Aplicar e verificar os conceitos

Leia mais

Universidade Estadual de Mato Grosso do Sul UEMS Curso de Ciência da Computação Disciplina de Algoritmos Paralelos e Distribuídos

Universidade Estadual de Mato Grosso do Sul UEMS Curso de Ciência da Computação Disciplina de Algoritmos Paralelos e Distribuídos Universidade Estadual de Mato Grosso do Sul UEMS Curso de Ciência da Computação Disciplina de Algoritmos Paralelos e Distribuídos Pensando em Paralelo Pensar em paralelo é uma tarefa que exige disciplina

Leia mais

Sistemas Distribuídos Aula 7

Sistemas Distribuídos Aula 7 Sistemas Distribuídos Aula 7 Aula passada Atomicidade Test-and-set Locks revisitado Semáforos Dois problemas Aula de hoje Limitação dos semáforos Monitores Variáveis de condição Semântica do signal Sincronização

Leia mais

Gerência de Dispositivos. Adão de Melo Neto

Gerência de Dispositivos. Adão de Melo Neto Gerência de Dispositivos Adão de Melo Neto 1 Gerência de Dispositivos Introdução Acesso ao Subsistema de E/S Subsistema de E/S Device Drivers Controladores Dispositivos de E/S Discos Magnéticos Desempenho,

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais 04 Processos Introdução Um sistema de computação quase sempre tem mais atividades a executar que o número de processadores disponíveis. Diferentes tarefas têm necessidades distintas

Leia mais

Variáveis primitivas e Controle de fluxo

Variáveis primitivas e Controle de fluxo Variáveis primitivas e Controle de fluxo Material baseado na apostila FJ-11: Java e Orientação a Objetos do curso Caelum, Ensino e Inovação, disponível para download em http://www.caelum.com.br/apostilas/

Leia mais

Sistemas Operacionais. Prof. Pedro Luís Antonelli Anhanguera Educacional

Sistemas Operacionais. Prof. Pedro Luís Antonelli Anhanguera Educacional Sistemas Operacionais Prof. Pedro Luís Antonelli Anhanguera Educacional ARQUITETURA E IMPLEMENTAÇÃO Pacote de Threads Conjunto de rotinas disponíveis para que uma aplicação utilize as facilidades dos threads.

Leia mais

Processos. Prof. Gustavo Leitão

Processos. Prof. Gustavo Leitão Processos Prof. Gustavo Leitão Campus Natal Central Disciplina Programação para Ambiente de Redes Baseada na Aula do Prof. Ricardo Valentim 5/3/2010 Objetivo da Aula 5/3/2010 PLANO DE AULA Processos Processos:

Leia mais

Estrutura dos Sistemas Operacionais. Adão de Melo Neto

Estrutura dos Sistemas Operacionais. Adão de Melo Neto Estrutura dos Sistemas Operacionais Adão de Melo Neto 1 Sistema Operacional - Formas de acessar o KERNEL do SISTEMA OPERACIONAL (SO) - A linguagem de comandos faz parte do SO O Sistema Operacional é formado

Leia mais

PROGRAMAÇÃO ORIENTADA A OBJETOS. Aula 11 - Threads e Concorrência

PROGRAMAÇÃO ORIENTADA A OBJETOS. Aula 11 - Threads e Concorrência Aula 11 - Threads e Concorrência Conteúdo Programático desta aula Apresentar os Conceitos de Threads, Concorrência e Sincronização. Verificar a aplicabilidade destes conceitos no mercado, bem como sua

Leia mais

SISTEMA DE ARQUIVOS DO SISTEMA OPERACIONAL

SISTEMA DE ARQUIVOS DO SISTEMA OPERACIONAL . SISTEMA DE ARQUIVOS DO SISTEMA OPERACIONAL 1. A organização de um arquivo define como os dados estão internamente organizados. Explique a organização de arquivos indexada. NA ORGANIZAÇÃO INDEXADO O ARQUIVO

Leia mais

Sistemas Operacionais. Prof. Pedro Luís Antonelli Anhanguera Educacional

Sistemas Operacionais. Prof. Pedro Luís Antonelli Anhanguera Educacional Sistemas Operacionais Prof. Pedro Luís Antonelli Anhanguera Educacional Processador INTRODUÇÃO Projetado apenas para executar instruções Não é capaz de distinguir qual programa está em execução Processo

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais I Índice 2 Processos...1 2.1 Introdução...1 2.1.1 Hierarquia de Processos...2 2.1.2 Estados dos Processos...3 2.1.3 Implementação de Processos...4 2.2 Comunicação entre Processos...5

Leia mais

Lógica de Programação I. Gilson de Souza Carvalho

Lógica de Programação I. Gilson de Souza Carvalho Gilson de Souza Carvalho gaucho.gilson@hotmail.com 1. Estruturas básicas Apresentaremos um resumo com os comandos estudados para criação de algoritmos. Para utilizar estes comandos, usaremos uma sintaxe

Leia mais

SOP - TADS Processos. Revisão Ultima aula

SOP - TADS Processos. Revisão Ultima aula SOP - TADS Processos Prof. Ricardo José Pfitscher dcc2rjp@joinville.udesc.br Material cedido por: Prof. Rafael Rodrigues Obelheiro Prof. Maurício Aronne Pillon Revisão Ultima aula Revisão de hardware Processador

Leia mais

Fundamentos de Sistemas Operacionais

Fundamentos de Sistemas Operacionais Fundamentos de Sistemas Operacionais Aula 12: Revisão para a P1 Diego Passos Capítulo 1 Sistemas Operacionais São programas. Duas funções: Gerenciar os recursos do hardware. Dividir entre os vários processos.

Leia mais

Estrutura dos Sistemas Operacionais. Sérgio Portari Júnior

Estrutura dos Sistemas Operacionais. Sérgio Portari Júnior Estrutura dos Sistemas Operacionais Sérgio Portari Júnior - 2016 1 Sistema Operacional - Formas de acessar o KERNEL do SISTEMA OPERACIONAL (SO) - A linguagem de comandos faz parte do SO O Sistema Operacional

Leia mais

Arquitetura e Organização de Processadores. Aulas 06 e 07. Superescalaridade

Arquitetura e Organização de Processadores. Aulas 06 e 07. Superescalaridade Universidade Federal do Rio Grande do Sul Instituto de Informática Programa de Pós-Graduação em Computação Arquitetura e Organização de Processadores Aulas 06 e 07 Superescalaridade 1. Introdução princípios

Leia mais

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros Métodos Computacionais Funções, Escopo de Variáveis e Ponteiros Tópicos da Aula Hoje vamos detalhar funções em C Escrevendo funções Comando return Passagem de argumentos por valor Execução de uma função

Leia mais

LINGUAGEM C: COMANDOS DE REPETIÇÃO

LINGUAGEM C: COMANDOS DE REPETIÇÃO LINGUAGEM C: COMANDOS DE REPETIÇÃO Prof. André Backes ESTRUTURAS DE REPETIÇÃO Uma estrutura de repetição permite que uma sequência de comandos seja executada repetidamente, enquanto determinadas condições

Leia mais

UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO Bacharelado em Sistemas de Informação. Processamento Paralelo Threads. Aluno: Wagner Palacio

UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO Bacharelado em Sistemas de Informação. Processamento Paralelo Threads. Aluno: Wagner Palacio UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO Bacharelado em Sistemas de Informação Processamento Paralelo Threads Aluno: Wagner Palacio Turma: 3º período Professor: Giordano Cabral Recife, 29 de maio de 2012

Leia mais

Compiladores Análise de Tipos

Compiladores Análise de Tipos Compiladores Análise de Tipos Fabio Mascarenhas 2015.1 http://www.dcc.ufrj.br/~fabiom/comp Tipos Um tipo é: Um conjunto de valores Um conjunto de operações sobre esses valores Os tipos de uma linguagem

Leia mais

Gerência de Dispositivos. Adão de Melo Neto

Gerência de Dispositivos. Adão de Melo Neto Gerência de Dispositivos Adão de Melo Neto 1 Gerência de Dispositivos Gerência de Dispositivos Dispositivos de E/S Device Drivers Controladores Subsistema de E/S 2 Gerência de Dispositivos A gerência de

Leia mais

Sistemas Operacionais. Condição de corrida e Região crítica

Sistemas Operacionais. Condição de corrida e Região crítica Sistemas Operacionais Condição de corrida e Região crítica Região Crítica Parte do código que acessa a área compartilhada Condição em que dois processos lêem e escrevem um dado compartilhado e o resultado

Leia mais

LEIC/LERC 2008/09 Primeiro Teste de Sistemas Operativos

LEIC/LERC 2008/09 Primeiro Teste de Sistemas Operativos Nome: Número: LEIC/LERC 008/09 Primeiro Teste de Sistemas Operativos de Novembro de 008 Duração: h0m Identifique o cabeçalho de todas as folhas da prova. O teste é resolvido no espaço dedicado ao efeito

Leia mais

SOP - TADS Threads. Revisão Ultima aula. Programa em execução Cada processo têm sua própria CPU

SOP - TADS Threads. Revisão Ultima aula. Programa em execução Cada processo têm sua própria CPU SOP - TADS Threads Prof. Ricardo José Pfitscher dcc2rjp@joinville.udesc.br Material cedido por: Prof. Rafael Rodrigues Obelheiro Prof. Maurício Aronne Pillon Revisão Ultima aula Processos [1/3] Conceito:

Leia mais

Agenda. O que é um array. Declaração de um array. Instanciação de um array. Acessando os elementos de um array. O tamanho de um array (length)

Agenda. O que é um array. Declaração de um array. Instanciação de um array. Acessando os elementos de um array. O tamanho de um array (length) Arrays em Java 1 Agenda O que é um array Declaração de um array Instanciação de um array Acessando os elementos de um array O tamanho de um array (length) Arrays multi-dimensionais 2 O que é um Array?

Leia mais

Organização Básica de Computadores. Organização Básica de Computadores. Organização Básica de Computadores. Organização Básica de Computadores

Organização Básica de Computadores. Organização Básica de Computadores. Organização Básica de Computadores. Organização Básica de Computadores Ciência da Computação Arq. e Org. de Computadores Processadores Prof. Sergio Ribeiro Composição básica de um computador eletrônico digital: Processador Memória Memória Principal Memória Secundária Dispositivos

Leia mais

Capítulo 6 Nível do Sistema Operacional

Capítulo 6 Nível do Sistema Operacional Capítulo 6 Nível do Sistema Operacional - Sistema Operacional: Programa que, do ponto de vista do programador, adiciona uma grande quantidade de instruções e funcionalidades bem além das disponibilizadas

Leia mais

1 Porque o estado de um processo deve ser salvo quando ele deixa a CPU?

1 Porque o estado de um processo deve ser salvo quando ele deixa a CPU? 1 Porque o estado de um processo deve ser salvo quando ele deixa a CPU? 2 O que é ambiente de execução? 3 Qual a finalidade da PCB? 4 Quais os componentes básicos da PCB? 5 Quais os 3 grupos de elemento

Leia mais

Arquitetura de Sistemas Operativos

Arquitetura de Sistemas Operativos Arquitetura de Sistemas Operativos Sistemas Operativos 2011/2012 1 Threads Conceito Um processo é um programa em execução. A execução de um processo é sequencial: pode-se caracterizar um processo pelo

Leia mais

Classes o Objetos. Classes, objetos, métodos e variáveis de instância

Classes o Objetos. Classes, objetos, métodos e variáveis de instância Classes o Objetos Um recurso comum de cada aplicativo feito até agora é que todas as instruções que realizavam tarefas localizavam-se no método main. Se você tornar parte de uma equipe de desenvolvimento

Leia mais

ORGANIZAÇÃO DE COMPUTADORES CAPÍTULO 6: PROCESSADORES. Prof. Juliana Santiago Teixeira

ORGANIZAÇÃO DE COMPUTADORES CAPÍTULO 6: PROCESSADORES. Prof. Juliana Santiago Teixeira ORGANIZAÇÃO DE COMPUTADORES CAPÍTULO 6: PROCESSADORES Prof. Juliana Santiago Teixeira julianasteixeira@hotmail.com INTRODUÇÃO INTRODUÇÃO O processador é o componente vital do sistema de computação, responsável

Leia mais

Arquitetura e Organização de Computadores

Arquitetura e Organização de Computadores UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO DEPARTAMENTO DE CIÊNCIAS EXATAS E NATURAIS CURSO DE CIÊNCIA DA COMPUTAÇÃO Arquitetura e Organização de Computadores Conjunto de Instruções Prof. Sílvio Fernandes

Leia mais

Linguagem Pascal. Prof. Sérgio Rodrigues. É a descrição, de forma lógica, dos passos a serem executados no cumprimento de determinada tarefa;

Linguagem Pascal. Prof. Sérgio Rodrigues. É a descrição, de forma lógica, dos passos a serem executados no cumprimento de determinada tarefa; Linguagem Pascal Prof. Sérgio Rodrigues Introdução Algoritmo É a descrição, de forma lógica, dos passos a serem executados no cumprimento de determinada tarefa; Programa é a formalização de um algoritmo

Leia mais

Vetores. IFSC/Florianópolis - Programação Orientada a Objetos + POO - prof. Herval Daminelli

Vetores. IFSC/Florianópolis - Programação Orientada a Objetos + POO - prof. Herval Daminelli Vetores De modo geral, em linguagem de programação, vetores ou arrays são estruturas de dados que permitem que uma mesma variável possa armazenar mais de um valor; Em Java, vetores são coleções de dados,

Leia mais

Linguagem de Maquina II. Visão Geral

Linguagem de Maquina II. Visão Geral Linguagem de Maquina II Visão Geral Revisão A linguagem de máquina é composta de seqüências binárias (1's e 0's) São interpretadas como instruções pelo hardware A linguagem de montagem e a linguagem de

Leia mais