35
Multiprocessamento Simétrico Sistema Distribuído Multinúcleo Thread Multitarefa

Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

Embed Size (px)

Citation preview

Page 1: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

Multiprocessamento Simétrico

Sistema Distribuído

Multinúcleo

Thread

Multitarefa

Page 2: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

Sumário

Multiprocessamento Simétrico ......................................................................... 4

Funcionamento ........................................................................................... 4

Gerenciamento ........................................................................................... 5

Vantagens ................................................................................................. 5

Tecnologias ................................................................................................ 5

Sistema de processamento distribuído.............................................................. 6

Desenvolvimento ........................................................................................ 6

Arquitetura ................................................................................................ 7

Soluções .................................................................................................... 7

Multinúcleo ................................................................................................... 7

Descrição ................................................................................................... 8

Surgimento ................................................................................................ 8

Incentivos Comerciais ................................................................................. 9

Vantagens ................................................................................................. 9

Desvantagens ............................................................................................ 9

Arquitetura ............................................................................................... 10

Exemplos de Hardware ............................................................................... 10

Futuro da Tecnologia Multicore .................................................................... 11

Thread ........................................................................................................ 12

Exemplo ................................................................................................... 12

Particularidades ......................................................................................... 12

Estados de uma linha de execução ............................................................... 13

ULT e KLT ................................................................................................. 13

Criar (thread creation) ............................................................................. 14

Terminar (thread termination) .................................................................. 15

Sincronizar(Thread Join) .......................................................................... 15

Thread Yield (Rendimento da thread) ........................................................ 15

Escalonamento .......................................................................................... 16

Linha de execução ao nível do usuário ....................................................... 16

Linha de execução ao nível do núcleo ........................................................ 16

Comparação entre linha de execução e Processo ............................................ 17

Modelo de Geração de Multithreads .............................................................. 18

Modelo Muitos-Para-Um ........................................................................... 18

Modelo Um-Para-Um ............................................................................... 18

Modelo Muitos-Para-Muitos ....................................................................... 18

Page 3: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

Cancelamento ........................................................................................... 18

Exemplos .................................................................................................. 18

Java ...................................................................................................... 18

Java, exemplo simples em português ........................................................ 20

C .......................................................................................................... 22

C++ ...................................................................................................... 22

Ruby ..................................................................................................... 23

Delphi.................................................................................................... 23

Multitarefa ................................................................................................... 26

História .................................................................................................... 26

Tarefas ..................................................................................................... 27

Alternância de tarefas ................................................................................ 27

No Mundo das Placas-mãe para PCs ................................................................ 27

As melhores marcas ................................................................................... 29

Placas-mãe multi CPUs ............................................................................... 29

Placas-mãe multi CPUs/GPUs ...................................................................... 30

Componentes integrados nas placas-mãe ..................................................... 30

Os tipos de placas-mãe .............................................................................. 31

Os Fabricantes e Marcas de placas-mãe ........................................................ 31

As melhores marcas – Quais são elas? ......................................................... 31

Os fabricantes de placas-mãe – Quais são? ................................................... 32

Os fabricantes de hardware – Quais são? ...................................................... 32

Tecnologia SMP (Symmetric Mult Processing) ................................................ 32

Alguns termos técnicos usados .................................................................... 33

Page 4: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

4

Multiprocessamento Simétrico O multiprocessamento simétrico ou SMP (Symmetric Multi-Processing) ocorre em

um sistema computacional com vários processadores com memória compartilhada

sob controle de um único sistema operacional. Em contraste o multiprocessamento

assimétrico emprega sistemas diferentes.

O multiprocessamento simétrico oferece um aumento linear na capacidade de

processamento a cada processador adicionado. Não há necessariamente um

hardware que controle este recurso, cabe ao próprio sistema operacional suportá-

lo.

Este método também é chamado de "processamento paralelo".

Funcionamento Os processadores trabalham sozinhos compartilhando os recursos de hardware,

geralmente são processadores iguais, similares ou com capacidades parecidas.

Todos tem os mesmos privilégios de acesso ao hardware, ao contrário do que

acontece em sistemas multiprocessados assimétricos, onde um processador é

encarregado de gerenciar e coordenar as tarefas e ações dos demais, o que pode

proporcionar melhor controle sobre a sobrecarga ou a ociosidade dos processadores

subordinados. Por tratar todos os processadores de forma igualitária, no

multiprocessamento simétrico, qualquer processador pode assumir as tarefas

realizadas por qualquer outro processador, as tarefas são divididas e também

podem ser executadas de modo concorrente em qualquer processador que esteja

disponível. Os acessos dos processadores aos dispositivos de entrada e saída e a

memória são feitos por um mecanismo de intercomunicação constituído por um

barramento único.

A memória principal da máquina é compartilhada por todos os processadores

através de um único barramento que os interliga, de modo que esse acesso a

memória é nativo, não existe a necessidade de um mascaramento da memória real

a nível de aplicação. Por todo acesso à memória principal ser realizado através de

um único barramento, aqui temos um ponto de gargalo do sistema, pois o acesso é

serial, ou seja, o sistema fica limitado a passagem de apenas uma instrução de

cada vez pelo barramento, abrindo uma lacuna de tempo entre uma instrução e

outra. Memórias caches junto aos processadores diminuem o tempo de latência

entre um acesso e outro à memória principal e ajudam também a diminuir o

tráfego no barramento. Como estamos falando em mais de um processador, cada

um com sua memória cache é imprescindível garantir que os processadores sempre

acessem a cópia mais recente da memória cache, isso se chama coerência de cache

geralmente implementada diretamente por hardware. Um dos métodos de

coerência de cache mais conhecido é o snooping, quando um dado compartilhado

nas caches dos processadores é alterado, todas as cópias das caches são

consideradas inválidas e logo após atualizadas mantendo assim a integridade do

dado.

Page 5: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

5

Gerenciamento O sistema operacional é quem se encarrega de realizar a interação entre os

processadores e as aplicações do sistema. Deixando a existência de múltiplos

processadores transparente para os usuários, pois o próprio sincroniza os processos

com os processadores.

Mesmo as arquiteturas de SMP já existirem há muitos anos no mercado, até pouco

tempo os sistemas não tinham uma padronização para as funções básicas de

operação, cada sistema implementava suas próprias funções. O que tornava

impossível que os sistemas operacionais fossem portáveis. A partir dessa

necessidade foi criada a MPS (Específicações da Intel para Multiprocessadores ou do

inglês - Intel's Multiprocessor Specification), com o objetivo de padronizar o

desenvolvimento de SOs que suportassem essas arquiteturas. A criação da MPS fez

com que a Intel saísse na frente no desenvolvimento da tecnologia multicore.

Vantagens Sistemas de multiprocessamento simétrico são considerados mais poderosos em

relação aos de multiprocessamento assimétricos, abaixo alguns descritivos de

comparação entre eles.

No multiprocessamento simétrico muitos processos podem ser executados ao

mesmo tempo sem queda no desempenho, pois o sistema operacional delega as

instruções a cada processador;

Se um processador falhar o sistema não tranca pois qualquer outro processador

pode assumir as tarefas daquele que falhou, já no assimétrico por exemplo, se o

processador mestre falhar o sistema trava;

No SMP o usuário pode melhorar o desempenho da máquina simplesmente

adicionando um processador.

Tecnologias Antigamente para utilizar SMP era necessário hardware específico, placas-mãe com

dois ou mais soquetes de CPU, grandes estruturas de servidores clusterizados. Hoje

em dia com a tecnologia multi-core, as fabricantes já integram tudo isso em apenas

um dispositivo físico, também conhecidos como processadores multi-core.

Alguns exemplos de processadores multi-core:

Intel Xeon;

Intel Core (2,2 Duo,i3,i5,i7)

Intel Pentium D;

Intel Itanium;

AMD Athlon 64 ou X2;

Opteron 200 e 2000 processadores da série;

UltraSPARC da Sun Microsystems;

Fujitsu SPARC64 III;

Hewlett Packard PA-RISC;

Page 6: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

6

IBM POWER;

PowerPC Apple Computer(G4 e séries G5);

Sistema de processamento distribuído Um sistema de processamento distribuído ou paralelo é um sistema que interliga

vários nós de processamento (computadores individuais, não necessariamente

homogéneos) de maneira que um processo de grande consumo seja executado no

nó "mais disponível", ou mesmo subdividido por vários nós. Conseguindo-se,

portanto, ganhos óbvios nestas soluções: uma tarefa qualquer, se divisível em

várias subtarefas pode ser realizada em paralelo.

A nomenclatura geralmente utilizada neste contexto é HPC (High Performance

Computing) e/ou DPC (Distributed/Parallel Computing).

Desenvolvimento Este é um assunto muito vasto e, embora com alguma idade, só em 2001 se

começou a falar em padrões para estas soluções, que são utilizadas (em larga

escala) geralmente nos meios científicos e outros de cálculo intensivo pela sua

extensibilidade. São bastante flexíveis, já que permitem a coexistência de sistemas

desenhados especificamente para isso (por exemplo, a arquitectura NUMA), de

sistemas desktop, e mesmo de sistemas considerados obsoletos, mas não o

suficiente para permitir a coexistência de soluções semelhantes.

Page 7: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

7

Antes de avançar, será necessário distinguir um sistema de multiprocessamento

paralelo (SMP) de um sistema distribuído. Para um sistema ser de processamento

distribuído, uma ou várias unidades de processamento (CPU) estará separada

fisicamente da(s) outra(s), enquanto que num sistema SMP todas as unidades de

processamento se encontram na mesma máquina. Ambos sistemas são capazes de

processamento paralelo, e qualquer um deles pode ser visto como elemento de um

sistema distribuído!

Com os desenvolvimentos nesta área, surgiram soluções por software que fazem,

geralmente (mas não necessariamente), alterações no núcleo do sistema operativo

e que, na maioria dos casos, não são compatíveis entre elas, e dificilmente entre

versões diferentes da mesma solução. Assentam, no entanto, em arquitecturas de

comunicação padrão, como é o caso da Parallel Virtual Machine e Message Passing

Interface. Resumidamente, estas arquitecturas conseguem transportar um processo

(tarefa) e o seu contexto (ficheiros abertos, etc.) pela rede até outro nó. O nó que

originou o processo passa, assim, a ser apenas um receptor dos resultados desse

processo.

Atualmente, a principal barreira destes sistemas é implementar mecanismos de

Inter-Process Communication (IPC), os Distributed IPC, dada a sua extrema

complexidade.

Arquitetura A Figura 1 ilustra as várias camadas de interoperabilidade de um sistema

distribuído. Através do gateway a rede pública tem acesso a um supercomputador,

sem ter conhecimento disso, dado que só conhece o gateway. Qualquer aplicação

executada no gateway (preparada para ser paralelizada) pode ser distribuída por

vários nós, entregando os resultados mais rápido do que se fosse processada por

apenas um nó.

Soluções Software

Scyld (Beowulf)

openMosix

openSSI

Open Source Cluster Application Resources (OSCAR)

Multinúcleo Multinúcleo (múltiplos núcleos, do inglês multicore) consiste em colocar dois ou

mais núcleos de processamento (cores) no interior de um único chip. Estes dois ou

mais núcleos são responsáveis por dividir as tarefas entre si, ou seja, permitem

trabalhar em um ambiente multitarefa. Em processadores de um só núcleo, as

funções de multitarefa podem ultrapassar a capacidade da CPU, o que resulta em

queda no desempenho enquanto as operações aguardam para serem processadas.

Em processadores de múltiplos núcleos o sistema operacional trata cada um desses

núcleos como um processador diferente. Na maioria dos casos, cada unidade possui

seu próprio cache e pode processar várias instruções simultaneamente. Adicionar

Page 8: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

8

novos núcleos de processamento a um processador (único encapsulamento)

possibilita que as instruções das aplicações sejam executadas em paralelo, como se

fossem 2 ou mais processadores distintos.

Os dois núcleos não somam a capacidade de processamento, mas dividem as

tarefas entre si. Por exemplo, um processador de dois núcleos com clock de 1.8

GHz não equivale a um processador de um núcleo funcionando com clock de 3.6

Ghz, e sim dois núcleos 1,8GHZ operando em paralelo. O termo multinúcleo ou

multicore (como é popularmente conhecido), são por vezes utilizados para

descrever arquiteturas multicore com um número particularmente elevado de

núcleos (dezenas ou centenas).

O surgimento dos processadores multicore, tornou-se necessário principalmente

devido a missão cada vez mais difícil de resfriar processadores singlecore

(processadores de apenas um núcleo) com clocks cada vez mais altos; devido a

concentração cada vez maior de transistores cada vez menores em um mesmo

circuito integrado. E além dessa e outras limitações dos processadores singlecore,

existe a grande diferença entre a velocidade da memória e do processador, aliada à

estreita banda de dados, que faz com que aproximadamente 75 por cento do uso

do microprocessador seja gasto na espera por resultados dos acessos à memória.

Descrição Na maioria dos processadores de mais de um núcleo, cada núcleo pode possuir sua

própria cache e alguns casos realizam acesso direto e independente à memória

principal; possibilita-se, assim, que as instruções de aplicações sejam executadas

em paralelo, ou seja, cada processador realiza os cálculos de que é requisitado

concorrentemente com o outro, ganhando desempenho. Este, porém, depende

muito dos algoritmos de software utilizados e de suas implementações.

Outra vantagem do processamento em paralelo é a capacidade de cada

processador ficar responsável pela execução de um aplicativo, como por exemplo,

quando o usuário está executando algum arquivo de som e ao mesmo tempo

executando a varredura do antivírus.

A diferença desse processamento paralelo e do até então usado nos processadores

singlecore pode ser visto nas figuras abaixo; observe o gargalo (bottleneck) criado

pelos aplicativos executados simultaneamente no singlecore, e como ele

desaparece na figura com os dois núcleos (cores).

Surgimento Embora a tecnologia de fabricação tenha melhorado, reduzindo o tamanho de

processadores individuais, limites físicos de semicondutores baseados em

microeletrônica haviam se tornado uma preocupação principal. Estas limitações

físicas poderiam causar dissipação de calor significativa e problemas de

sincronização de dados. Vários métodos foram e estão sendo usados para melhorar

o desempenho da CPU. Alguns paralelismos por nível de instrução (ILP), métodos

como pipelining superescalares são adequados para muitas aplicações, mas são

ineficientes para os que são difíceis de prever código. Muitas aplicações são mais

adequadas para paralelismo por nível de thread (TLP), métodos e múltiplas CPUs

independentes são comumente usados para aumentar a TLP geral de um sistema.

Uma combinação de espaço disponível aumentou (devido a processos de fabricação

Page 9: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

9

refinados) e a demanda por TLP aumento e levou ao desenvolvimento de CPUs

multi-core.

Incentivos Comerciais Vários negócios impulsionaram o desenvolvimento da arquitetura multicore.

Durante décadas, foi possível melhorar o desempenho de uma CPU, reduzindo a

área do circuito integrado, que diminuiu o custo por dispositivo. Como alternativa,

mais transistores poderiam ser utilizados no projeto, o que aumentou a

funcionalidade, especialmente para as arquiteturas CISC. Eventualmente, estas

técnicas atingiram o seu limite e não puderam continuar a melhorar o desempenho

da CPU. Múltiplos processadores tiveram que ser empregados para ganhar

velocidade no processamento. Vários núcleos foram usados no mesmo chip para

melhorar o desempenho, o que poderia então levar a melhores vendas de CPUs que

tinham dois ou mais núcleos.

Vantagens Uma das principais vantagens dos processadores multicore é também um dos

principais motivos da sua invenção. Essa vantagem é a sua maior capacidade -

comparado aos singlecores - de resfriamento; o que ainda possibilitou e ainda

possibilita o aumento do poder de processamento dos processadores.

Economia no preço de licenciamento de softwares proprietários, passando a ter um

maior poder de processamento sem necessitar de uma nova máquina.

Processadores multicore também permitem maior desempenho com menor energia.

Isso pode ser um fator importante em dispositivos móveis que funcionam com

baterias. Uma vez que cada núcleo em multicore é geralmente mais eficiente em

termos energéticos, o chip se torna mais eficiente do que ter um grande núcleo

único e monolítico.

As outras vantagens quase que por completo relacionam-se com a capacidade de

processamento, principalmente quando se trata da execução de mais de um

aplicativo ao mesmo tempo ou mesmo e aplicativos capazes de realizar o seu

processamento paralelamente, conseguindo assim trabalhar com dois ou mais

núcleos concomitantemente. Nos processadores mais recentemente desenvolvidos

existe também uma melhora no acesso a memória e na troca de dados entre os

próprios núcleos.

Porém, é importante destacar também que para que a qualidade de processamento

paralelo dos multicores seja utilizada na sua totalidade os softwares instalados na

máquina devem ser escritos para aproveitar esse recurso; para isso as aplicações

devem ser escritas utilizando e armazenando os conceitos de threads, assim uma

única aplicação utilizará o poder de processamentos dos dois ou mais

processadores.

Desvantagens Processadores multicore possuem um bom desempenho, performance,

disponibilidade e segurança a um menor custo. Por outro lado, esta tecnologia

possui algumas desvantagens, entre as principais podemos destacar:

Page 10: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

10

O aumento da utilização dos recursos computacionais fornecidos por processadores

multicore requerem ajustes, tanto para o sistema operacional de apoio quanto para

o software aplicativo já existente.

A capacidade dos processadores multicore depende da utilização de vários

segmentos dentro das aplicações para aumentar o desempenho da aplicação.

Arquitetura Com o surgimento dos multicores tornou-se necessário algumas adaptações a nível

de arquitetura para o melhor aproveitamento dos seus núcleos, e as primeiras a

serem feitas tem como objetivo melhorar o paralelismo a nível de threads e assim

criar uma arquitetura que propicie o chamado paralelismo ao nível do chip.

Algumas vantagens da arquitetura são: a melhor localização dos dados em se

comparando com outras arquiteturas de multiprocessamento; a melhor

comunicação entre as unidades e o número reduzido de quantidade de espaço e

energia necessários.

A arquitetura é geralmente um SMP, ou seja, um multiprocessamento simétrico;

implementado em um circuito VLSI - Very Large Scale Integration. Essa é uma

arquitetura onde dois ou mais processadores idênticos são ligados a uma única

memória principal. Porém ao SMP existem outras alternativas de se criar uma

arquitetura com variantes para o tratamento da memória ou até mesmo a

comunicação entre os diversos núcleos presentes no processador. Algumas dessas

variantes podem ser observadas nos artigos abaixo:

Arquitetura Intel Core2

Arquitetura AMD Athlon 64 X2

Exemplos de Hardware Segue abaixo alguns exemplos de hardware que utilizam a tecnologia multi-core.

Comercial

AMD

Athlon 64, Athlon 64 FX e Athlon 64 X2, processadores AMD Athlon™ para

desktops.

Athlon II, processador AMD Athlon™ II Dual-Core para desktops.

Phenom, processador AMD Phenom™ X4 de quatro núcleos e AMD Phenom™

X3 de três núcleos para desktops.

Phenom II, processador multi-core. Oferece uma melhor experiência visual

para entretenimento de alta definição, desempenho avançado em

multitarefa e inovações de economia de energia, proporcionando máquinas

menores e mais refrigeradas, com uso eficiente da energia.

Sempron, processador AMD Sempron™ para desktops.

Turion 64 X2, processador dual-core para laptop.

Opteron, processador para servidores.

IBM

POWER5, processador dual-core, lançado em 2004.

Page 11: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

11

POWER6, processador dual-core, lançado em 2007.

POWER7, processadores 4,6,8-core, lançados em 2010.

PowerPC 970MP, processador dual-core usado na Apple Power Mac G5.

Xenon, processador triple-core, usado pela Microsoft no Xbox 360.

Intel

Celeron Dual-Core, primeiro processador dual-core comercializado.

Core Duo, processador dual-core.

Core 2 Duo, processador dual-core.

Core 2 Quad, 2 processadores dual-core embutido em um multi-chip.

Core i3, Core i5 e Core i7, família de processadores multi-core. São os

sucessores do Core 2 Duo e do Core 2 Quad.

Itanium 2, processador dual-core.

Pentium D, 2 single-core embutido em um multi-chip.

Pentium Extreme Edition, 2 single-core embutido em um multi-chip.

Pentium Dual-Core, processador dual-core.

Xeon processadores dual-, quad-, hexa-, octo- e 12-core.

Nvidia

GeForce 9 Series multi-core, a Unidade de processamento gráfico possui 8

cores e 16 Scalar processor/Stream processing por core.

GeForce 200 Series multi-core, a Unidade de processamento gráfico possui

10 cores e 24 Scalar processor/Stream processing por core.

Tesla multi-core, a GPGPU possui 10 cores e 24 Scalar processor/Stream

processing por core.

Free

OpenSPARC

Futuro da Tecnologia Multicore O MIT, Instituto de Tecnologia de Massachusetts, anunciou um processador com 64

núcleos, cujo design difere drasticamente dos processadores existentes hoje1 . O

novo chip, chamado Tile64, evita o que é hoje o maior gargalo no desempenho dos

processadores multicores e ele consome menos energia.

Nos processadores multicores existentes hoje, cada núcleo se comunica com o

outro através de um barramento comum. Se pensarmos em dois ou quatro núcleos

dividindo um barramento, a performance não é muito afetada. Quando pensamos

em 16 ou mais núcleos sendo usados ao mesmo tempo, a historia é completamente

diferente. Este é o maior gargalo no desempenho dos processadores multicores.

O Tile64 não possui um barramento central. Ao invés disso, os núcleos estão

diretamente conectados. Cada núcleo possui todas as característica de um

processador e memória. O novo conceito aplicado nesses processadores é a

estrutura de malha na conexão entre os núcleos. Essa estrutura é similar à

encontrada na Internet, uma rede que possui vários nós descentralizados. Uma

razão que faz a Internet capaz de transmitir dado tão rapidamente é que os

pacotes de informação são enviados através de uma vasta rede interligada,

evitando assim o congestionamento desses pacotes. Essa nova arquitetura abre

Page 12: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

12

portas para que novos processadores recebam números cada vez maiores de

núcleos. A existência de um número tão grande de cores, começa a requerer a

utilização de um esquema de manipulação próximo a grades computacionais.

Thread Linha ou Encadeamento de execução (em inglês: Thread), é uma forma de um

processo dividir a si mesmo em duas ou mais tarefas que podem ser executadas

concorrentemente. O suporte à thread é fornecido pelo próprio sistema operacional,

no caso da linha de execução ao nível do núcleo (em inglês: Kernel-Level Thread

(KLT)), ou implementada através de uma biblioteca de uma determinada

linguagem, no caso de uma User-Level Thread (ULT).

Uma thread permite, por exemplo, que o usuário de um programa utilize uma

funcionalidade do ambiente enquanto outras linhas de execução realizam outros

cálculos e operações.

Em hardwares equipados com uma única CPU, cada thread é processada de forma

aparentemente simultânea, pois a mudança entre uma thread e outra é feita de

forma tão rápida que para o utilizador isso está acontecendo paralelamente. Em

hardwares com múltiplos CPUs ou multi-cores, as threads são realizadas realmente

de forma simultânea;

Os sistemas que suportam apenas uma única thread (em real execução) são

chamados de monothread enquanto que os sistemas que suportam múltiplas

threads são chamados de multithread.

Exemplo Um exemplo simples pode ser expressado através de um jogo onde o mesmo pode

ser modelado com linhas de execução diferentes, sendo uma para desenho de

imagem e outra para áudio; Neste caso, há um thread para tratar rotinas de

desenho e outro thread para tratar áudio; No ponto de vista do usuário, a imagem

é desenhada ao mesmo tempo em que o áudio é emitido pelos alto-falantes;

Porém, para sistemas com uma única CPU, cada linha de execução é processada

por vez;

Particularidades Cada thread tem o mesmo contexto de software e compartilha o mesmo espaço de

memória (endereçado a um mesmo processo-pai), porém o contexto de hardware é

diferente. Sendo assim o overhead causado pelo escalonamento de uma thread é

muito menor do que o escalonamento de processos. Entretanto não há acesso

protegido à memória nativa (sua implementação fica a cargo do programador)

devido ao compartilhamento do espaço de memória.

Um dos benefícios do uso das threads advém do facto do processo poder ser

dividido em várias threads; quando uma thread está à espera de determinado

dispositivo de entrada/saída ou qualquer outro recurso do sistema, o processo

como um todo não fica parado, pois quando uma thread entra no estado de

'bloqueio', uma outra thread aguarda na fila de prontos para executar.

Page 13: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

13

Uma thread possui um conjunto de comportamentos padrão, normalmente

encontrados em qualquer implementação ou sistema operativo.

Uma thread pode:

criar outra da mesma forma que um processo, através do método thread-

create, onde a thread retorna um ID como primeiro argumento (resultado

da função de criação);

esperar outra thread se sincronizar, através do método join;

voluntariamente "desistir" da CPU por não precisar mais do processamento

proposto pela própria ou por vontade do utilizador. Feito através do método

thread-yield;

replicar-se sem a necessidade de duplicar todo o processo, economizando

assim memória, processamento da CPU e aproveitando o contexto

(variáveis, descritores, dispositivos de I/O).

Estados de uma linha de execução Uma thread pode assumir os seguintes estados:

Unstarted: logo após ser criada (antes do Start());

Running: após ser ativada (Start()) ou após método Resume();

Suspended: após método Suspended();

Stopped: após método Abort().

ULT e KLT Usualmente as threads são divididas em duas categorias: thread ao nível do

utilizador (em inglês: User-Level Thread (ULT)), e thread ao nível do núcleo (em

inglês: Kernel-Level Thread (KLT)).

Thread em modo usuário

Thread em modo kernel

Page 14: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

14

As threads da primeira categoria (ULT) são suportadas pela aplicação, sem

conhecimento do núcleo e geralmente são implementadas por pacotes de rotinas

(códigos para criar, terminar, escalonamento e armazenar contexto) fornecidas por

uma determinada biblioteca de uma linguagem, como é o caso da thread.h

(biblioteca padrão da linguagem C). Estas threads suportam as mesmas operações

que as threads KLT (criar, sincronizar, duplicar e abortar). Possuem como

vantagens a possibilidade de implementação em sistemas operativos que não

suportam nativamente este recurso, sendo geralmente mais rápidas e eficientes

pois dispensam o acesso ao núcleo. Evita assim mudança no modo de acesso, e a

estrutura de dados fica no espaço do utilizador, levando a uma significativa queda

de overhead, além de poder escolher entre as diversas formas de escalonamento

em que melhor se adequa.

A gestão da thread (KLT) não é realizada através do código do próprio programa;

todo o processo é subsidiado pelo SO. Esse modelo tem a vantagem de permitir o

suporte a multiprocessamento e o facto do bloqueio de uma linha de execução não

acarretar bloqueio de todo processo, não obstante, temos a desvantagem de ter

que mudar o tipo de acesso sempre que o escalonamento for necessário,

aumentando assim o tão temido overhead.

Há quatro operações básicas na gestão de threads: criar, terminar, thread join e

thread yield.

Criar (thread creation)

Basicamente uma thread pode criar outra(s), sendo que depois essas mesmas

threads são executas 'simultaneamente'. A thread criadora é a thread-mãe e a

thread criada é a thread-filho. Threads incluídas na função main quando executadas

podem criar threads-filho. No diagrama a seguir há a thread A que executa

inicialmente. Mais tarde é criada a thread B indicada no ponto amarelo. Depois de

criadas, a thread A e thread B executam simultaneamente. Em seguida a thread A

pode criar uma ou mais threads (por exemplo uma thread C). Depois de criada a

Page 15: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

15

thread C, há três threads executando simultaneamente e todas disputam o uso da

CPU. Entretanto, a thread que pode ser executada a qualquer momento não é de

conhecimento da CPU.

Terminar (thread termination)

Para maioria dos casos, as threads não são criadas e executadas eternamente.

Depois de terminado o seu objectivo, a thread termina. No facto, a thread que criou

estas duas threads-filho termina também, porque sua tarefa atribuída se completa.

Na matrix de multiplicação (matrix multiplication), uma vez que o valor de C[i,j] é

computado, a thread correspondente termina. Em geral quando a tarefa atribuída a

thread completa, a thread pode ser terminada. Além disso, se a thread-mãe

terminar, todas as threads filho terminam também. Porque isso é importante? Isso

é importante porque as threads-filho compartilham recursos com a thread-mãe,

incluindo variáveis. Quando a thread-mãe termina, todas as variáveis são perdidas

e a thread-filho não poderá aceder aos recursos que a thread-mãe possuia. Assim,

se a thread-mãe terminar mais cedo que a thread-filho haverá um problema! Uma

thread pode terminar das seguintes maneiras:

Retornando da sua rotina mais externa, a thread criadora.

Quando termina a rotina em que foi começada.

Chamando pthread_exit, fornecendo um estado de saída.

Terminando através da função pthread_cancel

Sincronizar(Thread Join)

Imagine a seguinte situação: Você está estudando para uma prova. Então você

pede o seu irmão mais novo para comprar uma pizza. Neste caso você é a thread

principal e seu irmão a thread-filho. Uma vez que você deu a ordem, você e seu

irmão começam a “executar uma tarefa” simultaneamente. Agora há dois casos a

se considerar: Primeiro: Seu irmão traz a pizza e termina enquanto você estuda.

Nesse caso você pode parar de estudar e comer a pizza. Segundo: Você acaba de

estudar mais cedo e dorme e depois a pizza chegará.

A junção de threads (thread join) é destinada para resolver este problema. A

thread pode executar o thread join e aguardar até a outra thread terminar. No caso

acima, você é a thread principal (thread main) e deve executar o thread

joinaguardando o seu irmão (thread-filho) terminar. Em geral o thread join é

utilizado para a thread-mãe se sincronizar com uma das threads-filho.

Thread Yield (Rendimento da thread)

Suponha que você executa um certo número de programas o tempo todo no

computador. Isso é possível devido a CPU escalonar pouco a pouco outros ciclos da

CPU, assim outros programas podem ser executados. Isso pode ser um problema

de política de planeamento do Sistema Operativo. Entretanto, quando escrevemos

programas com múltiplas threads, temos que fazer correctamente para que

algumas threads não ocupem a CPU eternamente, ou por um tempo muito longo

sem abandoná-lo. Senão terminar na situação acima quando uma ou duas threads

executam enquanto outras simplesmente esperam para retornar. Liberamos espaço

na memória graças a thread yield. Quando a thread executa o thread yield, a

execução da thread é suspensa e a CPU passa para uma outra thread em execução.

Essa thread aguardará até a CPU tornar-se disponível novamente.

Page 16: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

16

Escalonamento Da mesma forma que os processos sofrem escalonamento, as threads também têm

a mesma necessidade. Quando vários processos são executados em uma CPU, eles

dão a impressão que estão sendo executados simultaneamente. Com as threads

ocorre o mesmo, elas esperam até serem executadas. Como esta alternância é

muito rápida, há impressão de que todas as threads são executadas paralelamente.

Linha de execução ao nível do usuário

As ULT são escalonadas pelo programador, tendo a grande vantagem de cada

processo usar um algoritmo de escalonamento que melhor se adapte a situação, o

sistema operacional neste tipo de thread não faz o escalonamento, em geral ele

não sabe que elas existem. Neste modo o programador é responsável por criar,

executar, escalonar e destruir a thread. Um exemplo prático de processo chamado

P1 que contém tais threads: P1T1, P1T2 e P1T3, quando o sistema operacinal da a

CPU para o processo P1 cabe a ele destinar qual thread será executada, caso esta

thread use todo processo do quantum, o sistema operacional chamará outro

processo, e quando o processo P1 voltar a executar, P1T1 voltará a ser executada e

continuará executando até seu término ou intervenção de P1, este comportamento

não afetará outros processos pois o sistema continua escalonando os processos

normalmente.

Linha de execução ao nível do núcleo

As KLT são escalonadas diretamente pelo sistema operacional, comumente são

mais lentas que as Threads ULT pois a cada chamada elas necessitam consultar o

sistema, exigindo assim a mudança total de contexto do processador, memória e

outros níveis necessários para alternar um processo. Um exemplo prático de

processo chamado P2 que contém as threads P2T1, P2T2 e P2T3 e um processo

chamado P3 que contém as threads P3T1, P3T2 E P3T3. O Sistema Operacional não

entregará a CPU ao processo e sim a uma thread deste processo, note agora que o

sistema é responsável por escalonar as threads e este sistema tem que suportar

threads, a cada interrupção de thread é necessário mudar todo o contexto de CPU e

memória, porém as threads são independentes dos processos, podendo ser

executadas P3T2, P2T1, P2T2, P2T1, P3T1,P2T3,P3T3, ou seja a ordem em que o

escalonador do sistema determinar. Já com as threads em modo usuário não se

consegue ter a mesma independência, pois quando passamos o controle ao

processo, enquanto seu quantum for válido ele irá decidir que thread irá rodar. Um

escalonamento típico do sistema é onde o escalonador sempre escolhe a thread de

maior prioridade, que são divididas em duas classes: Real Time e Normal. Cada

thread ganha uma prioridade ao ser criada que varia de 0 a 31(0 é a menor e 31

maior), processos com prioridade 0 a 15(Real Time) tem prioridade ajustada no

tempo de execução como nos processos de E/S que tem a prioridade aumentada

variando o periférico, processos com prioridade 16 a 31 são executados até

terminar e não tem prioridade alterada, mas somente uma thread recebe a

prioridade zero que é a responsável por zerar páginas livres no sistema. Existe

ainda uma outra classe chamada de idle, uma classe mais baixa ainda, só é

executada quando não existem threads aptas, threads dessa classe não interferem

na performance.

Page 17: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

17

Comparação entre linha de execução e Processo Um sistema baseado em linha de execução é diferente de um sistema operacional

multi-tarefa tradicional, em que processos são tipicamente independentes,

carregam considerável estado da informação, tem endereço de memória separado e

interagem somente através de mecanismos de inter-processos de comunicação. As

threads, por outro lado, compartilham o estado da informação de processos únicos,

e compartilham memória e outros recursos diretamente.

A troca de contexto através de linha de execução num mesmo processo é

tipicamente mais rápida que a troca de contexto entre processos diferentes.

Sistemas como o Windows NT e o OS/2 são feitos para ter linha de execução

"baratas" e processos "caros", enquanto em outros sistemas operacionais não há

grandes diferenças.

O multithreading é um modelo de programação popular que permite a execução de

múltiplas linha de execução dentro de um contexto simples, compartilhando

recursos do processo, e capazes de executar de forma independente. O modelo de

programação em linha de execução fornece ao desenvolvedor uma execução

simultânea. Entretanto, a aplicação mais interessante da tecnologia ocorre quando

ela é utilizada em um processo simples permitindo uma execução paralela em

sistemas multi-processados.

Um sistema multi-threaded possui um melhor desempenho que um sistema de

computadores com múltiplas CPUs e com múltiplos núcleos, ou que um cluster de

máquinas. Isto acontece porque a linha de execução empresta a ela mesmo uma

execução simultânea. Em alguns casos, o programador precisa ter cuidado em

evitar condições de concorrência e outros comportamentos inesperados.

Para um dado ser manipulado corretamente, as linhas de execução freqüentemente

precisarão ser sincronizadas, para que os dados sejam processados na ordem

correta. As linha de execução podem também executar operações atômicas

(freqüentemente implementadas usando semáforos) com intuito de prevenir que

dados comuns sejam simultaneamente modificados ou lidos enquanto o processo

esta sendo modificado.

Os sistemas operacionais implementam as linhas de execução de duas formas:

multithreading preemptiva ou multithreadingcooperativa. A multithreading

preemptiva é geralmente considerada uma implementação superior, porque

permite ao sistema determinar quando uma troca de contexto pode acontecer. A

multithreading cooperativa, por outro lado, confia nas threadspara ceder o controle,

o que pode ser um problema caso uma tarefa “monopolize” o uso da CPU ou se

houver espera pela disponibilidade de um recurso. A desvantagem da multithread

preemptiva é que o sistema pode fazer uma troca em um tempo inapropriado,

causando uma inversão de prioridade ou outros efeitos ruins que podem ser

evitados por uma multithreadingcooperativa.

Em geral:

Criar um processo pode ser caro em termos de tempo, memória, e

sincronização entre processos.

Page 18: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

18

As linhas de execução podem ser criadas sem a replicação do processo

inteiro.

O trabalho de criar uma linha de execução pode ser feito no espaço do

usuário.

Como as linhas de execução partilham o espaço de endereçamento a

comunicação entre elas é mais rápida.

O tempo gasto para troca de linha de execução é menor, em parte por que

não há necessidade de troca de espaço de endereçamento.

Modelo de Geração de Multithreads

Modelo Muitos-Para-Um

O modelo muitos-para-um mapeia muitos threads de nível de usuário para threads

do kernel. O gerenciamento dos threads é realizado no espaço do usuário e assim é

eficiente, mas o processo inteiro ficará bloqueado. Além disso, como somente um

thread pode acessar o kernel de cada vez, múltiplos threads são incapazes de

executar em paralelo em multiprocessadores.1

Modelo Um-Para-Um

O modelo um-para-um mapeia cada thread de usuário para um thread de kernel,

gera mais concorrência do que o modelo muitos-para-um. Permite a um outro

thread ser executado, enquanto um thread realiza uma chamada de sistema de

bloqueio, ele também permite que múltiplos threads executem em paralelo em

multiprocessadores. A única desvantagem deste modelo é que a criação de um

thread de usuário requer a criação do correspondente thread de kernel.1

Modelo Muitos-Para-Muitos

O modelo muitos-para-muitos multiplexa muitos threads de nível de usuário para

um número menor ou igual de threads de kernel. O número de threads de kernel

pode ser específico tanto para uma aplicação em particular quanto para uma

máquina em particular. Os desenvolvedores podem criar tantos threads de usuário

quantos forem necessários, e os correspondentes threads de kernel podem

executar em paralelo em um multiprocessador. Além disso, quando um thread

realiza uma chamada de sistema de bloqueio, o kernel pode agendar um outro

thread para execução.1

Cancelamento O cancelamento de threads corresponde à tarefa de terminar um thread antes que

se complete. Por exemplo, se múltiplos threads estão pesquisando

concorrentemente em um banco de dados e um thread retorna o resultado, os

threads que ainda estão sendo executados podem ser cancelados. Uma outra

situação pode ocorrer quando um usuário pressionar um botão em um navegador

da Web. Com frequência, uma página da Web é carregada em um thread separado.

Quando um usuário pressionar o botão stop, o thread que estava carregando a

página é cancelado. Um thread que está para ser cancelado é frequêntemente

denominado thread-alvo.1

Exemplos

Java

import java.io.*;

Page 19: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

19

public class Example implements Runnable

{

static Thread threadCalculate; // Cria o thread.

static Thread threadListen;

long totalPrimesFound = 0;

public static void main (String[] args)

{

Example e = new Example();

threadCalculate = new Thread(e);

threadListen = new Thread(e);

threadCalculate.start();

threadListen.start();

}

public void run()

{

Thread currentThread = Thread.currentThread();

if (currentThread == threadCalculate)

calculatePrimes();

else if (currentThread == threadListen)

listenForStop();

}

public void calculatePrimes()

{

int n = 1;

while (true)

{

n++;

boolean isPrime = true;

for (int i = 2; i < n; i++)

if ((n / i) * i == n)

{

isPrime = false;

break;

}

if (isPrime)

{

totalPrimesFound++;

System.out.println(n);

}

Page 20: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

20

}

}

private void listenForStop()

{

BufferedReader input = new BufferedReader(new

InputStreamReader(System.in));

String line = "";

while (!line.equals("stop"))

{

try

{

line = input.readLine();

}

catch (IOException exception) {}

}

System.out.println("Found " + totalPrimesFound +

" prime numbers before you said stop");

System.exit(0);

}

}

Java, exemplo simples em português

import java.util.logging.Level;

import java.util.logging.Logger;

class Threaded extends Thread {

Synchronized1 base;

public Threaded( Synchronized1 bse ) {

this.base = bse;

}

}

public class Synchronized1 {

public Synchronized1() {

}

public void ini() {

new Threaded( this ) {

public void run() {

while( true ) {

synchronized( base ) {

Page 21: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

21

System.out.print( "Este é A, agora vai mostrar

B.\n" );

try {

Thread.sleep(1000);

} catch (InterruptedException ex) {

Logger.getLogger(Synchronized1.class.getName()).log(Level.SEVERE,

null, ex);

}

try {

base.notify();

base.wait();

} catch (InterruptedException ex) {

Logger.getLogger(Synchronized1.class.getName()).log(Level.SEVERE,

null, ex);

}

}

}

}

}.start();

new Threaded( this ) {

public void run() {

while( true ) {

synchronized( base ) {

System.out.print( "Este é B, então foi já

mostrado A.\n" );

try {

Thread.sleep(1000);

} catch (InterruptedException ex) {

Logger.getLogger(Synchronized1.class.getName()).log(Level.SEVERE,

null, ex);

}

try {

base.notify();

base.wait();

} catch (InterruptedException ex) {

Logger.getLogger(Synchronized1.class.getName()).log(Level.SEVERE,

null, ex);

}

}

}

Page 22: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

22

}

}.start();

}

public static void main(String[] args) {

new Synchronized1().ini();

}

}

C

#include <stdio.h>

#include <stdlib.h>

#include <pthread.h>

#define THREADS_MAX 4

void *function(void *param)

{

int id = (int)param;

int i, loops = 10;

for(i = 0; i < loops; i++)

{

printf("thread %d: loop %d\n", id, i);

}

pthread_exit(NULL);

}

int main(void)

{

pthread_t threads[THREADS_MAX];

int i;

printf("pre-execution\n");

for (i = 0; i < THREADS_MAX; i++)

{

pthread_create(&threads[i], NULL, function, (void *)i);

}

printf("mid-execution\n");

for (i = 0; i < THREADS_MAX; i++)

{

pthread_join(threads[i], NULL);

}

printf("post-execution\n");

return EXIT_SUCCESS;

}

C++

#include <iostream>

#include <boost/thread/thread.hpp>

Page 23: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

23

using namespace std;

const int THREADS_MAX = 4;

struct function

{

function( const int &_id )

: id( _id )

{ }

void operator()()

{

for( int i = 0; i < 10; ++i )

{

cout << "thread " << id << ": loop " << i << endl;

}

}

private:

const int id;

};

int main(void)

{

boost::thread_group threads;

cout << "pre-execution" << endl;

for( int i = 0; i < THREADS_MAX; ++i )

{

threads.create_thread( function( i ) );

}

cout << "mid-execution" << endl;

threads.join_all();

cout << "post-execution" << endl;

return 0;

}

Ruby

count = 0

a = Thread.new { loop { count += 1 } }

sleep(0.1)

Thread.kill(a)

puts count #=> 93947

Delphi

unit UExemplo;

interface

Page 24: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

24

uses

Classes, Generics.Collections;

type

TThreadExemplo = class(TThread)

private

FPrimeiroNumero: Integer;

FUltimoNumero: Integer;

FListaPrimos : TList<Integer>;

function IsPrimo(const pNumero : Integer) : Boolean;

protected

procedure Execute; override;

public

constructor Create(const pCreateSuspended: Boolean; const

pPrimeiroNumero, pUltimoNumero: Integer);

destructor Destroy; override;

property PrimeiroNumero: Integer read FPrimeiroNumero write

FPrimeiroNumero;

property UltimoNumero: Integer read FUltimoNumero write

FUltimoNumero;

function GetListaAsString: String;

end;

implementation

uses

SysUtils;

{ TThreadExemplo }

constructor TThreadExemplo.Create(const pCreateSuspended: Boolean;

const pPrimeiroNumero, pUltimoNumero: Integer);

begin

inherited Create(pCreateSuspended);

FListaPrimos := TList<Integer>.Create;

FPrimeiroNumero := pPrimeiroNumero;

FUltimoNumero := pUltimoNumero;

end;

destructor TThreadExemplo.Destroy;

begin

FListaPrimos.Free;

Page 25: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

25

inherited;

end;

procedure TThreadExemplo.Execute;

var

lNumero: Integer;

begin

lNumero := FPrimeiroNumero;

while not Terminated and (lNumero <= FUltimoNumero) do

begin

if IsPrimo(lNumero) then

begin

FListaPrimos.Add(lNumero);

end;

Inc(lNumero);

end;

end;

function TThreadExemplo.GetListaAsString: String;

var

lNum: Integer;

begin

Result := EmptyStr;

for lNum in FListaPrimos do

begin

Result := Result + IntToStr(lNum) + sLineBreak;

end;

end;

function TThreadExemplo.IsPrimo(const pNumero: Integer): Boolean;

var

lNum: Integer;

lMax: Integer;

begin

Result := True;

lNum := 2;

lMax := (pNumero div 2);

while Result and not Terminated and (lNum <= lMax) do

begin

Result := pNumero mod lNum <> 0;

Inc(lNum);

end;

Page 26: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

26

end;

end.

Multitarefa Em computação, Multitarefa é a característica dos sistemas operativos que permite

repartir a utilização do processador entre várias tarefas aparentemente

simultaneamente.

História O primeiro sistema informatizado a usar multitarefa foi o britânico LEO III,

completado 1961. A multitarefa preemptiva foi implementada nas versões iniciais

do Unix em 1969, e é o padrão no Unix e em sistemas operacionais similares,

incluindo Linux, Solaris e BSD em suas variações.

Pode parecer, actualmente, difícil de imaginar um computador monotarefa, i.e., que

apenas permita utilizar uma aplicação mas, de facto, houve um percurso histórico

notável até se atingir o nível actual de paralelização de processos. Com efeito, os

primeiros computadores apenas permitiam executar uma única tarefa de cada vez.

O Apple DOS é um excelente exemplo disso, já que foi dos primeiros sistemas

operativos para computadores pessoais.

O primeiro passo para a multitarefa no MS-DOS foi a criação dos TSR's (Terminate

and Stay Resident), pequenos programas que permaneciam em memória enquanto

se executava outro programa, e que podiam instalar rotinas de tratamento de

interrupções para serem ativados posteriormente. Ou seja, estando o utilizador a

escrever um texto num processador de texto, por exemplo, poderia apertar uma

combinação de teclas que dispararia uma interrupção e chamaria a TSR de uma

agenda pessoal para tirar notas. Assim, do ponto de vista do processador, o

processo do processador de texto era bloqueado e passava-se o controle para a

agenda. Quando o utilizador terminasse, voltava-se ao processador. Ambos

programas coexistiam, mas não podiam ser executados simultâneamente.

O passo seguinte foi a emulação de multitarefa. Exemplos disto eram as primeiras

versões de Windows, que este executava sobre DOS (monotarefa), mas o núcleo do

Windows fazia a sua própria gestão dos processos. Curiosamente, se um processo

bloqueasse o Windows, todas as aplicações teriam que ser terminadas pois eram

todas dependentes.

Posteriormente, surgiu uma das principais componentes dos SO actuais: o

escalonador de processos, ou (em inglês) scheduler, que faria a gestão,

qualificação e o gerenciamento de prioridade dos processos sem afectar o núcleo do

sistema operativo. Ou seja, todas as tarefas núcleo são críticas, e todo o tempo que

sobrar é legado aos processos. Adivinha-se, portanto, a necessidade de estabilizar

o núcleo, por forma a minimizar o tempo de execução de tarefas internas.

O escalonador de processos é uma componente muito polêmica em termos de

inovação e de aplicações. Dependendo das situações, um escalonador de processos

deve gerir os seus processos por forma a diminuir a latência entre aplicações

Page 27: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

27

interactivas, ou assegurar a coerência em termos de critérios no escalonamento: se

uma tarefa não é crítica, então não devia estar a ser executada.

Tarefas Os conceitos ligados ao paralelismo de tarefas não são consensuais. A linguagem

vulgar no UNIX sugere, no entanto, alguns termos razoavelmente universais.

No UNIX, existem dois níveis de tarefa: o processo e a thread. Os processos têm

uma série de threads associadas. Tipicamente, cada processo tem um determinado

espaço de endereçamento que as diferentes threads partilham. Cada thread tem o

seu próprio estado de processador e a sua própria pilha.

Alternância de tarefas Cada processador pode executar apenas um programa de cada vez. Por esta razão,

a multitarefa num sistema uniprocessador é apenas uma ilusão conseguida com a

alternância rápida entre as várias tarefas.

O núcleo do sistema operativo é responsável por isolar os contextos de execução

das diversas tarefas. Para conseguir isto, é necessário que uma rotina do núcleo

seja chamada a dada altura. Essa rotina (que pode ser chamada por uma

interrupção provocada por um temporizador interno do computador) geralmente

executa as seguintes operações:

Salva o estado do processador numa estrutura de dados do núcleo (a árvore

de processos);

Seleciona, com base num algoritmo, a próxima tarefa a executar;

Se for necessário, reconfigura o espaço de endereçamento de modo a que a

próxima tarefa encontre a memória no estado que espera;

Carrega o estado do processador referente à tarefa que vai receber tempo

de processador;

A rotina retorna permitindo que o programa execute.

No Mundo das Placas-mãe para PCs

Quais as melhores marcas?

Principais características técnicas

Atualmente no mercado mundial há muitos e muitos modelos de placas-mãe, e

com as mais diversas configurações tecnológicas – configurações bem básicas as

mais sofisticadas e avançadas.

Como exemplos, placas-mãe que suportam somente memória SDR (Single Data

Rate ou Taxas de dados transmitidos no modo simples – cada ciclo de pulso

transmite um dado por segundo), sendo que cada módulo de memória SDR possui

168 vias; Placas-mãe que suportam memóriasSDR e DDR (Double Data Rate ou

Taxas de dados transmitidos em dobro – cada ciclo de pulso transmite 2 dados),

sendo que cada módulo de memória SDR possui 184 vias.

E ainda, placas-mãe que suportam módulos de memórias do tipo

DDR2/DDR3/DDR4 (Double Data Rate ou Taxas de dados transmitidos em dobro ou

Page 28: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

28

em quatro, ou seja, cada ciclo de pulso transmite 2 ou quatro dados), sendo que

cada módulo de memória DDR2/3/4 possui 240 vias elétricas.

Este modelo de placa-mãe desta imagem acima, por exemplo, é do tipo

"multiprocessadores". Ou seja, suporta quatro processadores AMD Opteron 6100

Series Processors (Magny-Cours) com tecnologia de 45 nm, sendo que cada

processador pode contar com 8 Cores (8 núcleos - 4 físicos e 4 lógicos) ou com 12

Cores (12 núcleos - 6 físicos e 6 lógicos), desta forma, um total de 32 a48 núcleos;

esta placa-mãe conta ainda com 32 slots para módulos de memória DDR3 de 16 GB

cada, portanto, totalizando 512 GB de memória instalada. Mais informações nestes

links abaixo:

http://www.tyan.com/product_SKU_spec.aspx?ProductType=MB&pid=670&SKU=600000180

http://www.kabum.com.br/cgi-

local/kabum3/produtos/descricao.cgi?id=01:01:11:69:26410&tag=

As memórias DDR2/3/4 operam com altas freqüências de clock, como no modo de

800 MHz (máximo para as DDR2 e mínimo para as DDR3), devido a técnica QDR

(Quad Data Rate ou Taxas de dados transmitidas de quatros em quatro dados por

segundo – cada ciclo de pulso transmite 4 dados). Neste caso a freqüência original

da memória é 200 MHz, mas como aproveitam cada ciclo de pulso para levar quatro

dados (dois dados na rampa de subida e dois na rampa de decida), é como se ela

estivesse operando à 800 MHz, por segundo.

Além do suporte para vários tipos de memórias, algumas placas-mãe também

suportam redes Gigabits, redes Wireless (sem fio), bus PCI Express x1 e x16

(imagem abaixo, direita), este substituto do bus AGP (imagem abaixo, esquerda);

somente HDs SATA (Serial ATA) e/ou SATA+PATA+SSD (Serial ATA+Parallel

ATA+). E a cada novo modelo de placa-mãe, o suporte as novas tecnologias

também aumentam.

Page 29: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

29

As melhores marcas

Ao ler esta matéria muitos poderão dizer que estamos fazendo chover no molhado,

pode até ser. Porém, muitos e muitos usuários de microcomputadores estão

fazendo a mesma pergunta: “Quais são as melhores marcas de placas-mãe?”.

Isto porque – como acontece com as fontes de alimentação para

microcomputadores –, também estamos no “Mundo das placas-mãe para PCs”,

mundo este que conta com muitos fabricantes que realmente fabricam placas-mãe,

e também, empresas que não fabricam, mas que colocam suas marcas em modelos

de placas-mãe, e desta forma, ficam conhecidas no mercado nacional e

internacional.

Também pode ocorrer de alguns modelos de placas-mãe serem das melhores

marcas, mas não serem de boa qualidade. Outro fator de suma importância para

que uma ótima placa-mãe corresponda 100% de sua capacidade, refere-se a

montagem do microcomputador. Emparafusar a placa-mãe e outros componentes

no gabinete é uma coisa, montar o microcomputador é outra coisa muito diferente

– é uma arte para poucos.

A placa principal dos microcomputadores que recebe o chip (ou chips) CPU

(processador para dados), e também, que recebe muitos outros chips que são

integrados nela, também é conhecida por outros nomes, tais como: Placa-Mãe,

Placa de Sistema, Placa Principal, CPU Board, Main-Board.

Quanto aos preços dos modelos de placas-mãe, dependerá do modelo – se é antigo

ou recente –, dos recursos técnicos integrados (chips de som, de vídeo, de rede,

chipset e outros no modo on-boards), ou dos recursos técnicos não integrados, mas

que são suportados, como: placas externas off-boards (placas aceleradoras

gráficas, CPUs, etc.).

Placas-mãe multi CPUs

Já com relação aos modelos de Placas-mãe existentes, os mesmos são inúmeros;

os recursos tecnológicos que as mesmas suportam vão dos mais fracos aos

recursos mais potentes. Como exemplo, alguns modelos de placas-mãe suportam

QUATRO CPUs (processadores para dados) e , como o modelo da imagem acima,

Page 30: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

30

modelos como o da imagem são conhecidas por placas-mãe para

multiprocessadores. Neste caso, o recurso é conhecido por multiprocessamento.

E para que a placa-mãe suporte o multiprocessamento de dados, ela deve suportar

a tecnologia conhecida por SMP (Symmetric Multprocessing ou algo como

Multiprocessamento de dados por dois ou mais processadores, conjuntamente).

Esta técnica é empregada quando se deseja que os dados sejam processados por

duas (ou mais) CPUs – no modo paralelo –, dividindo-se assim a carga que estaria

reservada a um único processador.

Placas-mãe multi CPUs/GPUs

Já alguns modelos de placas-mãe podem suportar até SETE GPUs (processadores

para dados gráficos integrados nas placas aceleradoras gráficas modernas, como

este modelo destes links abaixo:

http://www.baboo.com.br/conteudo/articlefiles/37786-01.jpg

http://www.evga.com/forums/tm.aspx?m=124528&mpage=1

Este modelo de placa-mãe da imagem acima e dos links acima (a EVGA (socket

LGA1366) modelo 270-GT-W555, com chipset Intel X58 integrado) realmente é

muito potente, pois suporta SETE placas aceleradoras gráficas e DOIS

processadores de 8 núcleos (4 físicos e quatro lógicos), totalizando 16 núcleos para

processamentos de dados binários; possui ainda 12 slots para módulos de memória

SDRAM DDR3, portanto, pode suportar ate 48 GB (12 slots x 4 GB de cada

módulo).

Componentes integrados nas placas-mãe

Nas placas-mãe – nos modelos antigos e modernos também – podemos ver as

interfaces (portas) para o teclado e mouse (PS/2 e USB); os conectores para a

fonte de alimentação (4, 8, 20 e 24 pinos); a bateria (20/32) e chip CMOS (a partir

Page 31: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

31

do 286); os chips VLSI, mais conhecido por chipset; os slots ISA de 8 e 16 bits e

Slots VLB; os slots PCI de 32 bits, AGP e PCI-Express x1 e x16; o chip de memória

ROM/FlashROM BIOS; as interfaces para discos rígidos (IDE/PATA e IDE/SATA); a

interface para drives de disquetes (esta já foi extinta); as interfaces para portas

seriais e paralela; o socket (ou sockets, nos modelos de placas-mãe modernas)

para o microprocessador e co-processadores (nas placas 286 e 386), entre muitos

outros componentes integrados nas placas-mãe.

Os tipos de placas-mãe Os tipos de Placas-mãe vão desde uma XT (Extended Technology ou Tecnologia

estendida); umaAT (Advanced Technology ou Tecnologia avançada, a partir do

286), até as revolucionárias placas-mãe ATX (Advanced Technology Extended ou

Tecnologia Avançada e Estendida). A Intel desenvolveu o tipo BTX (Balanced

Technology Extended – Tecnologia estendida e balanceada) para os novos modelos

de gabinetes para microcomputadores – e respectivas placas-mãe e fontes que

seriam instaladas nestes gabinetes.

Os Fabricantes e Marcas de placas-mãe

Como já foi citado acima, no “Mundo das placas-mãe”, mundo este que conta com

muitas empresas que realmente fabricam placas-mãe, e também, empresas que

não fabricam, mas que colocam suas marcas em modelos de placas-mãe e desta

forma ficam conhecidas no mercado.

As melhores marcas – Quais são elas?

Ao ler esta matéria muitos poderão dizer que estamos fazendo chover no molhado,

ou seja, repetindo aquilo que muitos usuários (principalmente técnicos) de

microcomputadores já sabem, pode até ser. Porém, muitos e muitos usuários de

microcomputadores estão fazendo a mesma pergunta: “Quais são as melhores

marcas de placas-mãe?”.

E pela ordem, levando em conta requisitos, tais como: qualidade, aceitação do

mercado nacional e mundial, mais as análises de especialistas. E aqui também vale

a minha experiência de mais de 12 anos trabalhando com placas-mãe, sendo que

placas-mãe que menos dão problemas são os modelos produzidos pela empresa

Gigabyte.

Placas-mãe do “Top 15 ” são as seguintes:

> Gigabyte, Asus , MSI, *Intel, ECS, Zotac, EVGA, Foxcomm, XFX, TYAN,

Phitronics, Sapphire Technology, ABIT, VS Company e Micronic Computer

INC <

*A Intel não é primeira da lista, e pelo seguinte: A empresa Foxconn também

fabrica placas-mãe para a Intel (confira no link abaixo). Portanto, ao comprar

modelos de placas-mãe da Intel, na verdade esses modelos podem ter sidos

fabricados pela Foxconn.

Page 32: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

32

http://pt.wikipedia.org/wiki/Anexo:Lista_de_fabricantes_de_hardware#Placa-M.C3.A3e

Os fabricantes de placas-mãe – Quais são?

É interessante observar que, quando se fala em placas-mãe – na verdade nos

fabricantes, respectivas marcas e modelos de placas-mãe – somente dois ou três

nomes são citados: Asus, Gigabyte e MSI.

Porém, já existiram (ou ainda existem) uma boa quantidade de empresas que

fabricam placas-mãe (ou apenas usam seus nomes nelas), como estas da lista (e

do link) abaixo:

( http://www.clubedohardware.com.br/artigos/970 )

>Asus, ABIT, Asrock, Aopen, Albatron, Amptron; BCM, BFG Technologies, Biostar;

Chaintech, Chantec. DFI (Design For Innovation), Digitron; ECS (Elite Group),

EVGA, EpoX; FIC, Foxconn; Gigabyte; Intel, IWILL; Jetway; Kinpo Electronic;

Mercury, Magic Pro, Mach Speed, MSI (Micro-Star International), Mitac

international, Micronic Computer INC; Netgate; PCWare, Phitronics, PCChips, PC-

Micro; Positivo (modelo POS MI945AA, por exemplo, modelo cedido pela MSI);

Soyo, Shuttle Computer, Soltek, Supermicro; TYAN; USI (Universal Scientific

Industrial), Universal Abit; VIA Tecnology, VS Company; XFX, Zotac; e muitas

outras fabricantes de placas-mãe de menor expressão no enorme mercado

mundial.

Os fabricantes de hardware – Quais são?

Se a lista de empresas que fabricam placas-mãe já é grande, imagine a lista dos

fabricantes de hardwares para os microcomputadores. Para isto basta conferir

neste link abaixo:

http://pt.wikipedia.org/wiki/Anexo:Lista_de_fabricantes_de_hardware#Placa-M.C3.A3e

Tecnologia SMP (Symmetric Mult Processing)

Este termo se refere a tecnologia para Multiprocessamentos de dados por dois ou

mais processadores instalados numa mesma placa-mãe, e operando conjuntamente

numa mesma placa-mãe. Na primeira imagem acima vemos um modelo de placa-

mãe que opera com quatro processadores.

Page 33: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

33

Esta técnica é bem empregada quando se deseja que os dados sejam processados

por duas CPUs (no modo paralelo), dividindo-se assim, a carga que estaria

reservada a um único processador.

Vale lembrar aqui que no modo SMP de dois processadores operando a 2 GHz

cada, não será o mesmo que se a máquina estivesse operando a 4 GHz, como

ocorre no modo Dual Core (DC). No modo DC todo o processamento torna-se mais

estável, contínuo, seguro e mais rápido também, já que é como se a máquina

contasse com um processador operando a 4 GHz.

No modo SMP moderno, todo o processamento também se torna mais estável,

contínuo e seguro, podendo operar mais rápido ainda já que a máquina conta com

duas CPUs DualCore e opera como se existisse somente um processador operando

a 3 GHz, por exemplo. Entretanto, em termo de estabilidade no processamento o

desempenho da máquina é muito superior caso ele contasse com um processador

somente.

Nesta técnica ou arranjo SMP, cada CPU possui e usa seu próprio cachê L1 e L2 e,

como bem mostra a figura acima (da esquerda), caso a CPU 1 necessite de um

determinado dado e este dado não se encontre gravado no L1 (este geralmente

reservado para a gravação temporária de códigos e instruções utilizados pela

respectiva CPU) e também não se encontre na L2 (este sempre reservado para a

gravação temporária de dados que já foram ou serão processados pela respectiva

CPU). A CPU 1 terá que buscar o dado (ou dados) diretamente na memória RAM

(observe todo o processo acompanhando a imagem acima, a esquerda).

Observar ainda o seguinte: quando o cachê L1 é reservado somente para códigos e

instruções, a CPU acessa diretamente o L2 em busca do respectivo dado. Caso não

encontre o respectivo dado ela buscará na memória RAM usando o bus (barramento

para o tráfego de sinais digitais na placa-mãe), o FSB (Front Side Bus) e o

bus MB (Memory Bus – barramento da memória), como pode ser visto na imagem

acima (esquerda).

Atualmente o controlador de memória não mais se encontra no Chipset North

bridge, e sim, está integrado no próprio chip do processador (processadores da

AMD e da Intel). Portanto, não mais utiliza o lento FSB e as comunicações entre a

CPU (ou CPUs) tornam muito mais rápidas – veja um exemplo na imagem acima,

da direita.

Como exemplo, o processador DualCore Intel Core 2 Duo E8400, 1600 MHz (6 x

267) possui umL1 (Level 1) contando com 64 KB (sendo 32 KB para a paridade –

códigos para verificação de erros nos bits de dados; e 32 KB para o ECC – Error

Corretion Code, Códigos para a correção de erros). Já o L2 é de 6 MB para a

gravação temporária de dados já processados pela CPU, no modo de On-Die, ECC,

Full-Speed.

Alguns termos técnicos usados

As áreas da informática moderna estão repletas de inúmeros termos técnicos.

Porém, aqui, apresentamos alguns termos técnicos relacionados com esta matéria

em questão.

Page 34: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

34

Somos de opinião que todos os professores de informática deveriam orientar seus

alunos – já nas primeiras aulas – para que os mesmos estudem os termos técnicos

desta vasta área. Com isto, eles notarão que fica mais fácil estudar, aprender e

conhecer os assuntos que estão estudando naquele momento – e os posteriores

também.

AGP (Acelerated Graphics Port – Porta para aceleradora gráfica);

ALU (Arithmetic Logic Unit – Unidade para processamento de dados aritméticos);

AMD (Advanced Micro Device – Refere ao segundo maior fabricante de CPUs – em

primeiro está a Intel);

BIOS (Basic Input/output System – Sistema básico de entrada e saída);

CMOS (Complementary Metal Oxide Semicondutor – Semicondutor metal-óxido

complementar);

CPU (Central Processing Unit – Unidade para processamento de dados binários –

imagem acima, esquerda);

DC (Dual Core – Núcleo duplo, processadores com 2 núcleos internos);

FlashROM (Flash Read Only Memory – Memória para leituras e escritas rápidas)

FSB (Front Side Bus – Barramento frontal superior);

GPU (Graphic Processing Unit – Unidade para o processamento de dados gráficos –

imagem acima, direita);

L1/L2 (Level 1 e 2 – Memória cachê Nível 1 e 2 no núcleo (ou núcleos) do

processador);

PATA (Parallel Attachment Technology Advanced – Tecnologia avançada para

conexão paralela);

Page 35: Multiprocessamento Simétrico, Sistema Distribuído, Multinúcleo, Thread, Multitarefa

35

PCI-Express (Peripheral Component Interconnect Express – Conexão expressa

para componentes e periférico);

PS/2 (Port Serial 2 – Porta serial versão 2);

ROM (Read Only Memory – Memória para somente leitura);

SATA (Serial Attachment Technology Advanced – Tecnologia avançada para

conexão serial);

USB (Universal Serial Bus – Barramento universal serial);