Você está na página 1de 142

Computador

Um assistente pessoal digital


Um computador pessoal
Columbia, um supercomputador da NASA
Denomina-se computador uma máquina capaz de
variados tipos de tratamento automático de informações
ou processamento de dados. Exemplos de computadores
incluem o ábaco, a calculadora, o computador
analógico e o computador digital. Um computador pode
prover-se de inúmeros atributos, dentre eles
armazenamento de dados, processamento de dados,
cálculo em grande escala, desenho industrial, tratamento de imagens gráficas,
realidade virtual, entretenimento e cultura.
No passado, o termo já foi aplicado a pessoas responsáveis por algum cálculo.
Em geral, entende-se por computador um sistema físico que realiza algum tipo
de computação. Existe ainda o conceito matemático rigoroso, utilizado na teoria
da computação.
Assumiu-se que os computadores pessoais e laptops são ícones da Era da
Informação1; e isto é o que muitas pessoas consideram como "computador".
Entretanto, atualmente as formas mais comuns de computador em uso são os
sistemas embarcados, pequenos dispositivos usados para controlar outros
dispositivos, como robôs, câmeras digitais ou brinquedos.

História dos computadores

As primeiras máquinas de computar


Pascaline, máquina calculadora feita por Blaise Pascal
John Napier (1550-1617), escocês inventor dos
logaritmos, também inventou os ossos de Napier, que eram
tabelas de multiplicação gravadas em bastão, o que
evitava a memorização da tabuada.
A primeira máquina de verdade foi construída por Wilhelm Schickard (1592-
1635), sendo capaz de somar, subtrair, multiplicar e dividir. Essa máquina foi
perdida durante a guerra dos trinta anos, sendo que recentemente foi
encontrada alguma documentação sobre ela. Durante muitos anos nada se soube
sobre essa máquina, por isso, atribuía-se a Blaise Pascal (1623-1662) a
construção da primeira máquina calculadora, que fazia apenas somas e
subtrações.

1SILVEIRA (2004) Inclusão Digital e Software Livre, p. 74.


A máquina Pascal foi criada com objetivo de ajudar seu pai a computar os
impostos em Rouen, França. O projeto de Pascal foi bastante aprimorado pelo
matemático alemão Gottfried Wilhelm Leibniz (1646-1726), que também
inventou o cálculo, o qual sonhou que, um dia no futuro, todo o raciocínio
pudesse ser substituído pelo girar de uma simples alavanca.
Todas essas máquinas, porém, estavam longe de ser um computador de uso
geral, pois não eram programáveis. Isto quer dizer que a entrada era feita
apenas de números, mas não de instruções a respeito do que fazer com os
números.

Babbage
Réplica (parte) do Calculador Diferencial criado por Charles
Babbage
A origem da idéia de programar uma máquina vem
da necessidade de que as máquinas de tecer
produzissem padrões de cores diferentes. Assim, no século
XVIII foi criada uma forma de representar os padrões em
cartões de papel perfurado, que eram tratados
manualmente. Em 1801, Joseph Marie Jacquard (1752-1834) inventa um tear
mecânico, com uma leitora automática de cartões.
A idéia de Jacquard atravessou o Canal da Mancha, onde inspirou Charles
Babbage (1792-1871), um professor de matemática de Cambridge, a desenvolver
uma máquina de “tecer números”, uma máquina de calcular onde a forma de
calcular pudesse ser controlada por cartões.
Tudo começou com a tentativa de desenvolver uma máquina capaz de calcular
polinômios por meio de diferenças, o calculador diferencial. Enquanto projetava
seu calculador diferencial, a idéia de Jacquard fez com que Babbage imaginasse
uma nova e mais complexa máquina, o calculador analítico, extremamente
semelhante ao computador atual.
Sua parte principal seria um conjunto de rodas dentadas, o moinho, formando
uma máquina de somar com precisão de cinquenta dígitos. As instruções seriam
lidas de cartões perfurados. Os cartões seriam lidos em um dispositivo de
entrada e armazenados, para futuras referências, em um banco de mil
registradores. Cada um dos registradores seria capaz de armazenar um número
de cinquenta dígitos, que poderiam ser colocados lá por meio de cartões a partir
do resultado de um dos cálculos do moinho.
Além disso tudo, Babbage imaginou a primeira máquina de impressão, que
imprimiria os resultados dos cálculos, contidos nos registradores. Babbage
conseguiu, durante algum tempo, fundos para sua pesquisa, porém não
conseguiu completar sua máquina no tempo prometido e não recebeu mais
dinheiro. Hoje, partes de sua máquina podem ser vistas no Museu Britânico, que
também construiu uma versão completa, utilizando as técnicas disponíveis na
época.
Junto com Babbage, trabalhou a jovem Ada Augusta, filha do poeta Lord Byron,
conhecida como Lady Lovelace e Ada Lovelace. Ada foi a primeira programadora
da história, projetando e explicando, a pedido de Babbage, programas para a
máquina inexistente. Ada inventou os conceitos de subrotina, uma seqüência de
instruções que pode ser usada várias vezes, loop, uma instrução que permite a
repetição de uma seqüência de cartões, e do salto condicional, que permite
saltar algum cartão caso uma condição seja satisfeita.
Ada Lovelace e Charles Babbage estavam avançados demais para o seu tempo,
tanto que até a década de 1940, nada se inventou parecido com seu computador
analítico. Até essa época foram construídas muitas máquinas mecânicas de
somar destinadas a controlar negócios (principalmente caixas registradoras) e
algumas máquinas inspiradas na calculadora diferencial de Babbage, para
realizar cálculos de engenharia (que não alcançaram grande sucesso).

A máquina de tabular
O próximo avanço dos computadores foi feito pelo americano Herman Hollerith
(1860-1929), que inventou uma máquina capaz de processar dados baseada na
separação de cartões perfurados (pelos seus furos). A máquina de Hollerith foi
utilizada para auxiliar no censo de 1890, reduzindo o tempo de processamento
de dados de sete anos, do censo anterior, para apenas dois anos e meio. Ela foi
também pioneira ao utilizar a eletricidade na separação, contagem e tabulação
dos cartões.
A empresa fundada por Hollerith é hoje conhecida como International Business
Machines, ou IBM.

Os primeiros computadores de uso geral


Z1, computador eletro-mecânico construído por Konrad Zuse
O primeiro computador eletro-mecânico foi
construído por Konrad Zuse (1910–1995). Em 1936, esse
engenheiro alemão construiu, a partir de relês
que executavam os cálculos e dados lidos em fitas
perfuradas, o Z1. Zuse tentou vender o computador
ao governo alemão, que desprezou a oferta, já que
não poderia auxiliar no esforço de guerra. Os projetos de Zuse ficariam parados
durante a guerra, dando a chance aos americanos de desenvolver seus
computadores.
Foi na Segunda Guerra Mundial que realmente nasceram os computadores
atuais. A Marinha americana, em conjunto com a Universidade de Harvard,
desenvolveu o computador Harvard Mark I, projetado pelo professor Howard
Aiken, com base no calculador analítico de Babbage. O Mark I ocupava 120m³
aproximadamente, conseguindo multiplicar dois números de dez dígitos em três
segundos.
Simultaneamente, e em segredo, o Exército Americano desenvolvia um projeto
semelhante, chefiado pelos engenheiros J. Presper Eckert e John Mauchy, cujo
resultado foi o primeiro computador a válvulas, o Eletronic Numeric Integrator
And Calculator (ENIAC)2, capaz de fazer quinhentas multiplicações por segundo.
Tendo sido projetado para calcular trajetórias balísticas, o ENIAC foi mantido em
segredo pelo governo americano até o final da guerra, quando foi anunciado ao
mundo.
ENIAC, computador desenvolvido pelo Exército Americano
No ENIAC, o programa era feito rearranjando a fiação
em um painel. Nesse ponto John von Neumann propôs a
idéia que transformou os calculadores eletrônicos em
“cérebros eletrônicos”: modelar a arquitetura do
computador segundo o sistema nervoso central.
Para isso, eles teriam que ter três características:
1. Codificar as instruções de uma forma possível de
ser armazenada na memória do computador. Von Neumann sugeriu que fossem
usados uns e zeros.
2. Armazenar as instruções na memória, bem como toda e qualquer informação
necessária a execução da tarefa, e
3. Quando processar o programa, buscar as instruções diretamente na
memória, ao invés de lerem um novo cartão perfurado a cada passo.
Visão simplificada da arquitetura de Von Neumann
Este é o conceito de programa armazenado,
cujas principais vantagens são: rapidez,
versatilidade e automodificação. Assim,
o computador programável que
conhecemos hoje, onde o programa e os dados
estão armazenados na memória ficou
conhecido como Arquitetura de von
Neumann.
Para divulgar essa idéia, von Neumann publicou sozinho um artigo. Eckert e
Mauchy não ficaram muito contentes com isso, pois teriam discutido muitas
vezes com ele. O projeto ENIAC acabou se dissolvendo em uma chuva de
processos, mas já estava criado o computador moderno.

Arquitetura de hardware
LEGENDA: 01- Monitor 02- Placa-Mãe 03- Processador 04- Memória RAM 05- Placas de Rede,
Placas de Som, Vídeo, Fax... 06- Fonte de Energia 07- Leitor de CDs e/ou DVDs 08- Disco Rígido
(HD) 09- Mouse (Rato) 10- Teclado

2(em inglês) Karl Kempf (1961) Historical Monograph: Electronic Computers Within the
Ordnance Corps, cap. 2, pp. 19-39. (Exército dos Estados Unidos da América)
Mesmo que a tecnologia utilizada nos
computadores digitais tenha mudado
dramaticamente desde os primeiros
computadores da década de 1940 (veja história do
hardware), quase todos os computadores atuais
ainda utilizam a arquitetura de von
Neumann proposta por John von Neumann.
Seguindo a arquitetura, os computadores
possuem quatro sessões principais, a unidade
lógica e aritmética, a unidade de controle, a
memória e os dispositivos de entrada e
saída. Essas partes são interconectadas por
barramentos. A unidade lógica e aritmética, a
unidade de controle, os registradores e a parte
básica de entrada e saída são conhecidos
como a CPU.
Alguns computadores maiores diferem do modelo acima em um aspecto principal
- eles têm múltiplas CPUs trabalhando simultaneamente. Adicionalmente, poucos
computadores, utilizados principalmente para pesquisa e computação científica,
têm diferenças significativas do modelo acima, mas eles não tem grande
aplicação comercial.

Processamento
O processador (ou CPU) é uma das partes principais do hardware do computador
e é responsável pelos cálculos, execução de tarefas e processamento de dados. A
velocidade com que o computador executa as tarefas ou processa dados está
diretamente ligada à velocidade do processador. As primeiras CPUs eram
constituídas de vários componentes separados, mas desde meados da década de
1970 as CPUs vêm sendo manufaturadas em um único circuito integrado, sendo
então chamadas microprocessadores.
A unidade lógica e aritmética (ULA) é a unidade central do processador, que
realmente executa as operações aritméticas e lógicas entre dois números. Seus
parâmetros incluem, além dos números operandos, um resultado, um comando
da unidade de controle, e o estado do comando após a operação. O conjunto de
operações aritméticas de uma ULA pode ser limitado a adição e subtração, mas
também pode incluir multiplicação, divisão, funções trigonométricas e raízes
quadradas. Algumas podem operar somente com números inteiros, enquanto
outras suportam o uso de ponto flutuante para representar números reais
(apesar de possuirem precisão limitada).
A unidade de controle é a unidade do processador que armazena a posição de
memória que contém a instrução corrente que o computador está executando,
informando à ULA qual operação a executar, buscando a informação (da
memória) que a ULA precisa para executá-la e transferindo o resultado de volta
para o local apropriado da memória. Feito isto, a unidade de controle vai para a
próxima instrução (tipicamente localizada na próxima posição da memória, a
menos que a instrução seja uma instrução de desvio informando que a próxima
instrução está em outra posição.
A CPU também contém um conjunto restrito de células de memória chamados
registradores que podem ser lidos e escritos muito mais rapidamente que em
outros dispositivos de memória. São usados frequentemente para evitar o acesso
contínuo à memória principal cada vez que um dado é requisitado.

Memória
A memória é um dispositivo que permite ao computador armazenar dados por
certo tempo. Atualmente o termo é geralmente usado para definir as memórias
voláteis, como a RAM, mas seu conceito primordial também aborda memórias
não voláteis, como o disco rígido. Parte da memória do computador é feita no
próprio processador; o resto é diluído em componentes como a memória RAM,
memória cache, disco rígido e leitores de mídias removíveis, como disquete, CD e
DVD.
Nos computadores modernos, cada posição da memória é configurado para
armazenar grupos de oito bits (chamado de um byte). Cada byte consegue
representar 256 números diferentes; de 0 a 255 ou de -128 a +127. Para
armazenar números maiores pode-se usar diversos bytes consecutivos
(geralmente dois, quatro ou oito). Quando números negativos são armazenados,
é utilizada a notação de complemento para dois.
A memória do computador é normalmente dividida entre primária e secundária,
sendo possível também falar de uma memória "terciária".

Memória primária
A memória primária é aquela acessada diretamente pela Unidade Lógica e
Aritmética. Tradicionalmente essa memória pode ser de leitura e escrita (RAM)
ou só de leitura (ROM). Atualmente existem memórias que podem ser
classificadas como preferencialmente de leitura, isso é, variações da memória
ROM que podem ser regravadas, porém com um número limitado de ciclos e um
tempo muito mais alto.
Normalmente a memória primária se comunica com a ULA por meio de um
barramento ou canal de dados. A velocidade de acesso a memória é um fator
importante de custo de um computador, por isso a memória primária é
normalmente construída de forma hierárquica em um projeto de computador.
Parte da memória, conhecida como cache fica muito próxima à ULA, com acesso
muito rápido. A maior parte da memória é acessada por meio de vias auxiliares.
Normalmente a memória é nitidamente separada da ULA em uma arquitetura de
computador. Porém, os microprocessadores atuais possuem memória cache
incorporada, o que aumenta em muito sua velocidade.
Memória RAM
Memória RAM de um PC
A memória RAM (Random Access
Memory) é uma sequência de células
numeradas, cada uma contendo uma pequena
quantidade de informação. A
informação pode ser uma instrução para
dizer ao computador o que fazer. As células
podem conter também dados que o computador
precisa para realizar uma instrução. Qualquer
célula pode conter instrução ou dado, assim o que em algum momento
armazenava dados pode armazenar instruções em outro momento. Em geral, o
conteúdo de uma célula de memória pode ser alterado a qualquer momento, a
memória RAM é um rascunho e não um bloco de pedra.
As memórias RAM são denominadas genericamente de DRAM (RAM dinâmica),
pelo fato de possuírem uma característica chamada refrescamento de memória,
que tem a finalidade de regravar os dados armazenados em intervalos regulares
de tempo,o que é necessário para a manutenção de seu conteúdo. O tamanho de
cada célula, e o número de células, varia de computador para computador, e as
tecnologias utilizadas para implementar a memória RAM variam bastante.
Atualmente o mais comum é a implementação em circuitos integrados.
Memória ROM
Memória ROM de um PC
A memória ROM (Read-Only Memory) é
uma memória que só pode ser lida e os dados
não são perdidos com o desligamento do
computador. A diferença entre a memória RAM e
a ROM é que a RAM aceita gravação,
regravação e perda de dados. Mesmo se for
enviada uma informação para ser gravada na memória ROM, o procedimento não
é executado (esta característica praticamente elimina a criação de vírus que
afetam a ROM).
Um software gravado na ROM recebe o nome de firmware. Em computadores da
linha IBM-PC eles são basicamente três, que são acessados toda vez que ligamos
o computador, a saber: BIOS, POST e SETUP.
Existe uma variação da ROM chamada memória preferencialmente de leitura que
permite a re-gravação de dados. São as chamadas EPROM (Erasable
Programmable Read Only Memory) ou EEPROM (Electrically Erasable
Programmable Read-Only Memory).

Memória secundária
A memória secundária ou memória de massa é usada para gravar grande
quantidade de dados, que não são perdidos com o desligamento do computador,
por um período longo de tempo. Exemplos de memória de massa incluem o disco
rígido e mídias removíveis como o CD-ROM, o DVD, o disquete e o pen drive.
Normalmente a memória secundária não é acessada diretamente pela ULA, mas
sim por meio dos dispositivos de entrada e saída. Isso faz com que o acesso a
essa memória seja muito mais lento do que o acesso a memória primária. Para
isso cada dispositivo encontra-se com um buffer de escrita e leitura para
melhoramento de desempenho.
Supostamente, consideramos que a memória terciária está permanentemente
ligada ao computador.

Memória terciária
Fita magnética para gravação de dados
Sistemas mais complexos de computação podem incluir um
terceiro nível de memória, com acesso ainda mais lento que o
da memória secundária. Um exemplo seria um sistema
automatizado de fitas contendo a informação necessária. A
memória terciária não é nada mais que um dispositivo de
memória secundária ou memória de massa colocado
para servir um dispositivo de memória secundária.
As tecnologias de memória usam materiais e processos bastante variados. Na
informática, elas têm evoluído sempre em direção de uma maior capacidade de
armazenamento, maior miniaturização, maior rapidez de acesso e confiabilidade,
enquanto seu custo cai constantemente.
Entretanto, a memória de um computador não se limita a sua memoria individual
e física, ela se apresenta de maneira mais ampla, e sem lugar definido
(desterritorializada). Temos possibilidades de armazenar em diversos lugares na
rede, podemos estar em Cairo e acessar arquivos que foram armazenados em
sítios no Brasil.
É crescente a tendência para o armazenamento das informações na memória do
espaço virtual, ou o chamado ciberespaço, através de discos virtuais e anexos de
e-mails. Isto torna possível o acesso a informação a partir de qualquer dispositivo
conectado à Internet.
Entrada e saída
Mouse
Os dispositivos de entrada e saída (E/S) são periféricos
usados para a interação homem-computador. Nos
computadores pessoais modernos, dispositivos comuns
de entrada incluem o mouse (ou rato), o teclado, o
digitalizador e a webcam. Dispositivos comuns de saída
incluem a caixa de som, o monitor3 e a impressora.
O que todos os dispositivos de entrada têm em comum é que eles precisam
codificar (converter) a informação de algum tipo em dados que podem ser
processados pelo sistema digital do computador. Dispositivos de saída por outro
lado, descodificam os dados em informação que é entendida pelo usuário do
computador. Neste sentido, um sistema de computadores digital é um exemplo
de um sistema de processamento de dados.
Podemos ter dispositivos que funcionam tanto para entrada como para saída de
dados, como o modem e o drive de disquete. Atualmente, outro dispositivo de
híbrido de dados é a rede de computadores.
Blocos funcionais de um computador

Barramentos
Para interligar todos esses dispositivos existe
uma placa de suporte especial, a placa-mãe,
que através de barramentos, fios e
soquetes conecta todos os dispositivos. Sua
função inclui também a conexão de placas
auxiliares que sub- controlam os periféricos
de entrada e saída, como a placa de som
(conecta-se com a caixa de som), a placa de
vídeo (conecta-se com o monitor), placa de rede
(conecta-se com a LAN) e o fax-modem (conecta-
se com a linha telefônica).
Nota-se que o barramento entre os
componentes não constitui uma conexão
ponto-a-ponto; ele pode conectar logicamente
diversos componentes utilizando o mesmo
conjunto de fios. O barramento pode utilizar uma interface serial ou uma
interface paralela.

3Alguns computadores, em especial PDAs, consideram a tela (considerada um monitor), também


um dispositivo de entrada, sob forma de ecrã táctil.
Outros equipamentos adicionais usados em conjunto com a placa-mãe são o
dissipador, um pequeno ventilador para resfriar o processador, e a fonte de
energia, responsável pela alimentação de energia de todos os componentes do
computador.

Arquitetura de software

Instruções
A principal característica dos computadores modernos, o que o distingue de
outras máquinas, é que pode ser programado. Isto significa que uma lista de
instruções pode ser armazenada na memória e executa posteriormente.
Diagrama de linguagem de programação compilada em
linguagem de máquina
As instruções executadas na ULA discutidas acima não são um rico conjunto de
instruções como a linguagem humana. O computador tem apenas um limitado
número de instruções bem definidas. Um exemplo típico de uma instrução
existente na maioria dos computadores é "copie o conteúdo da posição de
memória 123 para a posição de memória 456", "adicione o conteúdo da posição
de memória 510 ao conteúdo da posição 511 e coloque o resultado na posição
507" e "se o conteúdo da posição 012 é igual a 0, a próxima instrução está na
posição 678".
Instruções são representadas no computador como números - o código para
"copiar" poderia ser 007, por exemplo. O conjunto particular de instruções que
um computador possui é conhecido como a linguagem de máquina do
computador. Na prática, as pessoas não escrevem instruções diretamente na
linguagem de máquina mas em uma linguagem de programação, que é
posteriormente traduzida na linguagem de máquina através de programas
especiais, como interpretadores e compiladores. Algumas linguagens de
programação se aproximam bastante da linguagem de máquina, como o
assembly (linguagem de baixo nível); por outro lado linguagens como o Prolog
são baseadas em princípios abstratos e se distanciam bastante dos detalhes da
operação da máquina (linguagens de alto nível).
A execução das instruções é tal como ler um livro. Apesar da pessoa
normalmente ler cada palavra e linha em sequência, é possível que algumas
vezes ela volte para pontos anteriores do texto de interesse ou passe sessões não
interessantes. Da mesma forma, um computador que segue a arquitetura de von
Neumann executa cada instrução de forma sequencial, da maneira como foram
armazenadas na memória. Mas, através de instruções especiais, o computador
pode repetir instruções ou avançá-las até que alguma condição seja satisfeita.
Isso é chamado controle do fluxo e é o que permite que o computador realize
tarefas repetitivamente sem intervenção humana.
Uma pessoa usando uma calculadora pode realizar operações aritméticas como
somar número apertando poucos botões. Mas somar sequencialmente os
números de um a mil iria requerer apertar milhares de vezes os botões, com uma
alta probabilidade de erro em alguma iteração. Por outro lado, computadores
podem ser programados para realizar tal tarefa com poucas instruções, e a
execução e extremamente rápida.
Mas os computadores não conseguem pensar, eles somente executam as
instruções que fornecemos. Um humano instruído, ao enfrentar o problema da
adição explicado anteriormente, perceberia em algum momento que pode
reduzir o problema usando a seguinte equação:

e chegar na mesma resposta correta com pouco trabalho. Alguns computadores


modernos conseguem tomar algumas decisões para acelerar a execução dos
programas ao prever instruções futuras e reorganizar a ordem de instruções sem
modificar seu significado. Entretanto, os computadores ainda não conseguem
determinar instintivamente uma maneira mais eficiente de realizar sua tarefa,
pois não possuem conhecimento para tal 4.

Programas
Programas são simplesmente grandes listas de instruções para o computador
executar, tais com tabelas de dados. Muitos programas de computador contêm
milhões de instruções, e muitas destas instruções são executadas repetidamente.
Um computador pessoal típico (no ano de 2003) podia executar cerca de dois a
três bilhões de instruções por segundo. Os computadores não têm a sua
extraordinária capacidade devido a um conjunto de instruções complexo. Apesar
de existirem diferenças de projeto com CPU com um maior número de instruções
e mais complexas, os computadores executam milhões de instruções simples
combinadas, escritas por bons "programadores". Estas instruções combinadas
são escritas para realizar tarefas comuns como, por exemplo, desenhar um ponto
na tela. Tais instruções podem então ser utilizadas por outros programadores.
Hoje em dia, muitos computadores aparentam executar vários programas ao
mesmo tempo, o que é normalmente conhecido como multitarefa. Na realidade, a
CPU executa as instruções de um programa por um curto período de tempo e,
em seguida, troca para um outro programa e executa algumas de suas
instruções. Isto cria a ilusão de vários programas sendo executados
simultaneamente através do compartilhamento do tempo da CPU entre os
programas. Este compartilhamento de tempo é normalmente controlado pelo
sistema operacional.

4Existem tentativas para resolver essa limitação, e o campo de atuação de aprendizagem de


máquina é conhecido na Ciência da Computação como Inteligência Artifical.
Sistema operacional
Um computador sempre precisa de no mínimo um programa em execução por
todo o tempo para operar. Tipicamente este programa é o sistema operacional
(ou sistema operativo), que determina quais programas vão executar, quando, e
que recursos (como memória e E / S) ele poderá utilizar. O sistema operacional
também fornece uma camada de abstração sobre o hardware, e dá acesso aos
outros programas fornecendo serviços, como programas gerenciadores de
dispositivos ("drivers") que permitem aos programadores escreverem programas
para diferentes máquinas sem a necessidade de conhecer especificidades de
todos os dispositivos eletrônicos de cada uma delas.

Impactos do computador na sociedade


Segundo Pierre Lévy, no livro "Cibercultura", O computador não é mais um
centro, e sim um nó, um terminal, um componente da rede universal calculante.
Em certo sentido, há apenas um único computador, mas é impossível traçar seus
limites, definir seu contorno. É um computador cujo centro está em toda parte e
a circunferência em lugar algum, um computador hipertextual, disperso, vivo,
fervilhante, inacabado: o ciberespaço em si.
O computador evoluiu em sua capacidade de armazenamento de informações,
que é cada vez maior, o que possibilita a todos um acesso cada vez maior a
informação. Isto significa que o computador agora representa apenas um ponto
de um novo espaço, o ciberespaço. Essas informações contidas em computadores
de todo mundo e presentes no ciberespaço, possibilitam aos usuários um acesso
a novos mundos, novas culturas, sem a locomoção física. Com todo este
armazenamento de textos, imagens, dados, etc.
Houve também uma grande mudança no comportamento empresarial, com uma
forte redução de custo e uma descompartimentalização das mesmas. Antes o que
era obstante agora é próximo, as máquinas, componentes do ciberespaço, com
seus compartimentos de saída, otimizaram o tempo e os custos.

Ver também
•Commons
•Wikiquote
•Wikcionário
•Computador doméstico
•Computador pessoal
•Mainframe
•Notebook
•Servidor
•Sistema operacional
•Supercomputador
•Teoria da computação
•Reciclagem de computadores

Ligações externas
•História dos computadores (em português)
•Museu do Computador (em português)
•O que é um computador? (em português)
•Fotos e história de alguns modelos de computadores (em inglês)

Arquitetura de von Neumann


Diagrama da arquitectura de von Neumann.
A Arquitetura de von Neumann (de John von
Neumann), é uma arquitetura de
computador que se caracteriza pela
possibilidade de uma máquina digital
armazenar seus programas no mesmo
espaço de memória que os dados, podendo assim
manipular tais programas.
A máquina proposta por Von Neumann reúne os
seguintes componentes: (i) uma memória, (ii)
uma unidade aritmética e lógica (ALU), (iii) uma
unidade central de processamento (CPU),
composta por diversos registradores, e (iv) uma
Unidade de Controle (CU), cuja função é a mesma da tabela de controle da
Máquina de Turing universal: buscar um programa na memória, instrução por
instrução, e executá-lo sobre os dados de entrada.
Cada um dos elementos apresentados é realizado à custa de componentes físicos
independentes, cuja implementação tem variado ao longo do tempo, consoante a
evolução das tecnologias de fabricação, desde os relés electromagnéticos, os
tubos de vácuo (ou válvulas), até aos semicondutores, abrangendo os
transistores e os circuitos electrónicos integrados, com média, alta ou muito alta
densidade de integração (MSI - medium scale, LSI - large scale, ou VLSI - very
large scale integration), medida em termos de milhões transistores por pastilha
de silício.
As interacções entre os elementos exibem tempos típicos que também têm
variado ao longo do tempo, consoante as tecnologias de fabricação. Actualmente,
as CPUs processam instruções sob controlo de relógios cujos períodos típicos são
da ordem de 1 nanosegundo, ou seja, segundos. As memórias centrais têm
tempos típicos de acesso da ordem da dezena de nanosegundos. As unidades de
entrada e saída exibem tempos típicos extremamente variáveis, mas que são
tipicamente muito superiores à escala do nanosegundo. Por exemplo, os discos
duros exibem tempos da ordem do milisegundos (milésimo de segundo, ). Outros
dispositivos periféricos são inertes, a não ser que sejam activados por
utilizadores humanos. Por exemplo, ao se fazer "copy and paste" nao se-percebe
nada do que foi descrito acima, pois um teclado só envia informação para o
computador após serem pressionada as devidas teclas. Assim, este dispositivo se
comunica com a CPU eventualmente e, portanto, exibe tempos indeterminadoss.

Ver também
•Arquitetura Harvard

ENIAC
Duas mulheres operando o ENIAC (fotografia
pertencente ao Exército dos E.U.A. (U.S. Army)
O ENIAC (Electrical Numerical Integrator
and Calculator) foi o primeiro computador
digital eletrônico de grande escala. Criado
em fevereiro de 1946 pelos cientistas norte-
americanos John Eckert e John Mauchly, da
Electronic Control Company.
O ENIAC começou a ser desenvolvido em 1943
durante a II Guerra Mundial para computar trajetórias táticas que exigissem
conhecimento substancial em matemática, mas só se tornou operacional após o
final da guerra.
O computador pesava 30 toneladas, media 5,50 m de altura e 25 m de
comprimento e ocupava 180 m² de área construída. Foi construído sobre
estruturas metálicas com 2,75 m de altura e contava com 70 mil resistores e
entre 17.468 e 18.000 válvulas a vácuo ocupando a área de um ginásio
desportivo. Segundo Tom Forester, quando acionado pela primeira vez, o ENIAC
consumiu tanta energia que as luzes de Filadélfia piscaram.
Esta máquina não tinha sistema operacional e seu funcionamento era parecido
com uma calculadora simples de hoje. O ENIAC, assim como uma calculadora,
tinha de ser operado manualmente. A calculadora efetua os cálculos a partir das
teclas pressionadas, fazendo interação direta com o hardware, como no ENIAC,
no qual era preciso conectar fios, relês e seqüências de chaves para que se
determinasse a tarefa a ser executada. A cada tarefa diferente o processo
deveria ser refeito. A resposta era dada por uma seqüencia de lâmpadas. O
segundo computador do mundo foi o ENIAC (Electronic Numerical Integrator
and Computer), uma concepçao do Professor John Mauchly, conjuntamente com
o professor J. Presper Eckert. Mauchly e o Eckert propuseram em 1943 ao
exército norte-americano, em plena II Guerra Mundial, a construçao deste
primeiro computador, tendo como objectivo o auxilio nos cálculos de precisao
necessários para a balística. Foi anunciada a sua conclusao em 14 de Fevereiro
de 1946 e foi patenteado em 26 de Junho de 1947 com o registo n.o 3,120,606.
Diposiçao em U da sala do ENIAC
O ENIAC (Electronic Numerical Integrator and Computer) preenchia esta sala,
incomparável com os miniaturizados e mais potentes computadores actuais.
Equipa que construiu o ENIAC
J. Presper Eckert, Jr.; Professor J. G. Brainerd; Sam Feltman; Captain H. H.
Goldstine; Dr. J. W. Mauchly; Dean Harold Pender; General G. M. Barnes;
Colonel Paul N. Gillon.
O ENIAC era uma grande máquina para efectuar cálculos e baseava a sua
estrutura nos avanços científicos já anteriormente desenvolvidos, como as
sofisticadas máquinas de cálculos matemáticos de Charles Babage, as
calculadoras mecânicas de Blaise Pascal, Leibniz e Charles Xavier Thomas, nas
relés electromagnéticas, nas válvulas e nas máquinas perfuradoras de cartoes.
Uma válvula é, de forma simples, um tubo metálico de meia polegada, selado em
vácuo dentro de um tubo de vidro, onde uma corrente de electroes pode passar
entre os eléctrodos. Os tubos de vácuo foram fundamentais para o
desenvolvimento da rádio, televisao e gravaçao de sons. Eram também peças
grandes e muito frágeis que tinham uma grande perda de energia por calor.
Pormenor do ENIAC - o primeiro computador
O ENIAC foi construído com 17 468 tubos de vácuo, 70 000 resistencias, 10 000
condensadores, 1 500 relés e 6 000 interruptores. O ENIAC pesava 30 toneladas,
consumia 200 000 watts de potencia e ocupava várias salas. Quando em
operaçao produzia tanto calor que necessitava de um sistema de ar forçado para
arrefecimento. Era tao grande que tinha de ser disposto em U com tres painéis
sobre rodas, para que os operadores se pudessem mover a volta dele. Um dos
gigantes paíneis laterais do ENIAC
Quando em operaçao, os complexos cálculos de balística passaram a realizar–se
nuns alucinantes 30 segundos, quando com as calculadoras manuais que até aí
se usavam demorava 12 horas até se obter o mesmo resultado.
O centro de processamento tinha uma estrutura muito simular a dos
processadores mais básicos que actualmente utilizamos nas nossas calculadoras
de bolso. Tinha 20 registos de dez dígitos cada, onde se podiam efectuar somas,
subtracçoes, multiplicaçoes, divisoes e raízes quadradas. As programadoras do
ENIAC
O ENIAC era programado através de milhares de interruptores, podendo cada
um dele assumir o valor 1 ou 0 consoante o interruptor estava ligado ou
desligado. Para o programar era necessário uma grande quantidade de pessoas
que percorriam as longas filas de interruptores dando ao ENIAC as instruçoes
necessárias para computar, ou seja, calcular. Existia uma equipa de 80 mulheres
na Universidade da Pensilvânia cuja funçao era calcular manualmente as
equaçoes diferenciais necessárias para os cálculos de balística. O exército
chamava a funçao destas pessoas: computadores.
Quando o ENIAC ficou pronto 6 mulheres computador foram escolhidas para
testarem a nova máquina. Pormenor da sala do ENIAC Versao modernizada do
ENIAC
Curiosamente, o termo deixou de estar associado as pessoas que operavam a
máquina para dar nome a máquina propriamente dita, uma vez que de facto a
máquina passou a realizar as contas que antes eram realizadas por essas
pessoas.
O ENIAC torna-se obsoleto e economicamente inviável de manter após 10 anos
de operaçao, tendo sido desmontado. Hoje encontram-se peças do ENIAC por
muitos museus do mundo, incluindo o Smithsonian em Washington D.C. e no
local preciso onde foi construído, na Moore School for Electrical Engineering da
Universidade da Pensilvânia.
O ENIAC serviu de inspiraçao para muitos outros computadores que se seguiram
como: o EDVAC (Electronic Discrete Variable Computer); o ORDVAC (Ordnance
Variable Automatic Computer; SEAC (Standards Automatic Computer) e o
UNIVAC, este último também construído por Eckert e Mauchly para o
processamento dos dados dos censos da populaçao americana.
Em 1955, um computador já só pesava 3 toneladas e consumia 50 kwatts de
potencia, tendo um custo de $200 000. Uma máquina destas podia realizar 50
multiplicaçoes por segundo. Assim, os primeiros computadores eram também
eles máquinas que só estavam ao alcance de grandes empresas ou instituiçoes
que tinham necessidades de cálculo muito exigentes e que possuíam as
condiçoes económicas para tao grande investimento.
Com o rápido desenvolvimento dos transístores entre 1952 e 1960, os tubos de
vácuo tornaram-se obsoletos e foi este avanço tecnológico que permitiu a criaçao
de máquinas muito mais rápidas, mais pequenas e mais baratas.
Com o tempo, os transístores passaram a ser a base da electrónica, seguindo-se
a VLSI (Very Large Scale Integration), ou seja, a construçao de circuitos cada
vez mais pequenos por forma a que possam ser mais leves e dispender menos
energia, por terem menos superfície para a dissipaçao de energia por calor. Esta
miniaturizaçao permitiu que se tivesse a mesma capacidade de cálculo de um
ENIAC na palma de uma mao. A diminuiçao do tamanho fez também diminuir a
quantidade de energia necessária e o custo caiu com a produçao em série dos
novos processadores.
Em 1977 uma calculadora manual pesava menos de meio quilo e consumia meio
watt e podia realizar 250 multiplicaçoes por segundo, custando $300. Hoje uma
calculadora pesa poucos gramas podendo ser incorporada em réguas ou
agendas, funciona até a energia solar e custa menos de $5.
Um Pentium a 150Mhz é capaz de realizar 300 milhoes de somas por segundo,
enquanto o ENIAC apenas conseguia realizar 5 000. A memória do ENIAC
apenas permitia guardar 200 bits, enquanto qualquer computador tem pelo
menos 128 Mbytes, ou seja, 1 073 741 824 bits.
Nos meados da década de 70 os computadores começaram a ter preços cada vez
mais acessíveis. Em 1981 a IBM lançou no mercado o PC (Personal Computer).
O PC distinguia-se das máquinas existentes até entao por estar dirigido a
utilizadores individuais que poderiam passar a ter na sua secretária uma
máquina para uso exclusivo, quando até aí esse conceito nao existia... Os
computadores eram mainframe, centralizados, e os utilizadores tinham apenas
um monitor e um teclado sendo todo o processamento realizado no servidor.
O PC tinha ainda outra característica que o tornou revolucionário que era o facto
de ter uma arquitectura aberta, ou seja, qualquer fabricante poderia criar peças
adaptáveis aquela máquina dando-lhe uma funcionalidade mais especializada, o
que até aí era sempre privilégio reservado para o fabricante do computador.
Assim o PC passou a ser o standard de facto na indústria.
Uma regra estatística que se tem verificado desde a invençao do primeiro
computador é a Lei de Moore que diz: “A cada 18 a 24 meses é lançada uma
nova tecnologia que permite que os computadores dupliquem o desempenho”.
IIsto estava errado pois em 2004 os melhores computadores funcionavam 3.2
Ghz e agora (Outubro/2009)os melhores computadores ainda só funcionam a 5
Ghz

Sistema operativo
Estimativa do uso atual de sistemas operativos segundo uma amostra de computadores com
acceso a Internet (Fonte: W3counter).
Um sistema operativo (português europeu)
ou sistema
operacional (português brasileiro)
é um programa ou
um conjunto de programas cuja função é
gerenciar os recursos do sistema (definir qual
programa recebe atenção do processador,
gerenciar memória, criar um sistema de
arquivos, etc.), além de fornecer uma interface
entre o computador e o usuário. É o primeiro
programa que a máquina executa no
momento em que é ligada (num processo
chamado de bootstrapping) e, a partir de então, não deixa de funcionar até que o
computador seja desligado. O sistema operacional reveza sua execução com a de
outros programas, como se estivesse vigiando, controlando e orquestrando todo
o processo computacional.
Segundo alguns autores (Silberschatz et al, 2005; Stallings, 2004; Tanenbaum,
1999), existem dois modos distintos de conceituar um sistema operacional:
•pela perspectiva do usuário ou programador (visão top-down): é uma abstração
do hardware, fazendo o papel de intermediário entre o aplicativo (programa) e os
componentes físicos do computador (hardware); ou
•numa visão bottom-up, de baixo para cima: é um gerenciador de recursos, i.e.,
controla quais aplicações (processos) podem ser executadas, quando, que
recursos (memória, disco, periféricos) podem ser utilizados.

A sigla usual para designar esta classe de programas é SO (em português) ou OS


(do inglês Operating System).

História
Na primeira geração de computadores (aproximadamente 1945-1955), os
computadores eram tão grandes que ocupavam salas imensas. Foram
basicamente construídos com válvulas e painéis, os sistemas operacionais "não
existiam". Os programadores, que também eram os operadores, controlavam o
computador por meio de chaves , fios e luzes de aviso. Nomes como Howard
Aiken (Harvard), John von Neumann (Instituto de Estudos Avançados de
Princeton), John Adam Presper Eckert Jr e William Mauchley (Universidade da
Pennsylvania) e Konrad Zuse (Alemanha) formaram, com suas contribuições, a
base humana para o sucesso na construção dos computadores primitivos.
Na geração seguinte (aproximadamente 1955-1965), foram criados os sistemas
em lote (batch systems), que permitiram melhor uso dos recursos
computacionais. A base do sistema operacional era um programa monitor, usado
para enfileirar tarefas (jobs). O usuário foi afastado do computador; cada
programa era escrito em cartões perfurados, que por sua vez eram carregados,
juntamente com o respectivo compilador (normalmente Fortran ou Cobol), por
um operador, que por sua vez usava uma linguagem de controle chamada JCL
(job control language).
No início da computação os primeiros sistemas operacionais eram únicos, pois
cada mainframe vendido necessitava de um sistema operacional específico. Esse
problema era resultado de arquiteturas diferentes e da linguagem de máquina
utilizada. Após essa fase, iniciou-se a pesquisa de sistemas operacionais que
automatizassem a troca de tarefas (jobs), pois os sistemas eram monousuários e
tinham cartões perfurados como entrada (eliminando, assim, o trabalho de
pessoas que eram contratadas apenas para trocar os cartões perfurados).
Um dos primeiros sistemas operacionais de propósito geral foi o CTSS,
desenvolvido no MIT. Após o CTSS, o MIT, os laboratórios Bell da AT&T e a
General Eletric desenvolveram o Multics, cujo objetivo era suportar centenas de
usuários. Apesar do fracasso comercial, o Multics serviu como base para o
estudo e desenvolvimento de sistemas operacionais. Um dos desenvolvedores do
Multics, que trabalhava para a Bell, Ken Thompson, começou a reescrever o
Multics num conceito menos ambicioso, criando o Unics (em 1969), que mais
tarde passou a chamar-se Unix. Os sistemas operacionais eram geralmente
programandos em assembly, até mesmo o Unix em seu início. Então, Dennis
Ritchie (também da Bell) criou a linguagem C a partir da linguagem B, que havia
sido criada por Thompson. Finalmente, Thompson e Ritchie reescreveram o Unix
em C. O Unix criou um ecossistema de versões, onde destacam-se: System V e
derivados (HP-UX, AIX); família BSD (FreeBSD, NetBSD, OpenBSD, etc.), Linux e
até o Mac OS X (que deriva do Mach e FreeBSD).
Na década de 1970, quando começaram a aparecer os computadores pessoais,
houve a necessidade de um sistema operacional de utilização mais fácil. Em
1980, William (Bill) Gates e seu colega de faculdade, Paul Allen, fundadores da
Microsoft, compram o sistema QDOS ("Quick and Dirty Operating System") de
Tim Paterson por $50.000, batizam-no de DOS (Disk Operating System) e
vendem licenças à IBM. O DOS vendeu muitas cópias, como o sistema
operacional padrão para os computadores pessoais desenvolvidos pela IBM. IBM
e Microsoft fariam, ainda, uma parceria para o desenvolvimento de um sistema
operacional multitarefa chamado OS/2. Após o fim da breve parceria a IBM
seguiu sozinha no desenvolvimento do OS/2.
No começo da década de 1990, um estudante de computação finlandês postou
um comentário numa lista de discussão da Usenet dizendo que estava
desenvolvendo um kernel de sistema operacional e perguntou se alguém gostaria
de auxiliá-lo na tarefa. Este estudante chamava-se Linus Torvalds e o primeiro
passo em direção ao tão conhecido Linux foi dado naquele momento.
Visão geral
Um sistema operativo pode ser visto como um programa de grande
complexidade que é responsável por todo o funcionamento de uma máquina
desde o software a todo hardware instalado na máquina. Todos os processos de
um computador estão por de trás de uma programação complexa que comanda
todas a funções que um utilizador impõe à máquina. Existem vários sistemas
operativos; entre eles, os mais utilizados no dia a dia, normalmente utilizados em
computadores domésticos, são o Windows, Linux e Mac OS X.
Um computador com o sistema operativo instalado poderá não dar acesso a todo
o seu conteúdo dependendo do utilizador. Com um sistema operativo, podemos
estabelecer permissões a vários utilizadores que trabalham com este. Existem
dois tipos de contas que podem ser criadas num sistema operativo, as contas de
Administrador e as contas limitadas. A conta Administrador é uma conta que
oferece todo o acesso à máquina, desde a gestão de pastas, ficheiros e software
de trabalho ou entretenimento ao controlo de todo o seu Hardware instalado. A
conta Limitada é uma conta que não tem permissões para aceder a algumas
pastas ou instalar software que seja instalado na raiz do sistema ou então que
tenha ligação com algum Hardware que altere o seu funcionamento normal ou
personalizado pelo Administrador. Para que este tipo de conta possa ter acesso a
outros conteúdos do disco ou de software, o administrador poderá personalizar a
conta oferecendo permissões a algumas funções do sistema como também
poderá retirar acessos a certas áreas do sistema.
O sistema operativo funciona com a iniciação de processos que este irá precisar
para funcionar correctamente. Esses processos poderão ser ficheiros que
necessitam de ser frequentemente actualizados, ou ficheiros que processam
dados úteis para o sistema. Poderemos ter acesso a vários processos do sistema
operativo a partir do gestor de tarefas, onde se encontram todos os processos
que estão em funcionamento desde o arranque do sistema operativo até a sua
utilização actual. Pode-se também visualizar a utilização da memória por cada
processo, no caso de o sistema operativo começar a mostrar erros ou falhas de
acesso a programas tornando-se lento, pode-se verificar no gestor de tarefas qual
dos processos estará bloqueado ou com elevado número de processamento que
está a afectar o funcionamento normal da memória.

Funcionamento
Um sistema operacional possui as seguintes funções:
1. gerenciamento de processos;
2. gerenciamento de memória;
3. sistema de arquivos;
4. entrada e saída de dados.
Gerenciamento de processos
O sistema operacional multitarefa é preparado para dar ao usuário a ilusão que o
número de processos em execução simultânea no computador é maior que o
número de processadores instalados. Cada processo recebe uma fatia do tempo e
a alternância entre vários processos é tão rápida que o usuário pensa que sua
execução é simultânea.
São utilizados algoritmos para determinar qual processo será executado em
determinado momento e por quanto tempo.
Os processos podem comunicar-se, isto é conhecido como IPC (Inter-Process
Communication). Os mecanismos geralmente utilizados são:
•sinais;
•pipes;
•named pipes;
•memória compartilhada;
•soquetes (sockets);
•trocas de mensagens.

O sistema operacional, normalmente, deve possibilitar o multiprocessamento


(SMP ou NUMA). Neste caso, processos diferentes e threads podem ser
executados em diferentes processadores. Para essa tarefa, ele deve ser
reentrante e interrompível, o que significa que pode ser interrompido no meio
da execução de uma tarefa.

Gerenciamento de memória
O sistema operacional tem acesso completo à memória do sistema e deve
permitir que os processos dos usuários tenham acesso seguro à memória quando
o requisitam.
Vários sistemas operacionais usam memória virtual, que possui 3 funções
básicas:
1. assegurar que cada processo tenha seu próprio espaço de endereçamento,
começando em zero, para evitar ou resolver o problema de relocação
(Tanenbaum, 1999);
2. prover proteção da memória para impedir que um processo utilize um
endereço de memória que não lhe pertença;
3. possibilitar que uma aplicação utilize mais memória do que a fisicamente
existente.
Sistema de arquivos
A memória principal do computador é volátil, e seu tamanho é limitado pelo
custo do hardware. Assim, os usuários necessitam de algum método para
armazenar e recuperar informações de modo permanente.
Um arquivo é um conjunto de bytes, normalmente armazenado em um dispositivo
periférico não volátil (p.ex., disco), que pode ser lido e gravado por um ou mais
processos.

Interface de uso
Sistema operacional com interface gráfica, no caso, o
Debian com blackbox.
Os sistemas operacionais fornecem
abstração de hardware para que seus recursos
possam ser usados de maneira correta e
padronizada, mas para ser possível operar um
computador, é necessário fornecer
também uma interface para que o usuário possa
desfrutar dos recursos do sistema. Atualmente
existem dois tipos de interface: o GUI
(graphical user interface), conhecida
também por interface gráfica, e o CUI
(command-line interface), sendo essa mais conhecida como interface de linha de
comando.

GUI (Graphical user interface)


Nesse tipo de interface, o usuário tem a disposição um ambiente de trabalho
composto por menus, ícones, janelas e outros itens disponíveis. O usuário
interage com esse tipo de interface usando o mouse, podendo também usar o
teclado e teclas de atalho. É possível fazer todo tipo de tarefa usando interface
gráfica, como edição de vídeos e imagens, sendo somente alguns tipos muito
específicos de tarefas que se saem melhor em linha de comando. Acrescentar
facilidade de uso e agilidade é o objetivo da GUI, tendo a desvantagem de
consumir muito mais memória que interfaces de linha de comando. Em sistemas
unix-likes, existe a possibilidade de escolher o gerenciador de janelas a utilizar,
aumentando em muito a liberdade de escolha do ambiente. .
Sistema operacional em linha de comando.
CUI (Command-
line user interface)
Além da interface gráfica, existe a
interface de linha de comando, que funciona
basicamente com a digitação de comandos,
sendo nesse relativamente pouco
interativa. Os comandos digitados são
interpretados por um interpretador de
comandos, conhecidos também por shells,
bastante comuns em sistemas unix-likes. Um
exemplo de interpretador de
comandos seria o Bash. Usada geralmente por
usuários avançados e em atividades específicas,
como gerenciamento remoto, utiliza poucos recursos de hardware em
comparação a interface gráfica. Nesse tipo de ambiente, raramente se usa o
mouse, embora seja possível através do uso da biblioteca ncurses no
desenvolvimento dos softwares.

Classificações
Em relação ao seu projeto (arquitetura), segundo Tanenbaum (1999):
•Kernel monolítico ou monobloco: o kernel consiste em um único processo
executando numa memória protegida (espaço do kernel) executando as
principais funções. Ex.: MAC OS X, OS/2, Windows, Linux, FreeBSD.
•Micronúcleo ou modelo cliente-servidor: o kernel consiste de funções mínimas
(comunicação e gerenciamento de processos), e outras funções, como sistemas
de arquivos e gerenciamento de memória, são executadas no espaço do usuário
como serviços; as aplicações (programas) são os clientes. Ex.: GNU Hurd, Mach.
•Sistema em camadas: funções do kernel irão executar em camadas distintas, de
acordo com seu nível de privilégio. Ex.: Multics.
•Monitor de máquinas virtuais: fornece uma abstração do hardware para vários
sistemas operacionais. Ex.: VM/370, VMware, Xen.
Quanto ao gerenciamento de processos, pode-se usar a seguinte classificação:
•Monotarefa: pode-se executar apenas um processo de cada vez Ex.: MS-DOS.
•Multitarefa: além do próprio SO, vários processos de utilizador (tarefas) estão
carregados em memória, sendo que um pode estar ocupando o processador e
outros ficam enfileirados, aguardando a sua vez. O compartilhamento de tempo
no processador é distribuído de modo que o usuário tenha a impressão que
vários processos estão sendo executados simultaneamente. Ex: OS/2, Windows,
Linux, FreeBSD e o Mac OS X.
•Multiprocessamento: o SO distribui as tarefas entre dois ou mais
processadores.
•Multiprogramação: o SO divide o tempo de processamento entre vários
processos mantendo o processador sempre ocupado.
Quanto à quantidade de usuários que podem utilizar o sistema simultaneamente:
•Monousuário: apenas um usuário por vez (apesar de poder suportar recursos
como troca de usuário). Ex.: Windows. Esse também pode ser acesado por
terminais e conexão remota.
•Multiusuário: vários usuários usam o computador ao mesmo tempo, seja por
diversos terminais, seja por conexão remota como o SSH. Ex.: Linux, Unix.

Exemplos de sistemas operacionais ativos


•Windows
•Mac OS X
•Linux
•Solaris
•FreeBSD
•Haiku
•eComStation
•FreeDOS
•Unix System V
•AmigaOS
•Minix

Exemplos de sistemas operacionais importantes


que foram descontinuados
•MS-DOS
•OS/2
•BeOS
•NeXTStep
•CP/M
Referências
•BACH, Maurice J. The design of the Unix operating system. Upper Saddle
River: Prentice Hall. 1990.
•BOVET Daniel P.; CESATI, Marco. Understanding de Linux kernel. 3.ed.
Sebastopol: O'Reilly. 2005.
•MCKUSICK, Marshall K.; NEVILLE-NEIL, George V. The design and
implementation of the FreeBSD operating system. Upper Saddle River:
Addison-Wesley. 2004.
•RUSSINOVITCH, Mark E.; SOLOMON, David A. Microsoft Windows
internals. 4.ed. Redmond: Microsoft Press. 2005.
•SILBERSCHATZ, Avi; GALVIN, Peter B.; GAGNE, Greg. Operating system
concepts. 7.ed. Hoboken: Wiley. 2005.
•STALLINGS, William. Operating systems: internals and design principles.
5.ed. Upper Saddle River: Pearson Prentice Hall. 2004.
•TANENBAUM, Andrew. Sistemas operacionais modernos. Rio de Janeiro:
LTC. 1999.

Ver também
•Pseudo-Sistema Operacional
•Sistema distribuído
•Lista de sistemas operativos
•Inter-Process Communication
•Sistemas Operacionais On-line
•Sistema operacional em disco

núcleo
Um núcleo de sistema conecta o software aplicativo ao hardware
de um computador.
Em computação, o núcleo ou cerne (em inglês:
kernel) é o componente central do sistema operativo
da maioria dos computadores; ele serve de
ponte entre aplicativos e o processamento real de
dados feito a nível de hardware. As
responsabilidades do núcleo incluem gerenciar os
recursos do sistema (a comunicação entre
componentes de hardware e software). Geralmente como um componente
5

básico do sistema operativo, um núcleo pode oferecer a camada de abstração de


5Wulf 74 pp.337-345
nível mais baixo para os recursos (especialmente processadores e dispositivos de
entrada/saída) que softwares aplicativos devem controlar para realizar sua
função. Ele tipicamente tornas estas facilidades disponíveis para os processos de
aplicativos através de mecanismos de comunicação entre processos e chamadas
de sistema.
Tarefas de sistemas operativos são feitas de maneiras diferentes por núcleos
diferentes, dependendo do seu desenho e abordagem. Enquanto núcleos
monolíticos tentarão alcançar seus objetivos executando todos códigos de
sistema no mesmo espaço de endereçamento para aumentar a performance do
sistema, micronúcleos executam a maioria dos serviços do sistema no espaço de
usuário como servidores, buscando melhorar a manutenção e a modularidade do
sistema operativo.6 Uma gama de possibilidades existem entre estes extremos.

Visão geral
Uma visão típica de uma arquitetura de computadores
como séries de camadas de abstração: hardware, firmware,
montador, núcleo, sistema operativo e aplicativos (veja
também Organização Estruturada de Computadores, por Andrew S.
Tanenbaum.).
Na definição do 'núcleo', Jochen Liedtke disse que a
palavra é "tradicionalmente usada para definir a parte
do sistema operativo que é obrigatória e comum a todo
software no sistema."7
A maioria dos sistemas operativos depende do
conceito de núcleo. A existência de um núcleo é
uma consequência natural de projetar um sistema de
computador como séries de camadas de abstração,8
cada uma das funções dependendo das funções
das camadas abaixo de si. O núcleo deste ponto de vista,
é simplesmente o nome dado ao nível mais inferior
de abstração que é implementado em software. Para evitar ter um núcleo, teria-
se que projetar todo o software no sistema de modo a não utilizar abstração
alguma; isto iria aumentar a complexidade e o projeto a tal ponto que apenas os
sistemas mais simples seriam capazes de ser implementados.

6Roch 2004
7Liedtke 95
8Tanenbaum 79, chapter 1
Enquanto isto hoje é chamado núcleo, originalmente a mesma parte do sistema
também foi chamado o nucleus ou caroço9101112 (Nota, no entanto, este termo
caroço também foi usado para se referir a memória primordial de um sistema de
computador, por que alguns dos primeiros computadores usaram uma forma de
memória chamada memória de caroços magnéticos), e foi concebido
originalmente como contendo apenas os recursos de suporte essenciais do
sistema operativo.
Na grande maioria dos casos, o processo de iniciação começa executando o
núcleo no modo supervisor.13 O núcleo depois inicializa a si e depois o primeiro
processo. Depois disto, tipicamente, o núcleo não executa diretamente, apenas
em resposta para eventos externos (ex., através de chamadas de sistema usados
pelos aplicativos para requisitar serviços do núcleo, ou via interrupções usadas
pelo hardware para notificar o núcleo sobre eventos). Além disso, tipicamente o
núcleo fornece um laço que é executado sempre que nenhum processo esta
disponível para execução; geralmente chamado de processo desocupado.
O desenvolvimento do núcleo é considerado uma das mais complexas e difíceis
tarefas em programação.14 Sua posição central em um sistema operativo implica
na necessidade de boa performance, que define o núcleo como peça de software
crítica e torna seu desenvolvimento correto e implementação correta difícil.
Devido a diversas razões, o núcleo pode até não ser capaz de utilizar mecanismos
de abstração, que ele fornece a outro software. Tais razões incluem
preocupações com o gerenciamento de memória (ex. uma função em modo de
usuário pode depender de memória estando sujeita a paginação por demanda,
mas como o próprio núcleo fornece esta facilidade, ele não pode utilizá-la, pois
ele pode não permanecer na memória para fornecer esta facilidade) e a falta de
reentrância, logo o seu desenvolvimento torna-se ainda mais difícil para
engenheiros de software.
Geralmente um núcleo vai fornecer recursos para escalonamento de processos
de baixo nível15, comunicação entre processos, sincronização de processos, troca
de contexto, manipulação de blocos de controle de processo, gerenciamento de
interrupções, criação e destruição de processos, e suspensão e continuação de
processos (veja estados de processos).1617

9
10Deitel 82, p.65-66 cap. 3.9
11Lorin 81 pp.161-186, Schroeder 77, Shaw 75 pp.245-267
12Brinch Hansen 70 pp.238-241
13O nível de privilégio mais alto possui vários nomes pelas diferentes arquiteturas, tais como
modo supervisor, modo núcleo, CPL0, DPL0, Anel 0, etc. Veja [Anel (segurança)] para mais
informações.
14Desenvolvimento do SO Bona Fide - Tutorial do Bran para Desenvolvimento de Núcleo, por
Brandon Friesen
15Para escalonamento de processos de baixo nível veja Deitel 82, ch. 10, pp. 249–268.
16
17
Facilidades básicas do núcleo
O principal propósito do núcleo é gerenciar os recursos do computador e
permitir que outros programas rodem e usem destes recursos.18 Tipicamente
estes recursos consistem de:
•A unidade de processamento central (CPU, p processador). Esta é a parte mais
central de um sistema de computação, responsável por rodar ou executar
programas nele. O núcleo têm a responsabilidade de decidir em qualquer
momento qual dos programas em execução deve ser alocado para o processador
ou processadores (cada um dos quais geralmente pode executar um programa
por vez)
•A memória. A memória é usada para armazenas ambos instruções do programa
e dados. Tipicamente, ambos precisam estar presentes na memória de modo a
tornar a execução do programa possível. Frequentemente múltiplos programas
buscarão acesso à memória ao mesmo tempo, na maioria das vezes exigindo mais
memória do que o computador pode disponibilizar. O núcleo é responsável pela
decisão de que memória cada processo pode utilizar, e determinar o que fazer
quando menos do suficiente está disponível.
•Qualquer dispositivo de entrada/saída presente no computador, tais como
teclado, rato, entradas de disquete, impressoras, telas, etc. O núcleo aloca
pedidos de aplicativos para realizar entrada/saída para um dispositivo
apropriado (ou subseção de um dispositivo, no caso de arquivos em um disco ou
janelas em uma tela) e fornece métodos convenientes para o uso do dispositivo
(tipicamente abstraído ao ponto onde o aplicativo não precisa mais conhecer os
detalhes da implementação do dispositivo).

Aspectos importantes no gerenciamento de recursos são a definição de um


domínio de execução (espaço de endereçamento) e o mecanismo de proteção
utilizado para mediar o acesso a recursos dentro de um domínio.19
Núcleos geralmente tão oferecem métodos para sincronização e comunicação
entre processos (IPC (em inglês)).
Um núcleo pode implementar estes recursos ele mesmo, ou depender de alguns
processos que ele executa para fornecer estas facilidades a outros processos, no
entanto neste caso ele deve oferecer algum modo do IPC permitir que processos
acessem as facilidades fornecidas um pelo outro.
Finalmente, um núcleo deve oferecer um método de acesso a estas facilidades
para os programas em execução.

18
19
Gerenciamento de Processos
A principal tarefa de um núcleo é permitir a execução de aplicativos e ajudá-los
com recursos como abstrações de hardware. Um processos define que porções
da memória o aplicativo pode acessar.20 (Para esta introdução, processo,
aplicativo e programa são usados como sinônimos.) O gerenciamento de
processos do núcleo deve levar em conta o equipamento de hardware embarcado
para proteção de memória.21
Para rodar um aplicativo, um núcleo geralmente cria um espaço de
endereçamento para o aplicativo, carrega o arquivo contendo de instruções do
programa na memória (talvez via paginação por demanda), cria uma pilha para o
programa e ramos para uma dada localização dentro do programa, iniciando,
portanto a sua execução.22
Núcleos multitarefa são capazes de dar ao usuário a ilusão de que um número de
processos que esta rodando simultaneamente no sistema é maior do que o
número de processos que aquele sistema é fisicamente capaz de rodar
simultaneamente. Usualmente, o número de processos que um sistema pode
rodar simultaneamente é igual o número de CPUs que ele possui instaladas (no
entanto, isto pode não ser o caso de processadores que suportam múltiplas
linhas de execução simultâneas).
Em um sistema multitarefas preemptivo, o núcleo dará a todos programas uma
parcela do tempo e vai alternar de processo a processo tão rapidamente que
dará ao usuário a impressão de como se os processos estivessem sendo
executados simultaneamente. O núcleo utiliza algoritmos de escalonamento para
determinar qual processo será executado a seguir e quanto tempo lhe será dado.
O algoritmo escolhido pode permitir que alguns processos tenham uma
prioridade mais alta que muitos outros. O núcleo geralmente também provê a
esses processos uma maneira de comunicarem-se; isto é chamado comunicação
entre processos (IPC (em inglês)) e as principais implementações são memória
compartilhada, troca de mensagens e chamadas de procedimento remoto (veja
computação concorrente).
Outros sistemas (particularmente em computadores menores, menos potentes)
podem fornecer multitarefa de cooperação, em que cada processo é permitido
rodar sem ininterruptamente até que ele faça uma requisição especial que avisa
ao núcleo que ele pode alternar para outro processo. Tais requisições são
conhecidos como "indulgências" (yielding(em inglês), e tipicamente ocorrem em
resposta a um pedido para comunicação entre processos, ou para esperar até o
acontecimento de um evento. Versões mais antigas de ambos Microsoft Windows
e Mac OS utilizaram o conceito de multitarefa cooperativa, mas alternaram para
esquemas preemptivos conforme a potência dos computadores alvo de seu
mercado aumentava[carece de fontes?].

20Levy 1984, p.5


21Needham, R.M., Wilkes, M. V. Domínio de proteção e gerenciamento de processos, Computer
Journal, vol. 17, no. 2 de maio de 1974, pp 117-120.
22Silberschatz 1990
O sistema operativo pode também suportar o multiprocessamento
(multiprocessamento simétrico (SMP (em inglês)), ou, acesso não-uniforme a
memória); neste caso, diferentes programas e linhas de execução podem rodar
em diferentes processadores. Um núcleo para tal sistema deve ser projeto para
ser reentrante, o que significa que ele pode rodar seguramente duas partes de
seu código simultaneamente. Isto tipicamente significa oferecer mecanismos de
sincronização (como trava-giros) para assegurar que dois processadores não
tentarão modificar os mesmos dados ao mesmo tempo.

Gerenciamento de Memória
O núcleo possui acesso completo a memória do sistema e deve permitir que
processos acessema memória com segurança conforme a sua necessidade.
Frequentemente o primeiro passo para isso é o endereçamento virtual,
geralmente alcançado através da paginação e/ou segmentação. Endereçamento
virtual permite ao núcleo fazer com que um dado endereço físico pareça ser
outro endereço, o endereço virtual. Espaços de endereço virtual podem ser
diferentes para diferentes processos; a memória que um processos acessa em um
endereço (virtual) particular pode ser diferente da que um outro processo acessa
pelo mesmo endereço. Isto permite a todos programas funcionar como se ele
fosse o único em execução, além do núcleo, e por isso evita que aplicativos
travem uns aos outros.23
Em vários sistemas, o endereço virtual de um programa pode se referir a dados
que não estão na memória atualmente. A cama de indireção oferecida pelo
endereçamento virtual permite que o sistema utilize meios de armazenagem de
dados, como um disco rígido, para armazenar o que de outro modo teria que
permanecer na memória (RAM(em inglês)). Como resultado. sistemas operativos
podem permitir que programas usem mais memória do que está fisicamente
disponível. Quando um programa precisa de dados que não estão na RAM, a CPU
avisa o núcleo que isto ocorre, e o núcleo responde escrevendo o conteúdo de um
bloco de memória inativo para o disco (se necessário), e substituindo-o na
memória com os dados requisitados pelo programa. O programa pode então
continuar sua execução do ponto em que foi suspenso. Este esquema é
geralmente conhecido como paginação por demanda.
Endereçamento virtual também permite a criação de partições virtuais de
memória em duas áreas separadas, uma sedo reservada para o núcleo (espaço de
núcleo) e o outro para os aplicativos (espaço de usuário). Os aplicativos não tem
permissão do processador para acessar a memória do núcleo, portanto
prevenindo que um aplicativo possa danificar o núcleo em execução. Esta
partição fundamental de espaço de memória contribuiu muito para os projetos de
núcleos realmente de propósito geral e é quase universal em tais sistemas,
embora algumas núcleos de pesquisa (ex. Singularity) usarem outros métodos.

23
Gerenciamento de dispositivos
Para realizar funções úteis, processos precisam acessar periféricos conectados
ao computador, que são controlados pelo núcleo através do driver do dispositivo.
Por exemplo, para mostrar ao usuário algo utilizando a tela, um aplicativo teria
que fazer um requisição ao núcleo que encaminharia a requisição para o seu
driver de tela, que é responsável por realmente tracejar os carácteres/pixeis.24
Um núcleo deve manter uma lista de dispositivos disponíveis. Esta lista pode ser
conhecida de antemão (ex. em um sistema embarcado onde o núcleo será
reescrito se o hardware disponível mudar), configurado pelo usuário (típico em
computadores pessoais antigos e em sistemas projetados para uso pessoal) ou
detectado pelo sistema durante a execução (normalmente chamado Ligar e
Usar).
Em um sistema "Ligar e Usar", um dispositivo realizar primeiro uma sondagem
em nos diferentes barramentos de hardware, como Interconector de
Componentes Periféricos (PCI(em inglês)) ou Barramento Serial Universal
(USB(em inglês)), para detectar os dispositivos instalados, depois busca os
drivers apropriados.
Como o gerenciamento de dispositivos é um tópico muito especifico do SO, estes
drivers são manipulados de modos diferentes por cada tipo de desenho de
núcleo, mas em todos os casos, o núcleo tem que fornecer a entrada/saída para
permitir que os drivers acessem fisicamente seus dispositivos através alguma
porta ou localização da memória. Decisões muito importantes precisam ser feitas
ao projetar o sistema de gerenciamento de dispositivos, já que em alguns
projetos de acesso podem envolver trocas de contexto , tornando a operação
custosa para o processador e causando um gasto excessivo de recursos.[carece de
fontes?]

Chamadas do Sistema
Para realmente realizar algo útil, um processo deve acessar os serviços
oferecidos pelo núcleo. Isto é implementado por cada núcleo, mas a maioria
oferece uma Biblioteca padrão do C ou uma Interface de programação de
aplicativos, que envolve as funções relativas ao núcleo.25
O método de invocar as funções do núcleo varia de núcleo para núcleo. Se o
isolamento de memória está sendo usado, é impossível para um processo de
usuário chamar o núcleo diretamente, por que isso seria uma violão das regras
de controle de acesso do processador. Algumas possibilidades são:
•Usar uma interrupção de software simulada. Este método está disponível na
maioria dos hardwares, e é, portanto, muito comum.

24
25Tanenbaum, Andrew S.. Modern Operating Systems. 3rd Edition.ed. pp. 50–51.
•Usando um portão de chamada. Um portão de chamada é um endereço especial
armazenado pelo núcleo em uma lista na memória do núcleo em uma localização
conhecida pelo processador. Quando o processador detecta uma chamada para
este endereço, ele ao invés disso redireciona para a localização alvo sem causar
nenhuma violação de acesso. Exige suporte no hardware, mas este tipo de
hardware é muito comum.
•Usando uma instrução de chamada de sistema especial. Esta técnica exige
suporte especial no hardware, que em algumas arquiteturas habituais não
possuem (notavelmente, x86). Instruções de chamadas de sistema foram
adicionadas a modelos recentes do processadores x86, embora, poucos (mas não
todos) sistemas operativos fazem uso destes quando disponíveis.
•Usando uma fila baseada na memória. Um aplicativo que faz um grande número
de requisições mas não precisa esperar o resultado de cada uma pode adicionar
detalhes das requisições em uma área da memória que o núcleo sonda
periodicamente para encontrar requisições.

Decisões de desenho do Núcleo

Problemas com o suporte do núcleo para proteção


Uma consideração importante no desenho do núcleo é o suporte que ele oferece
para proteção contra faltas (tolerância a falhas) e de comportamentos # mal-
intencionados (segurança). Estes dois aspectos geralmente não são claramente
distinguidos, e a separação no desenho do núcleo leva a rejeição de uma
estrutura hierárquica de proteção.26
Os mecanismos ou políticas oferecidos pelo núcleo podem ser classificados de
acordo com vários critérios, como: estático (forçado durante o tempo de
compilação) ou dinâmico (forçado durante o tempo de execução); preemptivo ou
pós-detecção; de acordo com os princípios de proteção a que eles correspondem
(ex. Denning2728); quer eles sejam suportados pelo hardware ou baseados em
linguagem; quer eles sejam mais um mecanismo aberto ou ma política
compulsiva; e muito mais.

26
27Denning 1976
28Swift 2005, p.29 quote: "isolação, controle de recursos, verificação de decisão (checagem), e
recuperação de erros."
Tolerância a falhas
Uma medida útil para o nível de tolerância a falhas de um sistema é quão estrito
ele é com relação ao princípio do menor privilégio.29 Em casos onde múltiplos
programas estão rodando em um único computador, é importante prevenir falhas
em um dos programas de afetar negativamente outro. Estendendo-se ao desenho
com más-intenções mais do que a falha em si, isto também implica a segurança,
quando é necessário impedir processos de acessar informações sem que lhes seja
dada a devida permissão.
As duas principais implementações via hardware30 para proteção (de informações
sensíveis) são domínios hierárquicos de proteção (também chamadas
arquiteturas anel, arquiteturas de segmento ou modo supervisor),31 e
endereçamento baseado em capacidades.32
anéis de privilégio, como na x86, são uma abordagem
habitual de domínios hierárquicos de proteção
usados em muitos sistemas comerciais para obter algum
nível de tolerância a falhas.
Domínios hierárquicos de proteção são muito
menos flexíveis, como no caso de qualquer núcleo
com uma estrutura hierárquica presumida
como um critério de desenvolvimento
global.33 No caso de proteção não é possível
designar diferentes privilégios a processos
que não estão no mesmo nível de privilégio, e por
isso não é possível corresponder aos quatro princípios de Denning para a
tolerância a falhas3435, particularmente o princípio do menor privilégio. Domínios
hierárquicos de proteção também carregam uma enorme desvantagem na
performance, já que a interação entre diferentes níveis de proteção, quando um
processos tem que manipular uma estrutura de dados em ambos 'modo usuário'
e 'modo supervisor', sempre exige cópia de mensagens (transmissão por valor).36
Um núcleo baseado em capacidades, no entanto, é mais flexível em designar
privilégios, pode corresponder aos princípios de Denning para a tolerância a
falhas37, e geralmente não sofrem de problemas de performance da cópia por
valor.

29Cook, D.J. Medindo a proteção da memória, aceito na terceira Conferência Internacional da


Engenharia de Software, Atlanta, Georgia, Maio de 1978.
30Swift 2005 p.26
31Intel Corporation 2002
32Houdek et al. 1981
33
34
35
36Hansen 73, Seção 7.3 p.233 "interações entre diferentes níveis de proteção exigem a
transmissão de mensagens por valor"
37Linden 76
Ambas implementações tipicamente exigem algum suporte de hardware ou
firmware para serem operáveis e eficientes. O suporte de hardware para
domínios hierárquicos de proteção38 geralmente é de "modos de CPU." Um modo
simples e eficiente de fornecer suporte a hardware é delegar à unidade de
gerenciamento de memória a responsabilidade por checar as permissões de
acesso para todos acessos a memória, um mecanismo chamado endereçamento
baseado em capacidades.39 Falta na maioria das arquiteturas comerciais, o
suporte a MMU para capacidades.
Uma abordagem alternativa é simular capacidades usando domínios hierárquicos
comumente suportados; nesta abordagem, cada objeto protegido deve residir
num espaço de endereçamento ao qual o aplicativo não possui acesso; o núcleo
também mantém uma lista de capacidades em tal memória. Quando um
aplicativo precisa acessar um objeto protegido por uma capacidade, ele realiza
uma chamada de sistema e o núcleo realiza o acesso a ele. O custo de
performance de trocar de espaço de endereçamento limita a praticabilidade
desta abordagem em sistemas com interações complexas entre objetos, mas é
utilizado nos sistemas operativos atuais para objetos que não são acessados
frequentemente ou que não devem ser feitos rapidamente.4041 Implementações
onde os mecanismos de proteção não suportados pelo firmware, mas são, ao
invés disso, simulados em níveos mais altos (ex. simulando capacidades ao
manipular tabelas de páginas em hardware que não possui suporte direto), são
possíveis, mas há implicações de performance.42 No entanto, falta de suporte no
hardware pode não ser problema, para sistemas que escolhem usar uma
proteção baseada em linguagem.43
Uma decisão importante no projeto do núcleo é a escolha dos níveis de abstração
em que os mecanismos e políticas de segurança devem ser implementados. Os
mecanismos de segurança do núcleo têm um papel crítico no suporte a
segurança nos níveis superiores.4445464748

38Schroeder 72
39
40Stephane Eranian & David Mosberger, Memória Virtual no núcleo Linux IA-64, Prentice Hall
PTR, 2002
41Silberschatz & Galvin, Conceitos de Ssistema Operativo, 4th ed, pp445 & 446
42Hoch, Charles; J. C. Browne (Universidade do Texas, Austin) (Julho 1980). " An implementation
of capabilities on the PDP-11/45" (pdf). ACM SIGOPS Operating Systems Review 14 (3): 22–32.
DOI: 10.1145/850697.850701.
43Uma Abordagem a Segurança Baseada em Linguagem, Schneider F., Morrissett G.
(Universidade Cornell) e Harper R. (Universidade Carnegie Mellon)
44
45P. A. Loscocco, S. D. Smalley, P. A. Muckelbauer, R. C. Taylor, S. J. Turner, and J. F. Farrell. A
Inevitabilidade do Futuro: A Presunção Falsa de Segurança no Ambiente de Computação
Moderna. Em procedimentos da 21ª Conferência Nacional de Segurança de Sistemas de
Informação, páginas 303–314, Out. de 1998. [0].
46J. Lepreau e outros. A Relevância Persistente do Ssistema Operativo Local aos Aplicativos
Globais. Procedimentos da 7ª ACM SIGOPS Eurcshelf/book001/book001.html Segurança da
Informação: Uma Coleção Integrada de Dissertações], IEEE Comp. 1995.
47J. Anderson, Estudo de Planejamento de Segurança de Computadores, Air Force Elect.
Systems Div., ESD-TR-73-51, Outubro de 1972.
48* Jerry H. Saltzer, Mike D. Schroeder (Setembro de 1975). " A proteção de informação em
sistemas de computador". Proceedings of the IEEE 63 (9): 1278–1308. DOI:
Uma abordagem é utilizar suporte no núcleo e firmware para tolerância a falhas
(ver acima), e montar as políticas de segurança para comportamento malicioso
em cima disso (adicionando recursos como mecanismos de criptografia quando
necessário), delegar mais responsabilidade para o compilador. Implementações
que delegam a aplicação de políticas de segurança para o compilador e/ou nível
do aplicativo são geralmente chamados segurança baseada em linguagem.
A falta de muitos mecanismos críticos de segurança nos principais sistemas
operativos impede a implementação adequada de políticas de segurança no nível
de abstração do aplicativo.49 Na verdade, um engano muito comum na segurança
de computadores é que qualquer política de segurança pode ser implementada
no aplicativo, independentemente do suporte no núcleo.50

Proteção baseada em hardware ou linguagem


Hoje, típicos sistemas de computação usam regras aplicadas pelo hardware
sobre quais programas têm permissão para acessar quais dados. O processador
monitora a execução e desliga um programa que viole uma regra (ex., um
processo de usuário que tenta ler ou escrever na memória do núcleo, e assim por
diante). Em sistemas que não possuem suporte para capacidades, processos são
isolados um do outro, utilizando-se espaços de endereçamento separados.51
Chamadas de um processo de usuário no núcleo são regidas pela exigência de
que eles usem um dos métodos de chamada do sistema descritos acima.
Uma abordagem alternativa é usar proteção baseada em linguagem. Em um
sistema de proteção baseado em linguagem, o núcleo vai permitir a execução
apenas de código produzido por um compilador em que ele confie. A linguagem
pode então, ser projetada de modo tal que será impossível para o programador
instruir algo que violaria os requisitos de segurança.52
Desvantagens incluem:
•Demora maior para a inicialização efetiva do aplicativo. Aplicativos deve ser
verificadas sempre que elas são iniciadas para garantir que eles foram
compiladas utilizando um compilador "corret", ou podem necessitar de
recompilação de ambos código fonte ou bytecode.
•Sistema s de tipo inflexível. Em sistemas tradicionais, aplicativos realizam
frequentemente operações que não são de tipagem forte. Tais operações não
podem ser permitidas em um sistema de proteção baseado em linguagem, o que
significa que aplicativos podem precisar ser reescritos e podem, em alguns
casos, perder performance.

10.1109/PROC.1975.9939.
49
50
51Jonathan S. Shapiro; Jonathan M. Smith; David J. Farber. " EROS: um sistema de capacidades
rápido". Procedimentos da 70º simpósio ACM sobre princípios de sistemas operativos.
52
Vantagens desta abordagem incluem:
•Separação de espaços de endereçamento desnecessária. A troca de espaços de
endereçamento é uma operação lenta que causa grande degradação na
performance, e muito trabalho de otimização é feito atualmente para prevenir
trocar desnecessárias nos sistemas operativos. Trocar é complemente
desnecessário em um sistema de proteção baseada em linguagem, já que todo
código opera no mesmo espaço de endereçamento.
•Flexibilidade. Qualquer esquema de proteção que possa ser desenvolvida para
ser expresso através de linguagem de programação pode ser implementada
através deste método. Mudanças no esquema de proteção (ex. de um sistema
hierárquico para um baseado em capacidades) não exigem novo hardware.

Exemplos de sistemas com proteção baseada em linguagem incluem o JX e


Singularity.

Cooperação de processos
Edsger Dijkstra provou que partindo de um ponto de vista lógico, operações
atômicas de travamento e destravamento operando em semáforos binários são
suficientemente primitivos para expressar a qualquer funcionalidade de
cooperação entre processos.53 No entanto esta abordagem é geralmente tomada
como deficiente em termos de segurança e eficiência, enquanto que uma
abordagem via troca de mensagens é mais flexível.54

Gerenciamento de dispositivos de entrada/saída


A ideia de um núcleo onde dispositivos de entrada/saída são gerenciados
uniformemente com outros processos, como processos paralelos em cooperação,
foi proposta e implementada primeiramente por Brinch Hansen (embora ideias
similares tenham sido sugeridas em 19675556). Na descrição de Hansen disto, os
processos "comuns" são chamados processos internos, enquanto que os
dispositivos de entrada/saída são chamados processos externos.57

53Dijkstra, E. W. Processos Sequenciais Cooperadores. Math. Dep., Technological U., Eindhoven,


Set. 1965.
54
55SHARER, um sistema de compartilhamento de tempo para o CDC 6600. Página visitada em
2007-01-07.
56Supervisores Dinâmicos - seu projeto e construção. Página visitada em 2007-01-07.
57
Abordagens de desenvolvimento de todo o
núcleo
Naturalmente, as tarefas e recursos listados acima podem ser fornecidas de
vários modos que diferem entre si em projeto e implementação.
O princípio da separação entre o mecanismo e a política é a diferença
substancial entre a filosofia de micronúcleo e núcleo monolítico.5859 Aqui um
mecanismo é o apoio que permite a implementação de várias políticas diferentes,
enquanto uma política é um "modo de operação" particular. Por exemplo, uma
mecanismo pode oferecer às tentativas de entrada de um usuário um método de
chamar um servidor de autorização para determinar se um acesso deve ser dado;
uma política pode ser para o servidor de autorização exigir uma senha e checá-la
contra uma senha embaralhada armazenada numa base de dados. Devido ao fato
do mecanismo ser genérico, a política pode ser alterada com mais facilidade (ex.
ao exigir o uso de um passe) do que se um mecanismo e política fossem
integrados no mesmo módulo.
Em um micronúcleo mínimo algumas políticas básicas são incluídas,60 e seus
mecanismos permite que o que está rodando sobre o núcleo (a parte
remanescente do sistema operativo e outras aplicações) decida quais políticas
adotar (como gerenciamento de memória, escalonamento de processo de alto
nível, gerenciamento de sistema de arquivos, etc.).6162 Um núcleo monolítico ao
invés disso, tende a incluir várias políticas, então restringindo o resto do sistema
dependente delas.

58Baiardi 1988
59Levin 75
60
61
62
Per Brinch Hansen apresentou um argumento convincente a favor da separação
do mecanismo e da política.6364 A falha em preencher completamente esta
separação, é uma das maiores causas para a falta de inovação nos sistemas
operativos existentes atualmente,65 um problema comum nas arquiteturas de
computador.666768 O projeto monolítico é induzido pela abordagem de arquitetura
"modo núcleo"/"modo usuário" para proteção (tecnicamente chamada de
domínios hierárquicos de proteção), que é comum em sistemas comercias
convencionais;69 na verdade, todo módulo que necessite de proteção é portanto
preferivelmente incluído no núcleo.70 Esta ligação entre projeto e "modo
privilegiado" pode ser reconduzida até o problema chave da separação do
mecanismo e da política;71 de fato, a abordagem de arquitetura de "modo
privilegiado" se funde ao mecanismo de proteção com as políticas de segurança,
enquanto a principal abordagem de arquitetura alternativa , endereçamento
baseado em capacidades, claramente distingue ambos, levando naturalmente ao
desenvolvimento de um micronúcleo design72 (veja Separação entre proteção e
segurança).
Enquanto núcleos monolíticos executam todo seu código no mesmo espaço de
endereçamento (espaço de núcleo) micronúcleos tentam executar a maior parte
dos seus serviços no espaço de usuário, buscando aprimorar a manutenção e
modulabilidade do código base.73 A maioria dos núcleos não se encaixa
exatamente em uma destas categorias, sendo mais encontrados entre estes dois
projetos. Os chamados núcleos híbridos. Projetos mais exóticos como
nanonúcleos e exonúcleos estão disponíveis, mas são usados raramente utilizado
para sistemas produtivos. O virtualizador Xen, por exemplo, é um exonúcleo.
Diagrama de núcleos monolíticos

63
64
65
66Denning 1980
67Jürgen Nehmer A Imoralidade dos sistemas operativos, ou: Pesquisa nos sistemas operativos
ainda é Justificável? Notas em Ciência da Computação; Vol. 563. Processo da Oficina
Internacional sobre sistemas operativos dos anos 90 em diante. pp. 77 - 83 (1991) ISBN 3-540-
54987-0 [1] citação: "Os últimos 25 anos mostraram que a pesquisa sobre arquiteturas de
sistemas operativos teve pouco efeito nos principais sistemas operativos." [2]
68Levy 84, p.1 citação: "Embora a complexidade dos aplicativos de computador aumenta
anualmente, a arquitetura de hardware subjacente para aplicativos se manteve intocada por
décadas."
69Levy 84, p.1 citação: "Arquiteturas convencionais suportam um único modo privilegiado de
operação. Esta estrutura leva a um desenvolvimento monolítico; qualquer módulo precisando de
proteção deve ser parte do único núcleo do sistema operativo. Se, ao contrário, qualquer módulo
pudesse executar em um domínio protegido, sistemas poderiam ser construídos como uma
coleção de módulos independentes ampliáveis por qualquer usuário."
70
71
72
73
Núcleos monolíticos
Em um núcleo monolítico, todos os
serviços do sistema operativo rodam junto
com a linha de execução principal do núcleo,
portanto, também se encontram na mesma
área de memória. Esta abordagem permite o
acesso vasto e poderoso de hardwares. Alguns
desenvolvedores, como desenvolvedor do UNIX
Ken Thompson, defendem que é "mais
fácil de implementar um núcleo monolítico" 74 que
micronúcleos. As principais desvantagens de núcleos monolíticos são as
dependências entre os componentes do sistema - um defeito em um driver de
dispositivo pode paralisar todo o sistema - e o fato de núcleos grandes podem se
tornar muito difíceis de manter.
Na abordagem do micronúcleo, o próprio núcleo
fornece apenas funcionalidades básicas que
permite a execução de servidores, programas
separados que assumem funções que seriam do núcleo
monolítico, como drivers de dispositivos, servidores de
interface de usuário, etc.
•BSD
•Linux
•MS-DOS e derivados, incluindo Windows 95,
Windows 98 e Windows ME
•Solaris
•Palm OS
Diagrama de interação de um micronúcleo.

Micronúcleos
A abordagem de micronúcleo consiste em
definir abstrações simples sobre o
hardware, com um conjunto de primitivos
ou chamadas de sistema para implementar
serviços mínimos do sistema operativo como
gerenciamento de memória, multitarefas, e
comunicação entre processos. Outros serviços, incluindo aqueles normalmente
fornecidos por um núcleo monolítico como rede, são implementados em
programas de espaço de usuário, conhecidos como servidores. Micronúcleos são
mais fáceis de manter do núcleos monolíticos, mas um grande número de
chamadas de sistemas de trocas de contexto podem desacelerar o sistema por
que eles geralmente geram mais degradação na performance do que simples
chamadas de função.

74Códigos Abertos : Vozes da Revolução do Código Aberto


Um micronúcleo permite a implementação das partes restantes do sistema
operativo como aplicativos normais escritos em linguagem de alto nível, e o uso
de diferentes sistemas operativos sobre o mesmo núcleo não-modificado.75 Ele
também torna possível alternar dinamicamente entre sistemas operativos e
manter mais de um deles ativos simultaneamente.76
•Hurd
•Minix
•Mach

Núcleos monolíticos x micronúcleos


Conforme o núcleo do computador crescem, um número de problemas se tornam
evidentes. Um dos mais óbvios é que o espaço de memória aumenta. Isto é
mitigado de certo modo ao aperfeiçoar o sistema de memória virtual, mas nem
todas arquitetura de computador suportam memórias virtuais.77 Para reduzir o
espaço utilizado pelo núcleo, modificações extensivas precisam ser realizadas
para remover cuidadosamente código inútil, que pode ser muito difícil devido a
dependências pouco aparentes entre partes de um núcleo com milhões de linhas
de código.
Pelo começo dos anos 1990, devido a vários problemas de núcleos monolíticos
em comparação a micronúcleos, núcleos monolíticos foram considerados
obsoletos por virtualmente todos pesquisadores de sistemas operativos. Como
resultado, o projeto do Linux, um núcleo monolítico mais do que um micronúcleo
foi o tópico da famosa discussão inflamada entre Linus Torvalds e Andrew
Tanenbaum.78 Há méritos em ambos argumentos presentes no debate
Tanenbaum–Torvalds.

75
76
77Endereçamento virtual é comumente mais obtido através da unidade de gerenciamento de
memória incorporado.
78Registros do debate entre Torvalds e Tanenbaum podem ser encontrados em dina.dk,
groups.google.com, oreilly.com e Sítio do Andrew Tanenbaum
Performances
Núcleos monolíticos são projetados para que todo o seu código fique no mesmo
espaço de endereçamento (espaço de núcleo), que alguns desenvolvedores
argumentam ser necessário para aumentar a performance do sistema.79 Alguns
desenvolvedores também sustentam a hipótese de que núcleos monolíticos são
extremamente eficientes se forem bem escritos.80Wikipedia:Fontes fiáveis
A performance de micronúcleos construídos nos anos 1980 e começos dos 1990
era terrível.8182 Estudos empíricos que mediram a performance destes
micronúcleos não analisaram os motivos para tal ineficiência .83 As explicações
para estes dados foram deixadas para o "folclore"[3], com a suposição de que
eles eram devido ao aumento da frequência da troca de modo núcleo para modo
usuário84, devido a maior frequência de comunicação entre processos85 e a
maioria frequência de trocas de contexto.86
De fato, como foi conjeturado em 1995, os motivos para a terrível performance
dos micronúcleos pode também ter sido: (1) uma real ineficiência na
implementação de toda a abordagem de micronúcleo, (2) conceitos particulares
implementados nesses micronúcleos, e (3) a implementação individual destes
conceitos.87 Portanto ainda falta estudar se a solução para construir um
micronúcleo eficiente foi, ao contrário de tentativas anteriores, a de aplicar as
técnicas corretas de construção.88
No outro extremo, a arquitetura de domínios hierárquicos de proteção que leva a
um projeto de núcleo monolítico89 gera impactos significativos na performance
cada vez que há uma interação entre diferentes níveis de proteção (ex. quando
um processo tem que manipular uma estrutura de dados em ambos 'modo
usuário' e 'modo supervisor'), desde que isto exija cópia de mensagem por
valor.90

79Matthew Russell. O que é Darwin (e como ele sustenta o Mac OS X). O'Reilly Media. citação:
"A natureza fortemente unida do núcleo monolítico permite torná-lo eficiente no uso do hardware
subjacente [...] Micronúcleos, por outro lado, rodam um número muito maior de processos no
espaço de usuário. [...] Infelizmente, estes benefícios trazem o custo de micronúcleos terem a
necessidade de passar informações dentro e fora do espaço do núcleo através de um processos
chamado troca de contexto. Trocas de contexto trazem uma degradação de performance
considerável." Estas afirmações não fazem parte de um artigo revisto por partes.
80
81
82Härtig 97
83
84
85
86
87
88
89
90
Em meados de 1990, a maioria dos pesquisadores abandonou a crença de que
ajustes cuidadosos poderiam reduzir estes impactos dramaticamente,[carece de fontes?]
mas recentemente, novos micronúcleos, otimizados para performance, tais como
os L491 e K42 vêm trabalhando nestes problemas.Wikipedia:Verificabilidade
A abordagem de núcleo híbrido combina velocidade e
projetos mais simples de um núcleo monolítico com a
modularidade e execução segura de um micronúcleo.

Núcleos híbridos
Núcleos híbridos são um acordo entre o
desenvolvimento de micronúcleos e núcleos
monolíticos. Isto implica em executar alguns
serviços (como a pilha de rede ou o sistema de
arquivos) no espaço do núcleo para reduzir o impacto na performance[carece de fontes?]
de um micronúcleo tradicional, mas ainda executar o código no núcleo (como
drivers de dispositivos) como servidores no espaço de usuário.
•BeOS / Haiku
•Microsoft Windows NT
•XNU (núcleo do Darwin utilizado no Mac OS X)

Nanonúcleos
Um nanonúcleo delega virtualmente todos os serviços — incluindo até os mais
básicos como controlador de interrupções ou o temporizador — para drivers de
dispositivo para tornar o requerimento de memória do núcleo ainda menor do
que o dos tradicionais micronúcleos.92
•Adeos
•Dycos [4]
•EROS
•EKA2
•Jari Operating System [5]
•JNode
•KeyKOS
•LSE/OS
•Mac OS nanonúcleo
•OZONE

91A família de núcleos L4 - Visão geral


92Arquitetura de nanonúcleo do KeyKOS
•Trion Operating System
•XtratuM [6]
Diagrama de interação de um exonúcleo.

Exonúcleos
Um exonúcleo é um tipo de núcleo que não
abstrai hardware in modelos teóricos. Ao
invés disso ele aloca recursos físicos de
hardware, como o tempo de um processador,
páginas de memória, e blocos de disco, para
diferentes programas. Um programa rodando em um exonúcleo pode ligar para
uma biblioteca do sistema operativo que usa o exonúcleo para simular as
astrações de um sistema operativo conhecido, ou ele pode desenvolver
abstrações específicas para aquele aplicativo para ume performance superior.93

História do desenvolvimento do núcleo

Núcleos dos primeiros sistemas operativos


Falando estritamente, um sistema operativo (e, isto inclui um núcleo) não é
obrigado a rodar um computador. Programas podem ser carregados diretamente
e executados na máquina de "metal descoberto", desde que os autores destes
programas estiverem dispostos a trabalhar sem nenuma abstração de hardware
ou suporte a sistema operativo. Os primeiros computadores operaram deste
maneira durante os anos de 1950, começo dos 1960, eram reiniciados e
recarregados entre cada execução de diferentes programas. Eventualmente,
pequenos programas auxiliares como carregadores de progrmas e depuradores
foram mantidos na memória entre as execuções, ou carregados de memória
somente de leitura . Conforme estas eram desenvolvidas, elas formaram a base
do que depois se tornaria o núcleo dos sistemas operativos. A abordagem de
"metal descoberto" ainda é usada hoje em alguns consoles de vídeo-jogo e
sistemas embarcados, mas no geral, computadores novos usam sistemas
operativos e núcleos modernos.
Em 1969 o RC 4000 Multiprogramming System introduziu a filosofia de
desenvolvimento de sistemas de pequeno nucleus "na qual sistemas operativos
para diferentes propósitos poderiam ser criados de maneira metódica",94 algo
que poderia ser chamado de abordagem de micronúcleo.

93Ssistema Operativo de Exonúcleo do MIT


94Hansen 2001 (os), pp.17-18
sistemas operativos de tempo compartilhado
Na década precedendo o fenômeno Unix, computadores aumentaram muito em
poder de processamento — ao ponto onde operadores de computador estavam
buscando novos modos de conseguir com que as pessoas usarem o tempo livre
em seus computadores. Uma das maiores evoluções durantes esta era foi o
tempo compartilhado, onde um número de usuários conseguiria pequenas
parcelas do tempo do computador, em uma taxa que pareceria que eles estavam
cada um conectado a sua própria máquina, embora mais lenta.95
O desenvolvimento dos sistemas de tempo compartilhado levou a inúmeros
problemas. Um deles foi que usuários, particularmente em universidades, onde
os sistemas estavam sendo desenvolvidos, pareciam tentar hackear o sistema
para conseguir mais tempo de processamento. Por esta razão, segurança e
controles de acesso se tornaram um foco principal do projeto Multics em 1965.96
Outro problema corrente era gerenciar apropriadamente os recursos do sistema:
usuários gastavam a maior parte do tempo iniciando na tela e pensando ao invés
de realmente utilizar os recursos do computador, e o sistema de tempo
compartilhado deveria dar tempo de processamento para um usuário ativo
durante estes períodos. Por fim, tipicamente os sistemas ofereciam uma
hierarquia de memória de várias camadas de profundidade, e particionar este
recurso caro levou a um grande desenvolvimento nos sistemas de memória
virtual.

UNIX
Diagrama da relação de família de predecessor/sucessor para os sistemas tipo unix.

95Versão BSTJ do C.ACM Jornal Unix


96Introdução e Visão Geral do Sistema Multics, por F. J. Corbató e V. A. Vissotsky.
Durante a fase de projeto do Unix, os
programadores decidiram modelar todo dispositivo
de alto nível como um arquivo, por que eles
acreditavam que o propósito da computação
era a transformação de dados.97 Por exemplo,
impressoras eram representadas como um
"ficheiro" em uma localização conhecida —
quando dados eram copiados para o arquivo,
ela imprimia-os. Outros sistemas, para fornecer
uma funcionalidade similar, possuem a
tendência de virtualizar dispositivos em um nível
mais baixo — ou seja, ambos dispositivos e
ficheiros seriam instâncias de algum
conceito de nível inferior. Virtualizar o sistema a
nível de ficheiros permitiu aos usuários manipular
todo o sistema usando seus conceitos e
ferramentas de gerenciamento de
ficheiros, simplificando a operação
dramaticamente. Como uma extensão do mesmo
paradigma, o Unix permite que
programadores manipulem arquivos
usando uma série de pequenos programas, usando o conceito de encadeamento,
que permitir aos usuários completar operações em etapas, alimentando um
ficheiro através de uma cadeia de ferramentas de propósito único. Embora o
resultado final fosse o mesmo, usar programas menores deste modo aumentou
drasticamente a flexibilidade, assim como o uso e desenvolvimento, permitindo
que o usuário modificasse seu fluxo de trabalho ao adicionar ou remover um
programa da cadeia.
No modelo Unix, o sistema operativo consiste de duas partes; primeira, a enorme
coleção de programas de utilidades que guiam a maioria das operações.98 No
Unix, do ponto de vista da programação, a distinção entre os dois é
extremamente tênue; o núcleo é um programa rodando no modo supervisor99 que
age como um carregador de programas e supervisor para os pequenos
programas de utilidade que integram o resto do sistema, e fornecem travas e
serviços de entrada/saída para estes programas; além disso, o núcleo não
intervém de modo algum no espaço de usuário.

97O Sistema UNIX — A Única Especificação do Unix


98
99
Ao longo dos anos o modelo de computação mudou, e o tratamento do Unix de
tudo como um ficheiro ou fluxo de baites não era mais universalmente aplicável
como antes. Embora um terminal pudesse ser tratado como um ficheiro ou fluxo
de baites, de que se exibia ou lia, o mesmo não parecia ser verdade para a
interface gráfica. Rede se tornou outro problema. Mesmo se a comunicação de
rede pudesse ser comparada ao acesso de ficheiros, a arquitetura de baixo nícel
orientada a pacotes lidava com pedaços discretos de dados e não com ficheiros
completos. Conforme a capacidade dos computadores crescia, o Unix se tornava
cada vez mais desorganizado com relação a código. Enquanto núcleos podiam ter
100.000 linhas de código nos anos 1970 e 1980, núcleos sucessores modernos do
núcleo do Unix como o Linux possuem mais de 4.5 milhões de linhas.100
Derivados modernos do Unix são geralmente baseados um núcleos monolíticos
que carregam módulos. Exemplos disto são o Linux, um núcleo monolítico com
suporte a núcleos, e diversas distribuições que o incluem, assim como os núcleos
das variantes do BSD como FreeBSD, DragonflyBSD, OpenBSD, NetBSD, etc.
Além destas alternativas, desenvolvedores amadores mantém uma comunidade
ativa de desenvolvimento de sistemas operativos, cheia de núcleos que são
criados como passa-tempo que acabam compartilhando vários dos recursos com
o Linux, e/ou os núcleos do FreeBSD, DragonflyBSD, OpenBSD e NetBSD e/ou
sendo compatíveis com eles.101

Mac OS
A Apple lançou Mac OS pela primeira vez em Friday, 15 de January de 2010,
empacotado com o seu computador pessoal Macintosh Apple. Pelos primeiros
lançamento, o Mac OS (ou Sistema de Software, como ele foi chamado) #careceu
de muitos recursos básicos, como multitarefas e um sistema hierárquico. Com o
tempo, o sistema operativo evoluiu e se tornou o Mac OS 9 com alguns recursos
adicionados, mas o núcleo se manteve basicamente o mesmo.[carece de fontes?] Em
oposição a isto, o Mac OS X é baseado no Darwin, que utiliza um conceito de
núcleo híbrido chamado XNU, criado combinando o núcleo do 4.3BSD e o
Mach.102

100Linux 2.6: Ele Vale Mais!, por David A. Wheeler, 12 de outubro de 2004
101Esta comunidade se reúne em sua maioria no Desenvolvimento de SO Bona Fide, O Fórum de
Mensagens Mega-Tokyo e outros sítios de entusiastas de sistemas operativos.
102XNU: O núcleo
Amiga
O Amiga da Commodore foi lançado em Friday, 15 de January de 2010, e
estava dentre os primeiros (e certamente mais bem sucedidos) computadores
domésticos a apresenter um sistema operativo com um micronúcleo. O núcleo do
Amiga, a exec.library, era pequena mas capaz, oferecendo multitarefas rápidas e
preemptivas em hardware similar ao do Apple Macintosh, e um sistema avançado
de ligações dinâmicas que permitia uma expansão fácil.103

Microsoft Windows
O Microsoft Windows foi lançado em 1985 como uma extensão para o MS-DOS.
Devido a sua dependência de outro sistema operativo, o microsoft windows até a
versão microsoft windows 95, são consideradas um ambiente operacional (não
confunda com sistema operativo). Esta linha de produtos continuou por 1980 e
1990, resultando nos lançamentos das séries Windows 9x, atualizando as
capacidades do sistema para endereçamento de 32 bites e multitarefas
preemptivo, através dos anos 1990, terminando com o lançamento do Windows
Me em 2000.
O lançamento do Windows XP em outubro de 2001 uniu as duas linhas de
produto, com a intenção de combinar a estabilidade do núcleo NT com os
recursos ao consumidor das séries 9x.104 A arquitetura do núcleo do windows nt é
considerada híbrida pois o pŕoprio núcleo contém tarefas como o gerenciador de
janelas e o gerenciador de comunicação entre processos, mas vários subsistemas
são executados no modo de usuário.105 O ponto de quebra exato entre espaço de
usuário e espaço de núcleo têm deslocado conforme a versão, mas a introdução
do Arcabouço de driver de espaço de usuário no windows vista, e escalonamento
de linha de execução no espaço de usuário no Windows 7,106 deslocou mais
recursos do núcleo núcleo para processos no espaço de usuário.

103Sheldon Leemon. O que torna isso tão ótimo! (Amiga Commodore). Creative Computing.
Página visitada em 2006-02-05.
104LinuxWorld IDC: Consolidação de Windows acontece
105Histórico do Windows: Histórico de Produtos de Mesa de Trabalho
106Holwerda, Thom (7 de fevereiro de 2009). Windows 7 ganha escalonamento de espaço de
usuário. OSNews. Página visitada em 2009-02-28.
Desenvolvimento de micronúcleos
Embora o Mach, desenvolvido na Universidade Carnegie Mellon de Friday, 15
de January de 2010 a Friday, 15 de January de 2010, é o micronúcleo de
propósito geral mais conhecido, outros micronúcleos foram desenvolvidos com
objetivos mais específicos. Um família de micronúcleos L4 (principalmente o
micronúcleo L3 e o L4) foi criada para demonstrar que micronúcleos não são
necessariamente lentos.107 Implementações mais novas como Fiasco e Pistachio
são capazes de executar o Linux junto com outros processo L4 em espaços de
endereçamento separados.108109
QNX é um Ssistema Operativo de tempo-real com um projeto de micronúcleo
minimalista que vem sendo desenvolvido deste Friday, 15 de January de 2010,
sendo mais bem-sucedido do que o Mach em alcançar os objetivos do paradigma
do micronúcleo.110 Ele é usado principalmente em sistemas embarcados e ẽm
situações em que o software não pode falhar, como nos braços robóticos do
ônibus espacial e máquinas que controlam a moeção de vidro a tolerâncias
extremamente finas, onde um minúsculo erro poderia custar centenas de
milhares de reais.

Ver também

A Wikiversidade possui materiais sobre


Operating Systems/Kernel Models at:

Modelos de Núcleo

•Comparação entre núcleos


•Compilador
•Driver de dispositivo
•Entrada/saída
•Pedido de interrupção
•Memória
1. Memória de acesso aleatório
2. Memória virtual
3. Paginação, Segmentação

107
108O micronúcleo Fiasco - Visão geral
109L4Ka - A família L4 de micronúcleos e amigos
110Visão Geral do Ssistema Operativo de Tempo-real
4. Espaço de troca
5. Espaço de usuário
6. Unidade de gerenciamento de memória

•Multitarefa
1. Processo
2. Linha de execução
3. Escalonamento
4. Tempo compartilhado
5. Troca de contexto
6. Comunicação entre processos

•Sistema operativo

Notas
Para notas referentes a fontes, veja a bibliografia abaixo.

Referências

•Roch, Benjamin (2004). Núcleo Monolítico x Micronúcleo (pdf). Página visitada


em 2006-10-12.
•Silberschatz, Abraham. Operating system concepts. Boston, Massachusetts: pp.
696.
•Deitel, Harvey M.. An introduction to operating systems. revisited first
edition.ed. pp. 673.
•Denning, Peter J. (December 1976). " Fault tolerant operating systems". ACM
Computing Surveys 8 (4): 359–389. DOI: 10.1145/356678.356680. ISSN 0360-0300.
•Denning, Peter J. (April 1980). " Why not innovations in computer
architecture?". ACM SIGARCH Computer Architecture News 8 (2): 4–7. DOI:
10.1145/859504.859506. ISSN 0163-5964.
•Hansen, Per Brinch (April 1970). " The nucleus of a Multiprogramming System".
Communications of the ACM 13 (4): 238–241. DOI: 10.1145/362258.362278.
ISSN 0001-0782.
•Hansen, Per Brinch. Operating System Principles. Englewood Cliffs: pp. 496.
•Hansen, Per Brinch (2001). " The evolution of operating systems" (pdf). Visitado
em 2006-10-24.

incluído em livro: Classic operating systems: from batch processing to


distributed systems. New York,: Per Brinch Hansen, . pp. 1–36.

•Hermann Härtig, Michael Hohmuth, Jochen Liedtke, Sebastian Schönberg, Jean


Wolter A performance de sistemas baseados no núcleo μ [7] ACM SIGOPS
Operating Systems Review, v.31 n.5, p. 66-77, Dec. 1997
•Houdek, M. E., Soltis, F. G., and Hoffman, R. L. 1981. IBM System/38 support
for capability-based addressing. In Proceedings of the 8th ACM International
Symposium on Computer Architecture. ACM/IEEE, pp. 341–348.
•Intel Corporation (2002) The IA-32 Architecture Software Developer’s Manual,
Volume 1: Basic Architecture
•Levin, R.; E. Cohen, W. Corwin, F. Pollack, William Wulf (1975). "
Policy/mechanism separation in Hydra". ACM Symposium on Operating Systems
Principles / Proceedings of the fifth ACM symposium on Operating systems
principles: 132–140.
•Levy, Henry M.. Capability-based computer systems. Maynard, Mass:
•Liedtke, Jochen. Sobre a construção do núcleo µ, Proc. 15th ACM Symposium
on Operating System Principles (SOSP), December 1995
•Linden, Theodore A. (December 1976). " Operating System Structures to
Support Security and Reliable Software". ACM Computing Surveys 8 (4): 409–
445. DOI: 10.1145/356678.356682. ISSN 0360-0300. [8]
•Lorin, Harold. Operating systems. Boston, Massachusetts: pp. 161–186.
•Schroeder, Michael D.; Jerome H. Saltzer (March 1972). " A hardware
architecture for implementing protection rings". Communications of the ACM 15
(3): 157–170. DOI: 10.1145/361268.361275. ISSN 0001-0782.
•Shaw, Alan C.. The logical design of Operating systems. pp. 304.
•Tanenbaum, Andrew S.. Structured Computer Organization. Englewood Cliffs,
New Jersey:
•Wulf, W.; E. Cohen, W. Corwin, A. Jones, R. Levin, C. Pierson, F. Pollack (June
1974). " HYDRA: o núcleo do um sistema operativo multiprocessado".
Communications of the ACM 17 (6): 337–345. DOI: 10.1145/355616.364017.
ISSN 0001-0782. [9]
•Baiardi, F.. Architettura dei Sistemi di Elaborazione, volume 1 (em Italian).
•Swift, Michael M; Brian N. Bershad , Henry M. Levy, Improving the reliability
of commodity operating systems, [10] ACM Transactions on Computer Systems
(TOCS), v.23 n.1, p. 77-110, February 2005

Leituras importantes
•Andrew Tanenbaum, Operating Systems - Design and Implementation (Third
edition);
•Andrew Tanenbaum, Modern Operating Systems (Second edition);
•Daniel P. Bovet, Marco Cesati, The Linux Kernel;
•David A. Peterson, Nitin Indurkhya, Patterson, Computer Organization and
Design, Morgan Koffman (ISBN 1-55860-428-6);
•B.S. Chalk, Computer Organisation and Architecture, Macmillan P.(ISBN 0-333-
64551-0).

Ligações externas
•KERNEL.ORG, sítio oficial do Linux..
•Núcleos de Sistemas Operativos no SourceForge.
•Núcleos de Sistemas Operativos no Freshmeat.
•MIT Sistemaoperacional de Exonúcleo.
•Imagem de núcleo - Wiki Debian.
•A arquitetura do nanonúcleo do KeyKOS, um artigo de 1992 por Norman Hardy
e outros..
•Uma visão geral do Ssistema Operativo NetWare, um artigo de 1994 por Drew
Major, Greg Minshall, e Kyle Powell (arquitetos pfincipais por trás do SO
NetWare).
•Kernelnewbies, uma comunidade para aprender a hackear o Linux.
•Comparação detalhada entre os núcleos dos sistemas operativos mais
populares.

Unix
Unix é um sistema operativo (ou sistema operacional) portátil (ou portável),
multitarefa e multiutilizador (ou multiusuário) originalmente criado por Ken
Thompson, que trabalhava nos Laboratórios Bell (Bell Labs) da AT&T. A marca
UNIX é uma propriedade do The Open Group, um consórcio formados por
empresas de informática.
História
Em 1965 formou-se um grupo de programadores, incluindo Ken Thompson,
Dennis Ritchie, Douglas McIlroy e Peter Weiner, num esforço conjunto da AT&T
(Laboratórios Bell), da General Electric (GE) e do MIT (Massachussets Institute
of Technology) para o desenvolvimento de um sistema operacional chamado
Multics.
O Multics deveria ser um sistema de tempo compartilhado para uma grande
comunidade de usuários. Entretanto, os recursos computacionais disponíveis à
época, particularmente os do computador utilizado, um GE 645, revelaram-se
insuficientes para as pretensões do projeto. Em 1969, a Bell retirou-se do
projeto. Duas razões principais foram citadas para explicar a sua saída. Primeira:
três instituições com objetivos díspares dificilmente alcançariam uma solução
satisfatória para cada uma delas (o MIT fazia pesquisa, AT&T monopolizava os
serviços de telefonia americanos e a GE queria vender computadores). A
segunda razão é que os participantes sofriam da síndrome do segundo projeto e,
por isso, queriam incluir no Multics tudo que tinha sido excluído dos sistemas
experimentais até então desenvolvidos.
Ainda em 1969, Ken Thompson, usando um ocioso computador PDP-7, começou a
reescrever o Multics num conceito menos ambicioso, batizado de Unics, usando
linguagem de montagem (assembly). Mais tarde, Brian Kernighan rebatizou o
novo sistema de Unix.
Um marco importante foi estabelecido em 1973, quando Dennis Ritchie e Ken
Thompson reescreveram o Unix, usando a linguagem C, para um computador
PDP-11. A linguagem C havia sido desenvolvida por Ritchie para substituir e
superar as limitações da linguagem B, desenvolvida por Thompson. O seu uso é
considerado uma das principais razões para a rápida difusão do Unix.
Finalmente, ao longo dos anos 70 e 80 foram sendo desenvolvidas as primeiras
distribuições de grande dimensão como os sistemas BSD (na Universidade de
Berkeley na Califórnia) e os System III e System V (nos Bell Labs).
Em 1977, a AT&T começou a fornecer o Unix para instituições comerciais. A
abertura do mercado comercial para o Unix deve muito a Peter Weiner - cientista
de Yale e fundador da Interactive System Corporation. Weiner conseguiu da
AT&T, então já desnudada de seu monopólio nas comunições e liberada para
atuação no mercado de software, licença para transportar e comercializar o
Unix para o computador Interdata 8/32 para ambiente de automação de
escritório. O Unix saía da linha das máquinas PDP, da Digital Equipament
Corporation (DEC), demonstrando a relativa facilidade de migração (transporte)
para outros computadores, e que, em parte, deveu-se ao uso da linguagem C. O
sucesso da Interactive de Weiner com seu produto provou que o Unix era
vendável e encorajou outros fabricantes a seguirem o mesmo curso. Iniciava-se a
abertura do chamado mercado Unix.
Com a crescente oferta de microcomputadores, outras empresas transportaram o
Unix para novas máquinas. Devido à disponibilidade dos fontes do Unix e à sua
simplicidade, muitos fabricantes alteraram o sistema, gerando variantes
personalizadas a partir do Unix básico licenciado pela AT&T. De 1977 a 1981, a
AT&T integrou muitas variantes no primeiro sistema Unix comercial chamado de
System III. Em 1983, após acrescentar vários melhoramentos ao System III, a
AT&T apresentava o novo Unix comercial, agora chamado de System V. Hoje, o
Unix System V é o padrão internacional de fato no mercado Unix, constando das
licitações de compra de equipamentos de grandes clientes na América, Europa e
Ásia.
Atualmente, Unix (ou *nix) é o nome dado a uma grande família de Sistemas
Operativos que partilham muitos dos conceitos dos Sistemas Unix originais,
sendo todos eles desenvolvidos em torno de padrões como o POSIX (Portable
Operating System Interface) e outros. Alguns dos Sistemas Operativos derivados
do Unix são: BSD (FreeBSD, OpenBSD e NetBSD), Solaris (anteriormente
conhecido por SunOS), IRIXG, AIX, HP-UX, Tru64, SCO, Linux (nas suas
centenas de distribuições), e até o Mac OS X (baseado em um núcleo Mach BSD
chamado Darwin). Existem mais de quarenta sistemas operacionais *nix, rodando
desde celulares a supercomputadores, de relógios de pulso a sistemas de grande
porte.

Características

Sistema operacional multitarefa


Multitarefa significa executar uma ou mais tarefas ou processos
simultaneamente. Na verdade, em um sistema monoprocessado, os processos são
executados seqüencialmente de forma tão rápida que parecem estar sendo
executados simultaneamente. O Unix escalona sua execução e reserva-lhes
recursos computacionais (intervalo de tempo de processamento, espaço em
memória RAM, espaço no disco rígido, etc.).
O Unix é um sistema operacional de multitarefa preemptiva. Isso significa que,
quando esgota-se um determinado intervalo de tempo (chamado quantum), o
Unix suspende a execução do processo, salva o seu contexto (informações
necessárias para a execução do processo), para que ele possa ser retomado
posteriormente, e coloca em execução o próximo processo da fila de espera. O
Unix também determina quando cada processo será executado, a duração de sua
execução e a sua prioridade sobre os outros.
A multitarefa, além de fazer com que o conjunto de tarefas seja executado mais
rapidamente, ainda permite que o usuário e o computador fiquem livres para
realizarem outras tarefas com o tempo economizado.
Sistema operacional multiutilizador
Uma característica importante do Unix é ser multiusuário (multiutilizador). Bovet
e Cesati [4] definem um sistema multiusuário como "aquele capaz de executar,
concorrente e independentemente, várias aplicações pertencentes a dois ou mais
usuários". O Unix possibilita que vários usuários usem um mesmo computador
simultaneamente, geralmente por meio de terminais. Cada terminal é composto
de um monitor, um teclado e, eventualmente, um mouse. Vários terminais podem
ser conectados ao mesmo computador num sistema Unix. Há alguns anos eram
usadas conexões seriais, mas atualmente é mais comum o uso de redes locais,
principalmente para o uso de terminais gráficos (ou terminais X), usando o
protocolo XDMCP.
O Unix gerencia os pedidos que os usuários fazem, evitando que um interfira
com outros. Cada usuário possui direitos de propriedade e permissões sobre
arquivos. Quaisquer arquivos modificados pelo usuário conservarão esses
direitos. Programas executados por um usuário comum estarão limitados em
termos de quais arquivos poderão acessar.
O sistema Unix possui dois tipos de usuários: o usuário root (também conhecido
como superusuário), que possui a missão de administrar o sistema, podendo
manipular todos os recursos do sistema operacional; e os usuários comuns, que
possuem direitos limitados.
Para que o sistema opere adequadamente em modo multiusuário, existem alguns
mecanismos: (i) um sistema de autenticação para identificação de cada usuário
(o programa login, p.ex., autentica o usuário verificando uma base de dados,
normalmente armazenada no arquivo /etc/passwd); (ii) sistema de arquivos com
permissões e propriedades sobre arquivos (os direitos anteriormente citados);
(iii) proteção de memória, impedindo que um processo de usuário acesse dados
ou interfira com outro processo. Esse último mecanismo é implementado com a
ajuda do hardware, que consiste na divisão do ambiente de processamento e
memória em modo supervisor (ou modo núcleo) e modo usuário.

Arquivos de dispositivo
Uma característica singular no Unix (e seus derivados) é a utilização intensiva do
conceito de arquivo. Quase todos os dispositivos são tratados como arquivos e,
como tais, seu acesso é obtido mediante a utilização das chamadas de sistema
open, read, write e close.

Os dispositivos de entrada e saída são classificados como sendo de bloco (disco,


p.ex.) ou de caractere (impressora, modem, etc.) e são associados a arquivos
mantidos no diretório /dev (v. detalhamento mais adiante).

Estrutura
A estrutura do sistema Unix.
Um sistema Unix consiste, basicamente,
de duas partes:
•núcleo - o núcleo do sistema operacional, a
parte que relaciona-se diretamente com o
hardware, e que executa num espaço de memória
privilegiado. Agenda processos, gerencia a
memória, controla o acesso a arquivos e a
dispositivos de hardware (estes, por meio dos
controladores de disposito - drivers - e
interrupções). O acesso ao núcleo é feito por
chamadas de sistema, que são funções
fornecidas pelo núcleo; essas funções são
disponibilizadas para as aplicações por bibliotecas de sistema C (libc).
•programas de sistema - são aplicações, que executam em espaços de memória
não privilegiados, e que fazem a interface entre o usuário e o núcleo. Consistem,
principalmente, de:

1.
1. Conjunto de bibliotecas C (libc)

1.
1. Shell - um ambiente que permite que o usuário digite comandos.

1.
1. Programas utilitários diversos - são programas usados para
manipular arquivos, controlar processos, etc.

1.
1. Ambiente gráfico (GUI) graphics user interface - eventualmente
utiliza-se também um ambiente gráfico para facilitar a interação do
usuário com o sistema.
Em um sistema Unix, o espaço de memória utilizado pelo núcleo é denominado
espaço do núcleo ou supervisor (em inglês: kernel space); a área de memória
para os outros programas é denominada espaço do usuário (user space). Essa
separação é um mecanismo de proteção que impede que programas comuns
interfiram com o sistema operacional.

Processos
Um processo, na visão mais simples, é uma instância de um programa em
execução. Um programa, para ser executado, deve ser carregado em memória; a
área de memória utilizada é dividida em três partes: código (text), dados
inicializados (data) e pilha (stack).
Por ser um sistema multitarefa, o Unix utiliza uma estrutura chamada tabela de
processos, que contém informações sobre cada processo, tais como: identificação
do processo (PID), dono, área de memória utilizada, estado (status). Apenas um
processo pode ocupar o processador em cada instante - o processo encontra-se
no estado "executando" (running). Os outros processos podem estar "prontos"
(ready), aguardando na fila de processos, ou então estão "dormindo" (asleep),
esperando alguma condição que permita sua execução.
Um processo em execução pode ser retirado do processador por duas razões: (i)
necessita acessar algum recurso, fazendo uma chamada de sistema - neste caso,
após sua retirada do processador, seu estado será alterado para "dormindo", até
que o recurso seja liberado pelo núcleo; (ii) o núcleo pode interromper o
processo (preempção) - neste caso, o processo irá para a fila de processos
(estado "pronto"), aguardando nova oportunidade para executar - ou porque a
fatia de tempo esgotou-se, ou porque o núcleo necessita realizar alguma tarefa.
Existem quatro chamadas de sistema principais associadas a processos: fork,
exec, exit e wait. fork é usada para criar um novo processo, que irá executar o
mesmo código (programa) do programa chamador (processo-pai); exec irá
determinar o código a ser executado pelo processo chamado (processo-filho);
exit termina o processo; wait faz a sincronização entre a finalização do processo-
filho e o processo-pai.
Sistema de arquivos
Sistema de arquivos é uma estrutura lógica que possibilita o armazenamento e
recuperação de arquivos. No Unix, arquivos são contidos em diretórios (ou
pastas), os quais são conectados em uma árvore que começa no diretório raiz
(designado por /). Mesmo os arquivos que se encontram em dispositivos de
armazenamento diferentes (discos rígidos, disquetes, CDs, DVDs, sistemas de
arquivos em rede) precisam ser conectados à árvore para que seu conteúdo
possa ser acessado. Cada dispositivo de armazenamento possui a sua própria
árvore de diretórios.
O processo de conectar a árvore de diretórios de um dispositivo de
armazenamento à árvore de diretórios raiz é chamado de "montar dispositivo de
armazenamento" (montagem) e é realizada por meio do comando mount. A
montagem associa o dispositivo a um subdiretório.

Estrutura de diretórios
A árvore de diretórios do Unix é dividida em várias ramificações menores e pode
variar de uma versão para outra. Os diretórios mais comuns são os seguintes:
/ — Diretório raiz - este é o diretório principal do sistema. Dentro dele estão
todos os diretórios do sistema.
/bin — Contém arquivos, programas do sistema, que são usados com
freqüência pelos usuários.
/boot — Contém arquivos necessários para a inicialização do sistema.
/dev — Contém arquivos usados para acessar dispositivos (periféricos)
existentes no computador.
/etc — Arquivos de configuração de seu computador local.
/home — Diretórios contendo os arquivos dos usuários.
/lib — Bibliotecas compartilhadas pelos programas do sistema e módulos do
núcleo.
/mnt — Diretório de montagem de dispositivos.
/mnt/cdrom — Subdiretório onde são montados os CDs. Após a montagem, o
conteúdo do CD se encontrará dentro deste diretório.
/mnt/floppy — Subdiretório onde são montados os disquetes. Após a
montagem, o conteúdo do disquete se encontrará dentro deste diretório.
/proc — Sistema de arquivos do núcleo. Este diretório não existe, ele é
colocado lá pelo núcleo e usado por diversos programas.
/root — Diretório do usuário root.
/sbin — Diretório de programas usados pelo superusuário (root) para
administração e controle do funcionamento do sistema.
/tmp — Diretório para armazenamento de arquivos temporários criados por
programas.
/usr — Contém maior parte de seus programas. Normalmente acessível
somente como leitura.
/var — Contém maior parte dos arquivos que são gravados com freqüência
pelos programas do sistema.

Particularidades
Um sistema Unix é orientado a arquivos, quase tudo nele é arquivo. Seus
comandos são na verdade arquivos executáveis, que são encontrados em lugares
previsíveis em sua árvore de diretórios, e até mesmo a comunicação entre
entidades e processos é feita por estruturas parecidas com arquivos. O acesso a
arquivos é organizado através de propriedades e proteções. Toda a segurança do
sistema depende, em grande parte, da combinação entre as propriedades e
proteções definidas em seus arquivos e suas contas de usuários.

Aplicações
O Unix permite a execução de pacotes de softwares aplicativos para apoio às
diversas atividades empresariais. Dentre estes pacotes destacam-se:
•geradores gráficos
•planilhas eletrônicas
•processadores de textos
•geradores de aplicações
•linguagens de 4° geração
•banco de dados
O Unix possui recursos de apoio à comunicação de dados, que proporcionam sua
integração com outros sistemas Unix, e até com outros sistemas operacionais
distintos. A integração com sistemas heterogêneos permite as seguintes
facilidades:
•compartilhamento de recursos e informações
•transferência de informações
•comunicação entre usuários remotos
•submissão de programas para serem executados em computadores remotos
•utilização dos terminais de uma máquina Unix como terminais de outras
máquinas remotas, mesmo com sistemas operacionais distintos.
Para última, o Unix oferece um ambiente integrado e amigável, voltado para a
gestão automatizada de escritório, com serviços que atenderão às seguintes
áreas:
•arquivamento eletrônico de informações
•processador de documentos
•agenda e calendário
•calculadora
•correio eletrônico

Ambiente gráfico do Unix

X Window System
Além do shell, o Unix suporta interface gráfica para o usuário. Nas primeiras
versões do Unix as interfaces do usuário eram baseadas apenas em caracteres
(modo texto) e o sistema compunha-se apenas do núcleo, de bibliotecas de
sistema, do shell e de alguns outros aplicativos. As versões mais recentes do
Unix, além de manterem o shell e seus comandos, incluem o X Window System
que, graças ao gerenciador de exibição e ao gerenciador de janelas, possui uma
interface atraente e intuitiva que aumenta em muito a produtividade do usuário.
Desenvolvido no MIT (Massachussets Institute of Technology), o X Window
System (também pode ser chamado de Xwindow) tornou-se o sistema gráfico do
Unix. O Xwindow funciona como gerenciador de exibição e por si só, não faz
muita coisa. Para termos um ambiente gráfico produtivo e completo, precisamos
também de um gerenciador de janelas.
O gerenciador de janelas proporciona ao ambiente gráfico a aparência e as
funcionalidades esperadas incluindo as bordas das janelas, botões, truques de
mouse, menus etc. Como no sistema Unix o gerenciador de exibição (X Window
System) é separado do gerenciador de janelas, dizemos que seu ambiente gráfico
é do tipo cliente-servidor. O Xwindow funciona como servidor e interage
diretamente com o mouse, o teclado e o vídeo. O gerenciador de janelas funciona
como cliente e se aproveita dos recursos disponibilizados pelo Xwindow.
O fato de o Unix possuir o gerenciador de exibição (Xwindow) separado do
gerenciador de janelas tornou possível o surgimento de dezenas de
gerenciadores de janelas diferentes. Os gerenciadores de janelas mais comuns
no mundo Unix são o Motif, Open Look, e o CDE. Também existem outros
gerenciadores de janelas que são bastante utilizados no Unix, principalmente nos
sistemas Unix-Like (versões gratuitas e clones do Unix). São eles: KDE, Gnome,
FVWM, BlackBox, Enlightenment, WindowMaker etc.
Gerenciador de janelas Window Maker.
Comandos
Esta é uma lista de programas de computador
para o sistema operacional Unix e os
sistemas compatíveis, como o Linux. Os
comandos do Unix tornam-se acessíveis ao
usuário a partir do momento em que ele
realiza o login no sistema. Se o usuário utiliza tais
comandos, então ele se encontra no modo shell,
também chamado de modo texto (ou Unix tradicional). Quando estiver utilizando
o modo gráfico, o usuário também poderá se utilizar de tais comandos desde que
abra uma janela de terminal (Xterm).
A linha de comando do sistema operacional Unix permite a realização de
inúmeras tarefas através de seus comandos, de manipulação de arquivos a
verificação do tráfego em rede. Para exibir uma descrição detalhada de cada
comando abra uma console ou xterm e digite man comando, onde comando é o
comando em questão.

Comandos de manipulação de diretório


mkdir cria um diretório vazio exemplo: mkdir docs

rmdir exclui um diretorio (se estiver vazio)rm -rf exclui um


diretório e todo o seu conteúdo (cuidado com este comando)cd entra
num diretório (exemplo: cd docs) ou retorna para HOMEcd / muda para o
diretório raizcd ~ vai direto para o diretório home do usuário
logado.cd - volta ao último diretório acessadopwd exibe o local
do diretório atualls lista o conteúdo do diretóriols -alh mostra o
conteúdo detalhado do diretóriols -a Exibe os arquivos "ocultos" do
determinado diretório.ls -ltr mostra os arquivos no formado longo(l) em
ordem inversa(r) de data (t)df (Unix)df mostra a utilização dos
sistemas de arquivos montadosdu (Unix)du -msh mostra o tamanho do
diretório em Megabyteswhereis mostra onde se encontra determinado arquivo
(binários) exemplo: whereis samba

Comandos para manipulação de arquivos


cat mostra o conteúdo de um arquivo binário ou texto

tac semelhante ao cat mas inverte a ordemtail mostra as últimas


linhas
de um arquivo. Ex: tail -f <arquivo> útil para visualizar arquivos de log
continuamente.

head mostra as primeiras linhas de um arquivo. Ex: head -100 visualiza


as 100 primeiras linhas do arquivo.less mostra o conteúdo de um arquivo
de texto com controlevi editor de ficheiros de textovim versão
melhorada do editor supracitadorm remoção de arquivos (também remove
diretórios, mas com o parâmetro -r, que significa recursividade)cp (Unix)cp
copia diretórios 'cp -r' copia recursivamentemv move ou renomeia
arquivos e diretórioschmod altera as permissões de arquivos ou
directórioschown altera o dono de arquivos ou directórioscmd>txt cria um
novo arquivo(txt) com o resultado do comando(cmd)cmd>>txt adiciona o
resultado do comando(cmd) ao fim do arquivo(txt)touch touch foo.txt -
cria um arquivo foo.txt vazio; também altera data e hora de
modificação para agora> arquivo.txt mais rápido que o touch para criação
de arquivossplit divide um arquivorecode recodifica um arquivo ex: recode
iso-8859-15..utf8 file_to_change.txt

Comandos para administração


man mostra o manual do comando.

adduser adiciona usuários. O useradd pode também ser usado.addgroup


adiciona grupos. o group add pode também ser usado.apropos realiza
pesquisa por palavra ou stringdmesg exibe as mensagens da
inicialização(log)du (unix)du exibe estado de ocupação dos
discos/partiçõesfind comando de busca ex: find ~/ -cmin -3userdel remove
usuáriosusermod modifica informações de um determinado usuário.groupmod
modifica informações de um determinado grupo.chfn altera informação
relativa a um utilizadorwho informa quem está logado no sistema.em
algumas versões do linux,

o comando w pode ser usado, e retorna informações mais detalhadas, como o


shell do usuário.

whoami informa com qual usuário você está logadopasswd modifica senha
(password) de usuáriosumask define padrões de criação de arquivos e
diretóriosps (Unix)ps mostra os processos correntesps -aux mostra
todos os processos correntes no sistemakill mata um processokillall
mata todos os processos com o nome informadosu troca para o super-
usuário root (é exigida a senha)su user troca para o usuário especificado
em 'user' (é exigida a senha)chown altera o proprietário de arquivos e
pastas (dono)
Comandos para administração de rede
ifconfig mostra as interfaces de redes ativas e as informações relacionadas a
cada uma delas

route mostra as informações referentes as rotasmtr mostra rota


até determinado IPnmap lista as portas de sistemas remotos/locais
atras de portas abertas. Pode verificar sistema operacional em
execução no host remoto.netstat exibe as portas e protocolos abertos no
sistema.iptraf analisador de trafego da rede com interface gráfica
baseada em diálogostcpdump sniffer muito popular. Sniffer é uma
ferramenta que "ouve" os pacotes que estão passando pela
rede.traceroute traça uma rota do host local até o destino mostrando os
roteadores intermediáriosnslookup consultas a serviços DNSdig
consultas a serviços DNS

Referências gerais
•[1] BACH, Maurice J. The design of the Unix operating system. New Jersey:
Prentice Hall, 1990.
•[2] TANENBAUM, Andrew. Sistemas operacionais modernos. Rio de Janeiro:
LTC, 1999.
•[3] MCKUSICK, Marshall K.; NEVILLE-NEIL, George V. The design and
implementation of the FreeBSD operating system. Boston: Addison-Wesley,
2004.
•[4] BOVET, Daniel P.; CESATI, Marco. Understanding the Linux kernel.
Sebastopol: O'Reilly, 2005.

Ver também
•ARX - SO da Acorn Computers baseado no Unix
•Plan 9 - baseado em alguns conceitos do UNIX. Também desenvolvido pelo Bell
Labs. Leva a filosofia de tudo é um arquivo mais a fundo. Onde até os servidores
são arquivos.
•Filosofia Unix
•Era Unix
Ligações externas
•Foca GNU/Linux
•UNIX ON-LINE Man Pages

Ken Thompson
Kenneth Thompson</font
Ken Thompson (esquerda) e Dennis Ritchie

(direita)
Nascimento 1943
Nova Orleães
Campo(s) Engenharia, ciência da computação
Prêmio(s) Prêmio Turing (1983)
Kenneth Thompson (Nova Orleães, 1943) é um cientista computacional,
conhecido pela sua influência no sistema operacional UNIX.
Bachelor e master, ambos em engenharia electrotécnica, na UC Berkeley. Em
1969, enquanto trabalhava nos laboratórios Bell, Thompson e Dennis Ritchie
foram os principais criadores do sistema operacional UNIX. Thompson também
criou a linguagem de programação B, uma precursora da linguagem C de Dennis
Ritchie, uma das linguagens de programação mais utilizadas. Mais tarde,
enquanto se encontrava ao serviço dos laboratórios Bell, ele e Rob Pike foram os
principais criadores do sistema operacional Plan 9. Durante o seu trabalho, ele
também criou a codificação de caracteres UTF-8 para uso no sistema operacional
Plan 9. Ele também escreveu programas para a enumeração completa de
finalizações de xadrez, para todas as finalizações de 4, 5 e 6 peças. Recorrendo a
esse programa, um programa de jogo de xadrez tem a capacidade de jogar
perfeitamente ao atingir-se uma das situações pré-definidas. Thompson e Ritchie
receberam conjuntamente o Prémio Turing em 1983 "pelo seu desenvolvimento
de teoria de sistemas operacionais genéricos e especialmente pela sua
implementação do sistema operacional UNIX". Thompson reformou-se dos
laboratórios Bell no dia 1 de Dezembro de 2000.
Ver também
•UNIX
•Bell Labs
•Linguagem B
Precedido por Prêmio Turing Sucedido por
Stephen Cook 1983 Niklaus Wirth
com Dennis Ritchie

Dennis Ritchie
Dennis MacAlistair Ritchie

Dennis Ritchie (direita) e Ken Thompson, em 1984


Nascimento 9 de Setembro de 1941
Bronxville
Campo(s) Física, matemática aplicada, ciência da
computação
Prêmio(s) Prêmio Turing (1983)
Dennis MacAlistair Ritchie (Bronxville, 9 de Setembro de 1941) é um cientista
da computação estadunidense.
Notável pela sua influência em ALTRAN, B, BCPL, C, Multics e UNIX.
Nascido em Bronxville, Nova Iorque, Ritchie formou-se em física e matemática
aplicada pela Universidade de Harvard. Em 1967, ele começou a trabalhar no
Centro de Investigação de Ciências Computacionais dos laboratórios Bell. É
actualmente o director do Departamento de Investigação de Software de
Sistemas da Lucent Technologies. Em 1983, ele e Ken Thompson receberam o
prémio Turing "pelo seu desenvolvimento de teoria de sistemas operativos
genéricos e especialmente pela sua implementação do sistema operativo UNIX."
C e UNIX
Ao perguntarem-lhe sobre o que lhe influenciou a desenvolver a linguagem C da
maneira que ele a fez, Ritchie terá respondido que "parecia a coisa certa a ser
feita" e que qualquer pessoa que se encontrasse na mesma altura e no mesmo
lugar que ele teria feito a mesma coisa. Um dos seus colegas dos laboratórios
Bell, Bjarne Stroustrup, que desenvolveu e projectou a linguagem C++, uma
versão da linguagem C mais vocacionada para a programação orientada por
objectos, supostamente disse que "se o Dennis tivesse optado por dedicar-se
naquela década à matemática esotérica, o UNIX teria sido um nado-morto."
Certamente, sendo o inventor da linguagem de programação C e o co-inventor
(juntamente com Ken Thompson) do sistema operativo UNIX, Ritchie ganhou um
lugar importante na história da indústria informática. A linguagem C continua a
ser largamente utilizada no desenvolvimento de aplicações e sistemas operativos
e a sua influência pode ser vista em linguagens de programação mais recentes,
tais como C++, Java, C# e JavaScript.
No mundo dos sistemas operativos, o UNIX é também muito influente. Existem
actualmente muitos "dialectos" dele disponíveis no mercado, tais como AIX,
Solaris e Minix, e o popular GNU/Linux. Até a Microsoft, cujo sistema operativo
Windows compete com o UNIX, desenvolveu ferramentas de compatibilidade de
UNIX e compiladores de C para utilizadores e criadores dos seus produtos.

Alcunhas
Dennis Ritchie é frequentemente referido como "DMR" em vários grupos de
discussão da Usenet (tais como comp.lang.c); ele é o "R" do K&R.

Publicações
•"The C Programming Language", Dennis Ritchie, Brian Kernighan, (1978)
(No Brasil: C - A Linguagem de Programação - Ed. Campus, 1986)
•"Unix Programmer's Manual", Dennis Ritchie (1971)

Ligações externas
•Página pessoal
•Unix.se - Entrevista a Ritchie publicada a 7 de Fevereiro de 2003
•Ritchie e Thompson a receber a medalha nacional da tecnologia do Presidente
Clinton
•The future according to Dennis Ritchie - LinuxWorld.com 12/4/00
•Unix's founding fathers - Economist.com, July 12, 2004
Precedido por Prêmio Turing Sucedido por
Stephen Cook 1983 Niklaus Wirth
com Ken Thompson

C (linguagem de programação)
C
Paradigma Programação estruturada
Programação imperativa
Programação procedural
Programação genérica
Surgido em 1972
Última versão C99 (1999)

Criado por Dennis Ritchie


Estilo de tipagem: Estática, Fraco
Compiladores Borland C, GNU GCC, Microsoft Visual
Studio, Turbo C, Watcom C, Tiny C
Compiler
Dialetos: ANSI C, C99, ISO C, K&R C
Influenciada por ALGOL 68, Assembly, B, BCPL, CPL,
Fortran, PL/I
Influenciou AWK, BitC, C++, C#, C Shell, D,
Euphoria, Java, JavaScript, Limbo, Logic
Basic, Objective-C, Perl, PHP
Licença: Dependente de implementação
C é uma linguagem de programação compilada de propósito geral, estruturada,
imperativa, procedural, de alto nível, e padronizada, criada em 1972, por Dennis
Ritchie, no AT&T Bell Labs, para desenvolver o sistema operacional UNIX (que
foi originalmente escrito em Assembly).111 A linguagem C é classificada de alto
nível pela própria definição desse tipo de linguagem. A programação em
linguagens de alto nível tem como característica não ser necessário conhecer o
processador, ao contrário das linguagens de baixo nível. As linguagens de baixo
nível estão fortemente ligadas ao processador. A linguagem C permite acesso de
baixo nível com a utilização de código Assembly no meio do código fonte. Assim,
o baixo nível é realizado por Assembly e não C. Desde então, espalhou-se por
muitos outros sistemas, e tornou-se uma das linguagens de programação mais
usadas, e influenciou muitas outras linguagens, especialmente C++, que foi
originalmente desenvolvida como uma extensão para C.

111History of the C Programming Language.


História
Ken Thompson e Dennis Ritchie (da esquerda para
direita), os criadores das linguagens B e C,
respectivamente.
O desenvolvimento inicial de C, ocorreu no
AT&T Bell Labs, entre 1969 e 1973. Não se
sabe se o nome "C" foi dado à linguagem
porque muitas de suas características
derivaram da linguagem B e C é a letra
conseguinte no alfabeto, ou porque "C" é a
segunda letra do nome da linguagem BCPL, da
qual derivou-se a linguagem B.
C foi originalmente desenvolvido, para a implementação do sistema UNIX
(originalmente escrito em PDP-7 Assembly, por Dennis Ritchie e Ken Thompson).
Em 1973, com a adição do tipo struct, C tornou-se poderoso o bastante para a
maioria das partes do núcleo do UNIX, serem reescritas em C. Este foi um dos
primeiros sistemas que foram implementados em uma linguagem, que não o
Assembly, sendo exemplos anteriores, os sistemas: Multics (escrito em PL/I) e
TRIPOS (escrito em BCPL). Segundo Ritchie, o período mais criativo ocorreu em
1972.

K&R C
Em 1978, Brian Kernighan e Dennis Ritchie publicaram a primeira edição do
livro The C Programming Language. Esse livro, conhecido pelos programadores
de C, como "K&R", serviu durante muitos anos como uma especificação informal
da linguagem. A versão da linguagem C que ele descreve é usualmente referida
como "K&R C". A segunda edição do livro, cobriu o padrão posterior, o ANSI C.
K&R C introduziu as seguintes características na linguagem:
•Biblioteca padrão de E/S;
•Tipos de dado struct;

•Tipos de dado long int;

•Tipos de dado unsigned int;

•O operador =+ foi alterado para +=, e =- para -= (o analisador léxico do


compilador fazia confusão entre i =+ 10 e i = +10. O mesmo acontecia com =-).

K&R C é freqüentemente considerado a parte mais básica da linguagem, cujo


suporte deve ser assegurado por um compilador C. Durante muitos anos, mesmo
após a introdução do padrão ANSI C, K&R C foi considerado o "menor
denominador comum", em que programadores de C se apoiavam quando uma
portabilidade máxima era desejada, já que nem todos os compiladores eram
actualizados o bastante para suportar o padrão ANSI C.
Nos anos que se seguiram à publicação do K&R C, algumas características "não-
oficiais" foram adicionadas à linguagem, suportadas por compiladores da AT&T e
de outros vendedores. Estas incluíam:
•Funções void e tipos de dados void *;

•Funções que retornam tipos struct ou union;

•Campos de nome struct num espaço de nome separado para cada tipo struct;

•Atribuição a tipos de dados struct;

•Qualificadores const para criar um objecto só de leitura;


•Biblioteca padrão, que incorpora grande parte da funcionalidade implementada
por vários vendedores;
•Enumerações;
•Cálculos de ponto-flutuante em precisão simples (no K&R C, os cálculos
intermediários eram feitos sempre em double, porque era mais eficiente na
máquina onde a primeira implementação do C foi feita).

ANSI C e ISO C
Durante os finais da década de 1970, a linguagem C começou a substituir a
linguagem BASIC como a linguagem de programação de microcomputadores
mais usada. Durante a década de 1980, foi adaptada para uso no PC IBM, e a sua
popularidade começou a aumentar significativamente. Ao mesmo tempo, Bjarne
Stroustrup, juntamente com outros nos laboratórios Bell, começou a trabalhar
num projecto onde se adicionavam construções de linguagens de programação
orientada por objectos à linguagem C. A linguagem que eles produziram,
chamada C++, é nos dias de hoje a linguagem de programação de aplicações
mais comum no sistema operativo Windows da companhia Microsoft; C
permanece mais popular no mundo UNIX.
Em 1983, o instituto norte-americano de padrões (ANSI) formou um comité,
X3J11, para estabelecer uma especificação do padrão da linguagem C. Após um
processo longo e árduo, o padrão foi completo em 1989 e ratificado como ANSI
X3.159-1989 "Programming Language C". Esta versão da linguagem é
freqüentemente referida como ANSI C. Em 1990, o padrão ANSI C, após sofrer
umas modificações menores, foi adotado pela Organização Internacional de
Padrões (ISO) como ISO/IEC 9899:1990, também conhecido como C89 ou C90.
Um dos objetivos do processo de padronização ANSI C foi o de produzir um
sobreconjunto do K&R C, incorporando muitas das características não-oficiais
subseqüentemente introduzidas. Entretanto, muitos programas tinham sido
escritos e que não compilavam em certas plataformas, ou com um certo
compilador, devido ao uso de bibliotecas de funções não-padrão e ao fato de
alguns compiladores não aderirem ao ANSI C.
C99
Após o processo da padronização ANSI, as especificações da linguagem C
permaneceram relativamente estáticas por algum tempo, enquanto que a
linguagem C++ continuou a evoluir. (em 1995, a Normative Amendment 1 criou
uma versão nova da linguagem C mas esta versão raramente é tida em conta.)
Contudo, o padrão foi submetido a uma revisão nos finais da década de 1990,
levando à publicação da norma ISO 9899:1999 em 1999. Este padrão é
geralmente referido como "C99". O padrão foi adoptado como um padrão ANSI
em Março de 2000. As novas características do C99 incluem:
•Funções em linha
•Remoção de restrições sobre a localização da declaração de variáveis (como em
C++)
•Adição de vários tipos de dados novos, incluindo o long long int (para minimizar
problemas na transição de 32-bits para 64-bits), um tipo de dados boolean
explicito (chamado _Bool) e um tipo complex que representa números complexos
•Vetores de dados de comprimento variável (o vetor pode ter um tamanho
diferente a cada execução de uma função, mas não cresce depois de criado)
•Suporte oficial para comentários de uma linha iniciados por //, emprestados da
linguagem C++
•Várias funções de biblioteca novas, tais como snprintf()

•Vários ficheiros-cabeçalho novos, tais como stdint.h

O interesse em suportar as características novas de C99 parece depender muito


das entidades. Apesar do GCC e vários outros compiladores suportarem grande
parte das novas características do C99, os compiladores mantidos pela Microsoft
e pela Borland suportam pouquíssimos recursos do C99, e estas duas
companhias não parecem estar muito interessadas em adicionar tais
funcionalidades, ignorando por completo as normas internacionais. A Microsoft
parece preferir dar mais ênfase ao C++.112

C1X
Em 2007, se iniciou o trabalho em antecipação de outra revisão do padrão de C,
informalmente chamada "C1X". O comitê dos padrões de C adotaram regras para
limitar a adoção dos novos recursos que não haviam sido testadas pelas
implementações existentes.113

112[11]
113Grupo de trabalho do ISO C
Visão geral
C é uma linguagem imperativa e procedural, para implementação de sistemas.
Seus pontos de design foram para ele ser compilado, fornecendo acesso de baixo
nível à memória e baixos requerimentos do hardware. Também foi desenvolvido
para ser uma linguagem de alto nível, para maior reaproveitamento do código. C
foi útil para muitas aplicações que foram codificadas originalmente em
Assembly.
Essa propriedade não foi acidental; a linguagem C foi criada com o objectivo
principal em mente: facilitar a criação de programas extensos com menos erros,
recorrendo ao paradigma da programação algorítmica ou procedimental, mas
sobrecarregando menos o autor do compilador, cujo trabalho complica-se ao ter
de realizar as características complexas da linguagem. Para este fim, a
linguagem C possui as seguintes características:
•Uma linguagem nuclear extremamente simples, com funcionalidades não-
essenciais, tais como funções matemáticas ou manuseamento de ficheiros
(arquivos), fornecida por um conjunto de bibliotecas de rotinas padronizada;
•A focalização no paradigma de programação procedimental;
•Um sistema de tipos simples que evita várias operações que não fazem sentido
•Uso de uma linguagem de pré-processamento, o pré-processador de C, para
tarefas tais como a definição de macros e a inclusão de múltiplos ficheiros de
código fonte;
•Ponteiros dão maior flexibilidade à linguagem;
•Acesso de baixo-nível, através de inclusões de código Assembly no meio do
programa C;
•Parâmetros que são sempre passados por valor para as funções e nunca por
referência (É possível simular a passagem por referência com o uso de
ponteiros);
•Definição do alcance lexical de variáveis;
•Estruturas de variáveis, (structs), que permitem que dados relacionados sejam
combinados e manipulados como um todo.
Algumas características úteis, que faltam em C, podem ser encontradas em
outras linguagens, que incluem:
•Segurança de tipo;
•Coletor de lixo (mais comum em linguagens interpretadas);
•Vetores que crescem automaticamete;
•Classes ou objectos com comportamento (ver orientação a objetos);
•Closures;
•Funções aninhadas;
•Programação genérica;
•Sobrecarga de operadores;
•Meta-programação;
•Apoio nativo de multithreading e comunicação por rede.
Apesar da lista de características úteis que C possui não ser longa, isso não tem
sido um impedimento à sua aceitação, pois isso permite que novos compiladores
de C sejam escritos rapidamente para novas plataformas, e também permite que
o programador permaneça sempre em controle do que o programa está a fazer.
Isto é o que por várias vezes permite o código de C correr de uma forma mais
eficiente que muitas outras linguagens. Tipicamente, só código de assembly
"afinado à mão" é que corre mais rapidamente, pois possui um controle completo
da máquina, mas avanços na área de compiladores juntamente com uma nova
complexidade nos processadores modernos permitiram que a diferença tenha
sido rapidamente eliminada. Uma consequência da aceitação geral da linguagem
C é que freqüentemente os compiladores, bibliotecas e até intérpretes de outras
linguagens de nível maior sejam eles próprios implementados em C.
C tem como ponto forte, a sua eficiência, e é a linguagem de programação
preferida para o desenvolvimento de sistemas e softwares de base, apesar de
também ser usada para desenvolver programas de computador. É também muito
usada no ensino de ciência da computação, mesmo não tendo sido projetada para
estudantes e apresentando algumas dificuldades no seu uso. Outra característica
importante de C, é sua proximidade do código de máquina, que permite que um
projetista seja capaz de fazer algumas previsões de como o software irá se
comportar, ao ser executado.
C tem como ponto fraco, a falta de proteção que dá ao programador.
Praticamente tudo que se expressa em um programa em C, pode ser executado,
como por exemplo, pedir o vigésimo membro de um vetor com apenas dez
membros. Os resultados são muitas vezes totalmente inesperados, e os erros,
difíceis de encontrar.
Tipos de dado
C tem um sistema de tipos semelhante ao de alguns descendentes da linguagem
ALGOL, tais como Pascal. Possui tipos para números inteiros de vários tamanhos
com e sem sinal, números de ponto flutuante, caracteres e estruturas (structs). C
usa extensivamente ponteiros, um tipo muito simples de referência que guarda
o endereço de memória da variável. O ponteiro pode ser desreferenciado, uma
operação que busca o objecto que se encontra na morada da memória que o
ponteiro possui, morada essa que pode ser manipulada através de aritmética de
ponteiros. Durante o tempo de execução, o ponteiro é simplesmente uma morada
de máquina tais como aquelas manipuladas em assembly, mas em tempo de
compilação possui um tipo complexo que indica o tipo do objecto para onde ele
aponta, permitindo que se verifique o tipo de expressões, incluindo ponteiros. Os
ponteiros são usados extensivamente em C. O tipo linha de texto de C é
simplesmente um ponteiro para um vetor de caracteres e alocação dinâmica de
memória, descrita abaixo, é efectuada através de ponteiros.
Os ponteiros em C possuem um valor reservado especial, NULL, que indica que
não estão a apontar para uma morada. O uso desse valor como morada é muito
útil na construção de várias estruturas de dados, mas causa comportamento não-
definido (possivelmente uma falha de sistema) ao ser desreferenciado. Um
ponteiro que possui o valor NULL é chamado ponteiro nulo. Os ponteiros são
declarados (e desreferenciados) com um * (asterisco), portanto o tipo int* denota
um ponteiro para número(s) inteiro(s). A linguagem C também fornece um tipo
especial de ponteiros, o void*, que se traduz num ponteiro que aponta para um
objecto de tipo desconhecido.
A linguagem C também tem apoio a nível de linguagem para vetores estáticas
(de dimensão fixa) de tipos. As disposições de tipos podem parecer ter mais que
uma dimensão apesar de serem tecnicamente disposições de disposições de
tipos. Em memória, tais estruturas são posicionadas com as linhas uma depois da
outra (a alternativa seria armazenar os dados em colunas, usado em outras
linguagens). O acesso a disposições de tipos é feito através de ponteiros e
aritmética de ponteiros; o nome da disposição é tratado como se fosse um
ponteiro que aponta para o início da disposição. Em certas aplicações não é
razoável usarem-se disposições de tipos de dimensão fixa e por isso a alocação
dinâmica de memória pode ser usada para criar disposições de tipos de
dimensão variável.
Como a linguagem C é regularmente usada em programação de baixo-nível de
sistemas, há casos em que é necessário tratar um número inteiro como sendo um
ponteiro, um número de ponto flutuante como sendo um número inteiro ou um
tipo de ponteiro como sendo outro. Para estes casos, a linguagem C fornece a
capacidade de "moldagem" (também denominado "conversão de tipo" ou
casting), uma operação que, caso seja possível, força a conversão de um objecto
de um tipo para outro. Apesar de ser por vezes necessário, o uso de conversões
de tipo sacrifica alguma segurança oferecida pelo sistema de tipos.
int
O tipo de dados int (inteiro) serve para armazenar valores numéricos inteiros.
Existem vários tipos de inteiros, cada um de um tamanho diferente (dependendo
do sistema operacional e/ou arquitetura do processador):
•int, pode possuir 16 bits, 32 bits ou 64 bits
•short int, deve possuir tamanho de no mínimo 16 bits e não pode ser maior que
int

•long int, deve possuir tamanho mínimo de 32 bits


•long long int, deve possuir tamanho mínimo de 64 bits

Todos estes tipos de inteiros podem ainda ser declarados precedidos da cláusula
unsigned, o que faz com que só suporte números positivos. Isto faz com que, com
o mesmo tamanho, uma variável suporte mais números positivos do que um
signed (todos os inteiros são signed por omissão).
char
O tipo char ocupa 1 byte, e serve para armazenar caracteres ou inteiros. Isso
significa que o programa reserva um espaço de 8 bits na memória RAM ou em
registradores do processador para armazenar um valor (char de tamanho maior
que 8 bits é permitido pela linguagem, mas os casos são raros). Com vetores do
tipo char é possível armazenar strings, que são cadeias de caracteres.
float
O tipo de dados float serve para armazenar números de ponto flutuante, ou seja,
com casas decimais. O padrão mais utilizado nos últimos 10 anos é o IEEE 754-
1985.
double
O tipo de dados double serve para armazenar números de ponto flutuante de
dupla precisão, normalmente tem o dobro do tamanho do float e portanto o
dobro da capacidade. O padrão mais adotado também é o IEEE 754-1985.
struct
Em C podem ser usadas estruturas (chamados de registos em outras linguagens
de programação). As estruturas são grupos de variáveis organizadas
arbitráriamente pelo programador. Uma estrutura pode criar um novo tipo de
variável caso typedef seja usado em sua declaração.
Exemplo:
#include <stdio.h>

struct pessoa
{
unsigned short int idade;
char nome[51]; /* vetor de 51 chars para o nome */
unsigned long int rg;
}; /* estrutura declarada */

int main(void)
{
struct pessoa exemplo = {16, "Fulano", 123456789}; /* declaração de uma
variável tipo struct pessoa */

printf("Idade: %hu\n", exemplo.idade);


printf("Nome: %s\n", exemplo.nome);
printf("RG: %lu\n", exemplo.rg);

return 0;
}

Esta estrutura é composta por 3 elementos de tipos diferentes. Depois de ser


declarada uma variável do tipo struct x, onde x é o nome da estrutura, para se
acessar os diversos elementos deve-se fazer x.elemento

Relações com C++


A linguagem de programação C++ foi originalmente derivada do C para suportar
programação orientada a objetos. À medida que as linguagens C e C++ foram
evoluindo independentemente, a divisão entre as duas veio a aumentar. O padrão
C99 criou um número de características que entram em conflito. Hoje, as
principais diferenças entre as duas linguagens são:
•inline - em C++, funções em linha encontram-se no espaço global enquanto que
em C encontram-se no espaço local. Por outras palavras, isso significa que, em
C++, qualquer definição de qualquer função em linha (sem ser a respeito da
sobrecarga de funções de C++) tem de estar em conformidade com a "regra de
uma definição" da linguagem C++. Mas em C, a mesma função em linha pode
ser definida de maneira diferente em diferentes arquivos (ou ficheiros).
•A palavra-chave bool, igual à usada em C++, em C99 necessita que se inclua o
ficheiro-cabeçalho <stdbool.h> (_Bool está sempre disponível). Padrões anteriores
de C não definiam um tipo booleano e vários (e incompatíveis) métodos foram
usados para simular um tipo booleano.
Algumas características originalmente desenvolvidas em C++ também
apareceram em C. Entre elas encontram-se:
•protótipos de função (com declaração de tipos de parâmetros) e remoção do
"int" implícito.
•comentários de linha, indicados por //; comentários de linha terminam com um
carácter de nova-linha
•a palavra-chave inline

•tipagem mais forte.

Exemplos

"Olá, Mundo!"
A seguinte aplicação foi publicada na primeira edição de C de K&R, e tornou-se
no programa de introdução padrão da maior parte dos livros sobre C. O
programa envia o texto "Olá Mundo!" para a saída padrão, que é normalmente o
ecrã (ou tela), mas que também pode ser um ficheiro (ou arquivo), um outro
dispositivo qualquer, ou até mesmo um bit bucket, dependendo de como a saída-
padrão é mapeada na altura em que o programa é executado.

int main()
{
printf("Olá, Mundo!\n");
}

Apesar do programa acima correr corretamente, atualmente origina algumas


mensagens de aviso quando compilado com C ANSI. Essas mensagens podem ser
eliminadas efectuando umas pequenas alterações no programa original:

#include <stdio.h> /* Pacotes com funções de entrada e saída */


#include <math.h> /* Este pacote é desnecessário, mas mostra que podem ser
adicionados outros pacotes */

int main(void)
{
printf("Olá, Mundo!\n");
return 0; /* Retorna 0, pois main retorna um int */
} /* Nova linha após fechar a chave principal */

A primeira linha do programa é uma diretiva de pré-processamento #include,


que causa com que o pré-processador substitua aquela linha pela totalidade do
conteúdo do arquivo qual diretiva se refere. Neste caso o arquivo padrão stdio.h
(que contém protótipos de funções para trabalho com entrada e saída) irá
substituir a linha. Os caracteres < e > indicam que o arquivo stdio.h encontra-se
no local em que, quando da configuração do compilador, se definiu como padrão
para localização dos ficheiros de inclusão (header files, geralmente com a
extensão .h).
A linha (não-vazia) seguinte indica que uma função denominada main será
definida. A função main tem um significado especial nos programas de C, pois é
a função que é inicialmente executada ou em inglês entry point. Os caracteres
{ e } delimitam a extensão da função. O termo int define a função main como
sendo uma função que retorna um número inteiro. O termo void indica que a
função não aceita parâmetros. A função main, normalmente aceita parâmetros,
que são passado pela linha de comando. Os compiladores e sistemas
operacionais atuais reconhecem as seguintes declarações de main:

int main (int argc, char ** argv)


int main (int argc, char * argv[])

A linha seguinte "chama", ou executa uma função chamada printf; o arquivo


incluído, stdio.h, contém a informação que descreve a forma como a função
printf deve ser chamada. Nesta chamada, é passado à função printf um único
argumento, a linha de texto constante "Olá Mundo!\n". A função printf retorna
um valor, um int, mas como não é usado ela é descartada pelo compilador. O
comando return retorna o valor 0 para o sistema, que é interpretado pelo mesmo
como que a função main() foi executada e encerrada com sucesso (sem erros).
Por fim, o caracter } indica o fim da função main. Note-se que texto rodeado por
/* e */ (comentários de texto) é ignorado pelo compilador. Os compiladores que
obedecem à norma C99 também aceitam como comentários as linhas de texto
que são precedidos por //.

Soma simples
O seguinte código executa uma soma, de duas variáveis. Primeiro são definidas
as variáveis a e b, do tipo inteiro. Em seguida é mostrado na tela, com o
comando printf, o texto a + b = , e após o símbolo de igual o resultado da conta,
que é 10. Portanto o resultado final seria:
a + b = 10

#include <stdio.h>

int main()
{
int a = 3, b = 7;

printf("a + b = %d\n", a+b);

return 0;
}

Alterando esse código, pode-se interagir com o usuário. Dessa forma, o usuário
digita dois valores e em seguida é mostrada a soma deles.
#include <stdio.h>

int main()
{
int x, y; //define duas variáveis

printf("x = ");
scanf("%d", &x); //scanf atribui o valor digitado a x

printf("y = ");
scanf("%d", &y); //scanf atribui o valor digitado a y

printf("x + y = %d\n", x+y); //printf mostra na tela o resultado.

return 0;
}

A execução desse programa seria a seguinte, se o usuário digitar 5 para x e 6


para y.
x=5
y=6
x + y = 11

Ferramentas de programação
•Bloodshed Dev-C++
•Code::Blocks
•GNU Compiler Collection
•Make

Ver também
•Wikilivros
•Linguagem compilada
•Linguagem de programação
•Linguagem de programação de alto nível
•Lista de linguagens de programação
•Unix
Ligações externas
•C: A Linguagem de Programação (em português)
•Precedência entre operadores em C (em português)
•C Programming (em inglês)
•{{{3}}} (em inglês)
•Curso de Linguagem C (em inglês)
•The Unofficial C for Dummies FAQ Page (em inglês)
•C optimisation tutorial (em inglês)
•Apostila de C (em português) - Professor Adriano Cruz - Departamento de
Ciência da Computação - IM/UFRJ
•Compilador (em inglês) - Compilador de acesso Público Cross-Compiler

Minix
Minix

Desenvolvedor: Andrew Stuart Tanenbaum


Modelo do desenvolvimento: Software livre
Versão estável: 3.1.4a
Família do SO: UNIX
Núcleo: Micronúcleol
Estado do desenvolvimento: Estável
Website Site Oficial www.minix3.org
Portal Tecnologias de informação
O Minix é um sistema operacional Unix-like (semelhante ao UNIX), gratuito e
com o código fonte disponível.
•Multitarefa (múltiplos programas podem correr ao mesmo tempo ).
•Roda em 286, 386, 486, Pentium.
•Suporta memória estendida (16MB no 286 e 4GB no 386, 486 e Pentium ou
superior).
•RS-232 serial line suporte com terminal emulation, kermit, zmodem, etc.
•Máximo de três usuários simultaneamente na mesma máquina.
•Chamadas de sistemas compatíveis com POSIX.
•Inteiramente escrito em C (SO, utilitários, bibliotecas etc.).
•Compilador ANSI C.
•Shell funcionalmente idêntico ao Bourne shell.
•Rede TCP/IP.
•5 editores (emacs subset, vi clone, ex, ed, and simple screen editor).
•Mais de 200 utilitários (cat, cp, ed, grep, kermit, ls, make, sort, etc.).
•Mais de 300 bibliotecas (atoi, fork, malloc, read, stdio, etc.).

Foi organizado em camadas, onde as duas primeiras formam o núcleo:


•Captura interrupções e traps, salvar e restaurar registradores, agendar as
demais funções
•Processos de entrada/saída.
•As tarefas de entrada/saída são chamadas drivers de dispositivos;
•Contém processos que fornecem serviços úteis ao usuário;
•Existem em um nível menos privilegiado que o núcleo;
•Shell, editores, compiladores, etc.
Processos são entidades independentes, cada um com suas permissões de
acesso, e têm atribuídos propriedades como o id do usuário que o criou (UID) e
do grupo (GID). Grande parte de sua execução se processa em user-mode,
quando o processador não admite a execução de instruções privilegiadas, mas
em certos instantes (durante uma chamada de sistema), ele executa em modo
núcleo para conseguir o acesso a partes do hardware que de outra forma seriam
inacessíveis. Cada processo é identificado pelo seu process id (PID), que é
simplesmente um número inteiro.
Mais especificamente, do ponto de vista do sistema operacional, é uma coleção
de instruções (programa) mais os dados necessários à sua execução.
Armazenados juntamente com o processo estão o seu contexto, ou seja, o
contador de instruções, e o conjunto de todos os registradores da CPU. É
responsabilidade do sistema operacional gerenciar os processos do sistema, de
forma que, se um processo tenta ler ou escrever em um disco, por exemplo, este
processo ficará em estado waiting (suspenso) até que a operação seja
completada.
Nesse ínterim, outro processo será habilitado a correr, desperdiçando assim o
mínimo do tempo da CPU, memória e demais periféricos. O Minix suporta
inclusive um procedimento de "escrita retardada", quando escrevemos em algum
arquivo. No momento da escrita, o buffer que contém estes dados é
simplesmente marcado como "sujo" (dirty), e o sistema operacional escolhe o
instante mais apropriado para descarregar esse buffer no disco físico. Isso
explica a necessidade que temos de executar um procedimento de parada
(shutdown ) antes de desligar a máquina, para evitar que fiquem dados a serem
descarregados (escritos) no disco.

Ligações externas
•Site do Minix 3
•Site Minix 3
•Newsgroup de Minix

Micronúcleo
Micronúcleo é o nome que se dá, em biologia celular a dois tipos de formação
intestina da célula:

Estruturas cromossômicas
Micronúcleo pode designar as estruturas celulares que resultam de
cromossomos inteiros ou fragmentos destes, que resultam do processo de divisão
celular e, assim, não são incluídos no núcleo da célula-filha, permanecendo
entretanto no citoplasma das células interfásicas.114
No processo de telófase esses resquícios de cromossomo podem se fundir com o
núcleo principal ou ainda formar núcleos "secundários".115

114Conceito, por: HEDDLE, J.A. A rapid in vitro test for chromosomal damage. Mut. Res.,
Amsterdam, v. 18, n. 2, p. 187-190, 1973 - in: Micronucleos em tetrades de Tradescantia pallida
(Rose) Hunt. cv. purpurea Boom: alteracoes geneticas decorrentes de poluicao aerea urbana, por
Sizenando José de Andrade Júnior, José Cleub Silva Santos Júnior, Jesiane da Luz Oliveira, Eneida
de Moraes Marcílio Cerqueira e José Roberto Cardoso Meireles (página acessasda em 9 de
dezembro de 2009)
115
Organelo
É, ainda, o nome que se dá, nos protozoários ciliados, como o paramécio, aos
pequenos núcleos que, no processo de reprodução se dividem por mitose, e por
conjugação fundem-se reciprocamente formando um núcleo zigoto, dando origem
ao macronúcleo e aos micronúcleos dos indivíduos formados no próximo ciclo de
fissão.

Andrew Stuart Tanenbaum


Andrew S. Tanenbaum
Andrew Stuart "Andy" Tanenbaum (nasceu em
1944) é o chefe do Departamento de
sistemas de computação, na Universidade Vrije,
Amsterdã nos Países Baixos. Ele é o autor do
Minix, um sistema operacional baseado no
Unix com propósito educacional, e bastante
conhecido por seus livros sobre ciência da
computação.
Nasceu na cidade de Nova Iorque e cresceu
em White Plains no estado de Nova Iorque. Recebeu o título de bacharelado pelo
MIT e o doutorado pela UC Berkeley em 1971. Atualmente ministra aulas sobre
Organização de computadores e Sistemas operacionais.
Ficou conhecido internacionalmente pelos seus livros de Ciência da computação,
particularmente:
•Redes de computadores, ISBN 0-13-066102-3
•Sistemas operacionais: Design e implementação, ISBN 0-13-638677-6
•Sistemas operacionais modernos, ISBN 0-13-031358-0

Outras publicações:
•Structured Computer Organization
•Distributed Systems: Principles and Paradigms

O núcleo Linux foi inspirado no Minix. Tanenbaum ficou envolvido com as


discussões do Usenet durante 1992 com Linus Torvalds, criador do Linux, sobre
os méritos básicos de Torvalds usando núcleo monolítico em vez de micronúcleo
que Tanenbaum achou que era o meio do futuro.
Ele também implementou o Sistema operacional distribuído Amoeba.
Na mídia
Andrew Tanenbaum foi apresentador da série de documentários Beyond 2000
(Para além do ano 2000), onde eram apresentadas várias inovações tecnológicas.

Publicações
•Computer Networks, ISBN 0-13-066102-3
•Operating Systems: Design and Implementation, (co-authored with Albert
Woodhull), ISBN 0-13-142938-8
•Modern Operating Systems, ISBN 0-13-031358-0
•Structured Computer Organization, ISBN 0-13-148521-0
•Distributed Systems: Principles and Paradigms, (co-authored with Maarten van
Steen), ISBN 0-13-239227-5

Ligações externas
•Site Pessoal
•Departamento de Sistemas de Computação da VU
•The Usenet discussion with Torvalds at Google Groups
1. 2004 view of the discussion with Torvalds

Projeto GNU
Logotipo GNU
Projeto GNU, em computação, é um
projeto iniciado por Richard Stallman em
1984, com o objetivo de criar um sistema
operacional totalmente livre, que qualquer
pessoa teria direito de usar, modificar e
redistribuir o programa e seu código fonte,
desde que garantindo para todos os mesmos
direitos.
Este sistema operacional GNU deveria ser
compatível com o sistema operacional
UNIX, porém não deveria utilizar-se do
código fonte do UNIX. Stallman escolheu o
nome GNU porque este nome, além do significado original do mamífero Gnu, é
um acrônimo recursivo de: GNU is Not Unix (em português: GNU não é Unix).
A partir de 1984 Stallman e vários programadores, que abraçaram a causa,
vieram desenvolvendo as peças principais de um sistema operacional, como
compilador de linguagem C, editores de texto, etc.
Em 1991 o sistema operacional já estava quase pronto, mas faltava o principal,
que é o núcleo do sistema operacional. O grupo liderado por Stallman estava
desenvolvendo um kernel chamado Hurd. Porém, em 1991, um jovem finlandês
chamado Linus Torvalds havia criado um kernel que poderia usar todas as peças
do sistema operacional GNU. Este kernel ficou conhecido como Linux, contração
de Linus e Unix.
Atualmente, o sistema operacional GNU com o kernel Linux é conhecido como
GNU/Linux, que é como o projeto solicita aos utilizadores que se refiram ao
sistema completo, embora a maioria das pessoas se referem ao sistema apenas
como Linux por uma questão de comodidade.
Mas o próprio Linus Torvalds discorda da nomenclatura GNU/Linux, chamando
seu Sistema Operacional apenas de Linux. A discussão e desentendimento entre
Stallman e Torvalds prosseguem acerca da correta nomenclatura a respeito do
Sistema, arrastando também as opiniões dos inúmeros usuários e
desenvolvedores do Sistema GNU/Linux (ou apenas Linux).

Programas desenvolvidos pelo projeto GNU


O duo dinâmico: O Gnu e o Pinguim voando. (C) 1999, Free
Software Fundation, Inc
Lista de alguns programas desenvolvidos pelo projeto
GNU:
•Bison - gerador de parser desenhado para substituir o
yacc.
•Bash - interpretador de comandos.
•BFD - arquivos de bibliotecas.
•Binutils - montador, linker e ferramentas relacionadas.
•Classpath - bibliotecas para Java.
•DotGNU - substituto livre para o Microsoft .NET.
•Emacs - editor de texto extensível e auto-documentado.
•GCC - compilador otimizado para várias linguagens de programação,
particularmente linguagem C.
•GDB - depurador de aplicações.
•GIMP - programa de edição de imagens.
•glibc - biblioteca para linguagem C.
•GMP - programa para cálculos arbitrários.
•GNOME - ambiente de gráfico para sistemas do tipo Unix.
•Autotools - Autoconf, Automake e Libtool.
•GNUnet - rede descentralizada de comunicações pessoais, desenhada para
resistir à censura.
•GNUstep - implementação de conjunto de bibliotecas OpenStep, assim como
ferramentas para programar aplicações gráficas.
•GSL - biblioteca científica para GNU
•Gzip - aplicações e bibliotecas para compressão de dados.
•GNU Hurd - um micronúcleo e um conjunto de servidores que funcionam do
mesmo modo que o núcleo Unix.
•Maxima - um sistema para cálculos algébricos.
•Octave – um programa para computador numérico similar a MATLAB.
•GNU MDK - um conjunto de ferramentas para a programação em MIX.
•Texinfo - sistema de documentação.
•LilyPond - editor de partituras musicais.
O projecto GNU também ajuda com o desenvolvimento de outros pacotes, como:
•CVS - Sistema de controle de versões para código fonte.
•DDD - Ferramentas gráficas para detecção e depuração de erros.

Ver também
•Free Software Foundation
•Licença Pública GNU (GPL)
•Gnu, o mamífero

Ligações externas
•(em português) O Sistema Operacional GNU
•(em português) Filosofia do Projeto GNU
•(em português) Introdução ao Projeto GNU
•Uma bela charge
GNU Mach
GNU Mach é a implementação GNU do o micronúcleo Mach. Ele é a base de um
servidor multi-funcional do sistema operacional, o Hurd. Atualmente é mantido
pelos desenvolvedores Hurd do projeto GNU, e roda em máquinas IA32.

Vantagens
Como um microkernel, o GNU Mach não implementa uma série de
características geralmente encontradas em um sistema operacional, apenas o
mínimo necessário. Isto significa que uma grande parte do código do sistema
operacional de código é mantido fora do GNU Mach, e, enquanto este código
pode passar por uma completa remodelação, o código do microkernel pode
permanecer relativamente estável.
O GNU Mach é particularmente bem adaptado para o SMP e redes cluster
técnicas. Threads são prestados ao nível do kernel, e o próprio kernel tira
proveito disso. Transparência de rede no nível IPC.

Ligações externas
•GNU Mach (em inglês)

GNU Hurd
GNU Hurd

HURD Live CD

Desenvolvedor Thomas Bushnell


Roland McGrath
Marcus Brinkmann
Neal Walfield
Versão estável K16 / 30 de dezembro de 2007
Sistema Op. GNU
Gênero núcleo
Licença GPL
Website http://www.gnu.org/software/hurd/
Portal das Tecnologias de informação
Logo do GNU Hurd
GNU Hurd é o núcleo oficial do sistema operacional GNU. É
composto de servidores (ou daemons, na terminologia de
Unix) que utilizam o micronúcleo GNU Mach. Está em
desenvolvimento desde 1990 pelo Projeto GNU e é distribuído como
software livre sob a licença GPL. O Hurd almeja superar os núcleos
tipo Unix em termos de funcionalidade, segurança e estabilidade, e ao mesmo
tempo manter uma certa compatibilidade com o Unix.
O nome "Hurd" é um acrônimo indiretamente recursivo: "HIRD of Unix-
Replacing Daemons", onde "HIRD" significa "HURD of Interfaces Representing
Depth".
Ainda em estágio de desenvolvimento, os próprios (e pouquíssimos)
desenvolvedores pedem ajuda à pessoas conhecedoras da Linguagem C (tanto
para o desenvolvimento do núcleo, quanto para o porte de aplicativos), assim
como pessoas que tenham disponibilidade para efetuar testes e reportar bugs.
•Richard Stallman
Richard Stallman, fundador da Free Software Foundation, lançou o projeto
GNU e subsequentemente começaram as pesquisas sobre um núcleo chamado
TRIX, que funcionava com RPC (chamadas de procedimento remoto). Após
estudos, descobriram muitas falhas, e então passaram a pensar no Mach 3.0
(micronúcleo), que foi desenvolvido com código aberto e integrado ao HURD; em
1994 o HURD inicia pela primeira vez, funcionando.
O projeto HURD tem como finalidade, além de liberdade ao usuário, superar
UNIX em termos de funcionalidade, segurança e manter uma certa
compactibilidade com o mesmo.

Ligações externas
•GNU Hurd
•The GNUFans Wiki - não oficial, mas a documentação do curso o Hurd
•Towards a New Strategy of OS Design
•Debian GNU/Hurd instalaçõ por CDs
•Interview com Neal Walfield, Hurd e Hurd/L4 developer. (2001)
•Interview com Marcus Brinkmann, Hurd e Hurd/L4 developer. (2005)
•A GNU/Hurd on Mach Live CD, baseado no Debian GNU/Hurd
•#hurd canal de IRC
Richard Matthew Stallman
Imagem do jovem Stallman, na capa do livro da O'Reilly Free as
in Freedom: Richard Stallman's Crusade for Free Software, por
Sam Williams (2002).
Richard Matthew Stallman, freqüentemente
abreviado para "rms" (Manhattan, 16 de março de
1953) é um famoso hacker, fundador do movimento free
software, do projeto GNU, e da Free Software
Foundation(FSF) ("Fundação para o Software
Livre"). Um aclamado programador, seus maiores
feitos incluem Emacs (e o GNU Emacs, mais tarde), o GNU Compiler Collection e
o GNU Debugger. É também autor da GNU General Public License (GNU GPL ou
GPL), a licença livre mais usada no mundo, que consolidou o conceito de
copyleft.
Desde a metade dos anos 1990, Stallman tem dedicado a maior parte de seu
tempo ao ativismo político, defendendo software livre e lutando contra a patente
de softwares e a expansão da lei de copyright. O tempo que ainda devota à
programação é gasto no GNU Emacs. Ele se sustenta com aproximadamente a
metade do que recebe por suas palestras.
Em 1971, ainda calouro na Universidade Harvard - onde se graduou em Física,
em 1974 - Stallman era programador do laboratório de IA do MIT e tornou-se um
líder na comunidade hacker.

Biografia
Richard Matthew Stallman nasceu em Nova Iorque, filho de Alice Lippman e
Daniel Stallman. Seu primeiro acesso a um computador aconteceu em 1969, no
seu primeiro ano do curso médio.
Empregado pelo Centro Científico da IBM em Nova York, após concluir seu curso
médio (High School) Stallman passou o verão escrevendo seu primeiro programa
- um pré-processador para a linguagem de programação PL/I no IBM 360. "Eu o
escrevi primeiro em PL/I, passando então para a linguagem de montagem
quando o programa de PL/I se tornou grande demais para caber no computador",
contou Stallman, anos depois (Williams 2002, capítulo 3).
Stallman era simultaneamente assistente voluntário do laboratório do
departamento de Biologia na Rockefeller University. Embora já se estivesse
encaminhando para as áreas de Matemática e Física, sua mente analítica
impressionou de tal modo o diretor do laboratório que, alguns anos depois de
Stallman ter ido para a faculdade, sua mãe recebeu uma chamada de telefone:
"Era o professor da Rockefeller", ela recordou, "quis saber o que Richard estava
fazendo". Foi surpreendido ao saber que estava trabalhando em computadores. O
professor imaginava que Richard teria tido um grande futuro como biólogo
(Williams 2002, capítulo 3).
Durante estes anos tornou-se mais conhecido pelas iniciais de seu nome, rms.
Na primeira edição do dicionário do hacker, ele escreveu, "Richard Stallman' é
apenas meu nome mundano; você pode me chamar de 'rms'."

O declínio da cultura hacker


Nos anos 1980, a comunidade hacker, que até então dominara a vida de
Stallman, começou a se dissolver. A emergência do "software portável" (software
que poderia ser feito para funcionar em tipos diferentes de computadores) era
então um problema para o modelo de negócio dos fabricantes de computador.
Para impedir que seu software pudesse ser usado em computadores dos seus
concorrentes, os fabricantes pararam de distribuir o código fonte e começaram a
restringir a cópia e a redistribuição de seu software. O software restrito tinha
existido antes, mas agora não havia nenhuma escapatória dele.
Em 1980 Richard Greenblatt, um companheiro hacker do laboratório, fundou a
Lisp Machines Incorporated para vender Máquinas Lisp, que ele e Tom Knight
criaram no laboratório. Mas Greenblatt rejeitou o investimento exterior,
acreditando que os rendimentos da construção e da venda de algumas máquinas
poderiam ser reinvestidos no crescimento da companhia. No contraste Russ
Noftsker e outros hackers sentiram que o capital providenciado por investidores
externos era melhor. Sem um acordo, a maioria dos hackers restantes do
laboratório fundaram o Symbolics. Symbolics recrutou a maioria dos hackers
restantes e começou a fazer oposição ao laboratório de AI. Symbolics forçou
Greenblatt a renunciar, citando políticas do MIT.
Quando ambas as companhias entregaram o software proprietário, Richard
Stallman sentiu que LMI, ao contrário de Symbolics, tinha tentado evitar de ferir
o laboratório. Por dois anos, de 1982 ao fim de 1983, Stallman duplicou os
esforços dos programadores do Symbolics para impedir que ganhassem um
monopólio nos computadores do laboratório. Por esse tempo, entretanto, era o
último de sua geração dos hackers no laboratório.
Ele rejeitou um futuro onde tivesse que assinar acordos de não-divulgação, onde
ele tivesse de concordar com não compartilhar o código fonte ou informações
técnicas com outros desenvolvedores de software, e executar outras ações que
considerou contrárias de seus princípios. Ele escolheu ao contrário -
compartilhar seu trabalho com os outros, o que considerou como um espírito
clássico da colaboração científica.
Stallman pregava que os usuários do software deveriam ter a liberdade de
"compartilhar com seu vizinho" e poder estudar e fazer mudanças nos softwares
que usam. Disse repetidamente que as tentativas de vendedores de software
proprietário de proibir estes atos são "antissociais" e "antiéticas". A frase
"software deve ser livre" é algumas vezes incorretamente atribuída a ele, mas
Stallman diz que esta frase é a mola mestre da sua filosofia. Para Stallman a
liberdade (de alterar e redistribuir software) é importante por causa dos usuários
e da sociedade, não por quaisquer melhorias que traga ao software.
Conseqüentemente, em janeiro 1984, parou seu trabalho no MIT para trabalhar
em tempo integral no projeto do GNU, anunciado em setembro 1983.
Stallman jamais obteve o grau de Ph.D., embora tenha recebido vários títulos
honoríficos de diferentes universidades do mundo, sendo Doctor honoris causa
por pelo menos seis delas.

Fundação do projeto GNU


Stallman no Marlboro College, em Vermont, 2007.
Em 1985, Stallman publicou o manifesto
GNU, que delineou sua motivação para criar um
sistema livre chamado GNU, que seria
compatível com Unix. Logo após, incorporou a
fundação livre FSF (Fundação do Software
Livre) para empregar programadores livres do
software e para fornecer um infra-estrutura legal
para a comunidade livre.
Em 1985 Stallman popularizou o conceito do copyleft, um mecanismo legal para
proteger a modificação e constituir directivas de redistribuição de software livre.
Foi executado primeiramente na licença do GNU Emacs, e em 1989 a primeira
licença "program-independent" do GPL (Licença pública geral) do GNU foi
liberada.
Neste momento, muito do sistema GNU estava completo com a notável exceção
do núcleo Os membros do projecto de GNU começaram o desenvolvimento de um
núcleo chamado GNU Hurd, em 1990, mas uma decisão arriscada de design foi
escolhida, o que torna o Hurd extremamente complicado.
Produzindo as ferramentas de software necessárias para escrever software, e
publicando uma licença geral que poderia ser aplicada a todo o projeto do
software (GPL), Stallman permitiu que outros escrevessem software livres,
independente do projeto GNU.
Em 1991, um projeto independente iniciado pelo estudante finlandês Linus
Torvalds produziu o Linux. Fortuitamente o projeto podia ser combinado com os
softwares existentes GNU para fazer um sistema operacional completo.

Ver também
•GPL
•Software livre
•Hacker
Ligações externas
•Site pessoal
•Fundação GNU
•Blog oficial
•Textos sobre o Movimento Free Software e a filosofia do projeto GNU

Software livre
Ilustração freqüentemente usada como logo para o Projeto GNU
Software livre, segundo a definição criada pela Free
Software Foundation é qualquer programa de
computador que pode ser usado, copiado, estudado e
redistribuído com algumas restrições. A liberdade de
tais diretrizes é central ao conceito, o qual se opõe ao
conceito de software proprietário, mas não ao
software que é vendido almejando lucro (software
comercial). A maneira usual de distribuição de software
livre é anexar a este uma licença de software livre, e
tornar o código fonte do programa disponível.

Definição
Um software é considerado como livre quando atende aos quatro tipos de
liberdade para os usuários do software definidas pela Free Software Foundation:
•A liberdade para executar o programa, para qualquer propósito (liberdade nº
0);
•A liberdade de estudar como o programa funciona, e adaptá-lo para as suas
necessidades (liberdade nº 1). Acesso ao código-fonte é um pré-requisito para
esta liberdade;
•A liberdade de redistribuir, inclusive vender, cópias de modo que você possa
ajudar ao seu próximo (liberdade nº 2);
•A liberdade de modificar o programa, e liberar estas modificações, de modo que
toda a comunidade se beneficie (liberdade nº 3). Acesso ao código-fonte é um
pré-requisito para esta liberdade;
A liberdade de executar o programa significa a liberdade para qualquer tipo de
pessoa física ou jurídica utilizar o software em quantas máquinas quiser, em
qualquer tipo de sistema computacional, para qualquer tipo de trabalho ou
atividade, sem nenhuma restrição imposta pelo fornecedor.
A liberdade de redistribuir o programa compilado, isto é em formato binário,
necessariamente inclui a obrigatoriedade de disponibilizar seus códigos-fonte.
Caso o software venha a ser modificado e o autor da modificação queira
distribuí-lo, gratuitamente ou não, será também obrigatória a distribuição do
código fonte das modificações, desde que elas venham a integrar o programa.
Não é necessária a autorização do autor ou do distribuidor do software para que
ele possa ser redistribuído, já que as licenças de software livre assim o
permitem.
Para que seja possível estudar ou modificar o software (para uso particular ou
para distribuir) é necessário ter acesso ao código-fonte. Por isso a
disponibilidade desses arquivos é pré-requisito para a liberdade do software.
Cada licença determina como será feito o fornecimento do código fonte para
distribuições típicas, como é o caso de distribuições em mídia portátil somente
com os códigos binários já finalizados (sem o fonte). No caso da licença GPL, a
fonte deve ser disponibilizada em local de onde possa ser acessado, ou deve ser
entregue ao usuário, se solicitado, sem custos adicionais (exceto transporte e
mídia).
Para que essas liberdades sejam reais, elas devem ser irrevogáveis. Caso o
desenvolvedor do software tenha o poder de revogar a licença, o software não é
livre.
A maioria dos softwares livres é licenciada através de uma licença de software
livre, como a GNU GPL, a mais conhecida.

Software Livre e Software em Domínio Público


Software livre é diferente de software em domínio público. O primeiro, quando
utilizado em combinação com licenças típicas (como as licenças GPL e BSD),
garante a autoria do desenvolvedor ou organização. O segundo caso acontece
quando se passam os anos previsto nas leis de cada país de proteção dos direitos
do autor e este se torna bem comum. Ainda assim, um software em domínio
público pode ser considerado como um software livre.

Software Livre e Copyleft


Licenças como a GPL contêm um conceito adicional, conhecido como Copyleft,
que se baseia na propagação dos direitos. Um software livre sem copyleft pode
ser tornado não-livre por um usuário, caso assim o deseje. Já um software livre
protegido por uma licença que ofereça copyleft, se distribuído, deverá ser sob a
mesma licença, ou seja, repassando os direitos.
Associando os conceitos de copyleft e software livre, programas e serviços
derivados de um código livre devem obrigatoriamente permanecer com uma
licença livre (os detalhes de quais programas, quais serviços e quais licenças são
definidos pela licença original do programa). O usuário, porém, permanece com
a possibilidade de não distribuir o programa e manter as modificações ou
serviços utilizados para si próprio.

Venda de Software Livre


As licenças de software livre permitem que eles sejam vendidos, mas estes em
sua grande maioria estão disponíveis gratuitamente.
Uma vez que o comprador do software livre tem direito às quatro liberdades
listadas, ele poderia redistribuir este software gratuitamente ou por um preço
menor do que aquele que foi pago.
Como exemplo poderíamos citar o Red Hat Enterprise Linux que é
comercializado pela Red Hat, a partir dele, foram criados diversos clones como o
CentOS que pode ser baixado gratuitamente.
Muitas empresas optam por distribuir o mesmo produto sobre duas ou mais
licenças, geralmente uma sobre uma licença copyleft e gratuita como a GPL e
outra sobre uma licença proprietária e paga. Outra diferença muito comum é que
as versões pagas geralmente acompanham algum tipo de serviço adicional, como
direito a suporte técnico, por exemplo.

Movimento Software Livre

Motivação
O logotipo da Free Software Foundation.
Os desenvolvedores de software na década de 70
frequentemente compartilhavam seus programas de uma maneira similar aos
princípios do software livre. No final da mesma década, as empresas começaram
a impor restrições aos usuários com o uso de contratos de licença de software.
Em 1983, Richard Stallman iniciou o projeto GNU, e em outubro de 1985 fundou
a Free Software Foundation (FSF). Stallman introduziu os conceitos de software
livre e copyleft, os quais foram especificamente desenvolvidos para garantir que
a liberdade dos usuários fosse preservada.
Ideologia: as diferenças entre Software Livre e
Código Aberto
Muitos defensores do software livre argumentam que a liberdade é valiosa não
só do ponto de vista técnico, mas também sob a ótica da moral e ética. É neste
aspecto que o movimento de software livre (encabeçado pela FSF) se distingue
do movimento de código aberto (encabeçado pela OSI), que enfatiza a
superioridade técnica em relação a software proprietário, ao menos em
potencial.
Os defensores do código aberto (também conhecido como Open source em
inglês) argumentam a respeito das virtudes pragmáticas do software livre ao
invés das questões morais. A discordância básica dos movimentos está no
discurso. Enquanto o foco do movimento encabeçado pela FSF chama a atenção
para valores morais, éticos, direitos e liberdade, o movimento encabeçado pela
OSI defende um discurso mais agradável às empresas. Com isso, o movimento de
software livre condena o uso e desenvolvimento de software proprietário,
enquanto o movimento de código aberto é conivente com o desenvolvimento de
software proprietário.
As definições oficiais de software livre e de código aberto são as mesmas, porém
escritas de formas distintas. A OSI define o código aberto usando a definição
Debian de software livre, que é apenas um detalhamento das 4 liberdades da
FSF. Desta forma todo software de código aberto é também um software livre.
O movimento software livre não costuma tomar uma posição sobre trabalhos que
não sejam softwares e suas respectivas documentações, mas alguns defensores
do software livre acreditam que outros trabalhos que servem a um propósito
prático também devem ser livres (veja Free content).
Para o Movimento do software livre, que é um movimento social, não é ético
aprisionar conhecimento científico, que deve estar sempre disponível, para assim
permitir a evolução da humanidade. Já o movimento pelo Código Aberto, que é
um movimento mais voltado ao mercado, prega que o software desse tipo traz
diversas vantagens técnicas e econômicas. O segundo surgiu para levar as
empresas a adotarem o modelo de desenvolvimento de software livre.
Como a diferença entre os movimentos "Software Livre" e "Código Aberto" está
apenas na argumentação em prol dos mesmos softwares, é comum que esses
grupos se unam em diversas situações ou que sejam citados de uma forma
agregadora através da sigla "FLOSS" (Free/Libre and Open Source Software).
Movimentos Relacionados
Inspirados na GPL e nas propostas do movimento do software livre, foi criado um
repositório de licenças públicas, chamado Creative Commons, cujos termos se
aplicam a variados trabalhos criativos, como criações artísticas colaborativas,
textos e software. Entretanto a maioria destas licenças não são reconhecidas
como realmente livres pela FSF e pelo movimento de software livre.
O software livre está inserido num contexto mais amplo onde a informação (de
todos os tipos, não apenas software) é considerada um legado da humanidade e
deve ser livre (visão esta que se choca diretamente ao conceito tradicional de
propriedade intelectual). Coerentemente, muitas das pessoas que contribuem
para os movimentos de Conhecimento Aberto — movimento do software livre,
sites Wiki, Creative Commons, etc. — fazem parte da comunidade científica.
Cientistas estão acostumados a trabalhar com processos de revisão mútua (ou
por pares) e o conteúdo desenvolvido é agregado ao conhecimento científico
global. Embora existam casos onde se aplicam as patentes de produtos
relacionados ao trabalho científico, a ciência pura, em geral, é livre.

Software Freedom Day


No dia 20 de setembro comemora-se o Dia da Liberdade do Software (Software
Freedom Day) com eventos envolvendo as comunidades de usuários e
desenvolvedores de software livre em todo o mundo.116

Softwares Livres notáveis


Abaixo está uma lista com os softwares livres mais conhecidos e usados:
•Sistemas operacionais: GNU/Hurd, GNU/Linux, BSDs.
•Ferramentas de desenvolvimento:
1. Compilador C: GCC.
2. Compilador Pascal: Free Pascal.
3. Debugger GDB.
4. Biblioteca padrão da linguagem: C.
5. Editor de texto avançado: Emacs.
6. Ferramentas para desenvolvimento em Flash e ActionScript: SWFTools
7. Plataforma de desenvolvimento: Eclipse (programação em Java e PHP) e
NetBeans (Programação em C, C++, Java, Python, UML e outras).

116http://softwarefreedomday.org/
•Linguagens de programação: Python,Java, Perl, PHP, Lua, Ruby, Gambas e Tcl.
•Servidores:
1. Servidor de nomes: BIND.
2. Agente de transporte de mensagens (e-mail):Postfix sendmail.
3. Servidor web: Apache.
4. Servidor de arquivos: Samba.
5. Servidor e cliente de email: Evolution.
6. Servidor de aplicações: Zope e Apache Tomcat.

•Bancos de dados relacionais: MySQL, Postgres.


•Programas de interação gráfica: GNOME, KDE e Xorg.
•Aplicativos:
1. Navegadores Web: Firefox,Konqueror e Google Chrome.
2. Pacote de escritório: OpenOffice.org.
3. Processadores de texto: OpenOffice.org Writer e AbiWord.
4. Editor de apresentação multimédia: OpenOffice.org Impress
5. Planilha eletrônica: OpenOffice.org Calc e GNumeric
6. Sistema de gerenciamento de banco de dados: OpenOffice.org Base
7. CAD, (computer aided design) QCad.
8. Desenho vetorial: Inkscape, Sodipodi e OpenOffice.org Draw.
9. Editoração eletrônica: Scribus e OpenOffice.org Draw.
10. Editor de imagens: Gimp.
11. Editor web: Aptana.
12. EaD, Educação a distância: Moodle
13. Gerenciador de Conteúdo (CMS): Opencms, Drupal, Plone,
WordPress (CMS muito usado em blogs)e Joomla.
14. Modelagem Tridimensional Blender3d, Wings3d
15. Renderização (imagem estática): Yafray, POV-Ray
16. Acessibilidade: Virtual Magnifying Glass.
17. Edição de áudio: Audacity, Ardour
18. Edição de partituras musicais: Rosegarden
19. Publicação na Internet: SPIP
20. Players multimédia: VLC e Mplayer.
•Sistema matemático : Scilabe Maxima.
•Sistemas de editoração: TeX, LaTeX e MiKTeX
•Sistema wiki: MediaWiki (sistema de wiki da Wikipedia).
•Telefonia: Asterisk.
•Composição de video : Cinelerra, Kdenlive
•Educacional: Gcompris [multidisciplinar], Tuxpaint, Tuxmath, etc.
Veja listas maiores no diretório da Fundação do Software Livre e em diversos
outros sites de projetos na Internet.

Ver também
•Wikilivros
•GPL
•Software Livre nos governos
•GNU
•Richard M. Stallman
•Free Software Foundation
•Free Software Foundation Europe
•Free Software Foundation India
•Free Software Foundation Latin America
•Licença livre
•Publicação Aberta
•Fórum Internacional de Software Livre
•Sérgio Amadeu
•Lei de Linus
•Livre associação

Ligações externas
•A identificação da ideologia através da análise do discurso (sobre Software
Livre x Código Aberto)
•Página oficial da Free Software Foundation (em inglês)
•Free Software Foundation Latin America
•Associação Nacional para o Software Livre (Portugal)
•LISA - Laboratório para a Iniciativa de Software Aberto (Organização
Governamental de Portugal)
•O que é o Software Livre?
•Explicação sobre Tipos de Software

GNU General Public License


Logotipo GNU
GNU General Public License (Licença
Pública Geral), GNU GPL ou simplesmente
GPL, é a designação da licença para software
livre idealizada por Richard Stallman no
final da década de 1980, no âmbito do projecto
GNU da Free Software Foundation (FSF).
A GPL é a licença com maior utilização por
parte de projectos de software livre, em
grande parte devido à sua adoção para o
projeto GNU e o sistema operacional GNU/Linux.
O software utilizado para administrar o
conteúdo da Wikipédia é coberto por esta licença,
na sua versão 2.0 ou superiores.

Conteúdo
Em termos gerais, a GPL baseia-se em 4 liberdades:
1. A liberdade de executar o programa, para qualquer propósito (liberdade nº
0)
2. A liberdade de estudar como o programa funciona e adaptá-lo para as suas
necessidades (liberdade nº 1). O acesso ao código-fonte é um pré-requisito para
esta liberdade.
3. A liberdade de redistribuir cópias de modo que você possa ajudar ao seu
próximo (liberdade nº 2).
4. A liberdade de aperfeiçoar o programa, e liberar os seus aperfeiçoamentos,
de modo que toda a comunidade se beneficie deles (liberdade nº 3). O acesso ao
código-fonte é um pré-requisito para esta liberdade.
Com a garantia destas liberdades, a GPL permite que os programas sejam
distribuídos e reaproveitados, mantendo, porém, os direitos do autor por forma a
não permitir que essa informação seja usada de uma maneira que limite as
liberdades originais. A licença não permite, por exemplo, que o código seja
apoderado por outra pessoa, ou que sejam impostos sobre ele restrições que
impeçam que seja distribuído da mesma maneira que foi adquirido.
A GPL está redigida em inglês e actualmente nenhuma tradução é aceita como
válida pela Free Software Foundation, com o argumento[12] de que há o risco de
introdução de erros de tradução que poderiam deturpar o sentido da licença.
Deste modo, qualquer tradução da GPL é não-oficial e meramente informativa,
mantendo-se a obrigatoriedade de distribuir o texto oficial em inglês com os
programas.

História
A licença GPL foi originalmente publicada em Janeiro de 1989. No entanto,
passado pouco tempo, ficou claro que o texto da licença comportava vários
problemas, pelo que em Junho de 1991 foi publicada a GPL versão 2, sendo ao
mesmo tempo introduzida uma nova licença LGPL. Em 2005, Stallman anunciou
que estava a preparar uma nova versão da licença em conjunto com Eben
Moglen. Essa nova versão, foi chamada de GPLv3 e o primeiro esboço foi
publicado em 16 de Janeiro de 2006, sendo a versão final lançada em 29 de
Junho de 2007.
Crítica
Em 2001, Steve Ballmer, da Microsoft, se referiu ao Linux como "um câncer que
se junta à propriedade intelectual e contamina tudo que toca".117 Porém, críticos
alegam contra Microsoft que o verdadeiro motivo para a empresa atacar a GPL é
o fato desta licença "resistir às tentativas dos direitos de propriedade intelectual
convencionais se estenderem sobre todas as criações e inovações da área".118 Em
resposta aos ataques da Microsoft à GPL, muitos desenvolvedores e defensores
de Softwares Livres fizeram uma proclamação conjunta a favor da licença.119
Contudo, em julho de 2009, a própria Microsoft incluiu um bloco de
aproximadamente 20.000 linhas, sob licensa GPL, ao conjunto de drivers do
Linux.120 O código do Hyper-V que era parte do código submetido usou
componentes open-source licenciados sob a GPL. Era originalmente linkado
estaticamente a partes de binários pertencentes à propritários de direitos
autorais, que são inadmissíveis em um software licenciado através da GPL.121
A GPL tem sido descrita como “viral” por muitos críticos122 porque ela apenas
permite programas inteiros, o que significa que não é permitido aos
programadores linkar seu projeto a bibliotecas sob licenças incompatíveis à GPL.
O efeito “viral” ocorre nos casos em que os códigos não podem ser combinados a
menos que a licença de um deles sofra alguma alteração. Embora teoricamente
qualquer uma das licenças possa ser mudada, no contexto “viral” isso é mais
difícil de ocorrer com a GPL (porque o software pode ter muitos contribuintes,
dos quais alguns geralmente se recusam permitir mudanças nos termos de
licença), ao passo que a licença dos outros softwares pode ser mudada. De
acordo com Richard Stallman, a imagem de um “vírus” não é apenas ofensiva,
como também errônea: Software sob licença GPL nunca ataca ou infecta outro
software. Ela se comporta mais como uma planta. Se um pedaço é aproveitado
como enxerto em outro lugar, ela cresce lá também.
Há uma espécie de diferença filosófica entre GPL e licenças permissivas de
software livre como as do estilo BSD, que não impõem restrições nas versões
modificadas. Enquanto a GPL propõe que a liberdade dos softwares se preserve
desde os desenvolvedores até o usuário final, outros acreditam que
intermediários devam ter a liberdade de modificar e redistribuí-los
comercialmente. Mais especificamente, a GPL exige redistribuição sujeita à GPL,
embora outras mais “permissivas” permitam redistribuição sob forma mais
restritiva que a original.

117Newbart, Dave. " Microsoft CEO takes launch break with the Sun-Times", Chicago Sun-Times,
2001-06-01.(Internet archive link)
118" Deadly embrace", The Economist, 2000-03-30. Página visitada em 2006-03-31.
119Free Software Leaders Stand Together
120Clarke, Gavin. " Microsoft embraces Linux cancer to sell Windows servers", The Register,
2009-07-20.
121Clarke, Gavin. " Microsoft opened Linux-driver code after 'violating' GPL", The Register,
2009-07-23.
122" Speech Transcript - Craig Mundie, The New York University Stern School of Business",
Prepared Text of Remarks by Craig Mundie, Microsoft Senior Vice President, The Commercial
Software Model The New York University Stern School of Business May 3, 2001
Em um mercado grande, códigos sob licença GPL tem preço praticamente nulo,
pois cada usuário tem igual direito de revendê-lo. Isso pode inibir o interesse no
seu uso ao comprometer os interesses econômicos do desenvolvedor. A
Microsoft, por exemplo, inclui termos anti-GPL ao disponibilizar seus códigos.123
Porém essa crítica é rebatida na observação de que empresas que focam seus
negócios em software livre, como a Red Hat e a IBM, trabalham na venda de
serviços agregados como suporte e desenvolvimento de novas funcionalidades,
ao invés da venda do software.124125
A GPL não tem cláusula de indenização explícita protegendo os desenvolvedores
de contribuição inescrupulosa. Por exemplo, se um projeto GPL é acrescido de
um trabalho patenteado ou sob copyright, violando os termos destes, todos os
envolvidos neste projeto, não só a pessoa que se apossou indevidamente dos
trabalhos alheios, serão processados por danos ao detentor da patente ou do
direito de cópia. Este foi um problema que levou Mozilla a criar e usar a Mozilla
Public License em vez da GPL ou LGPL.[carece de fontes?]
Alguns desenvolvedores de software acabaram concluindo que o escopo
extensivo da GPL é muito restritivo. Por exemplo, Bjorn Reese e Daniel Stenberg
sentiram que sua escolha pela GPL criou um “quodque pro quo” (do latim, tudo
em retorno de algo) aos outros desenvolvedores de softwares, quando estes
tentavam linkar os projetos. Por essa razão, em 2001, eles abandonaram a
GPLLv2 em favor de uma copyright menos restritiva.126

Ver também
•GNU FDL, a Licença de Documentação Livre GNU.
•GNU LGPL, a Licença Pública Geral Menor GNU.
•GNU AGPL, a Licença Pública Geral Affero GNU.
•Licença livre
•Copyleft

Ligações externas
•(em inglês) Texto oficial da GPL
•(em português) Tradução da GPL para Português (não oficial)
•(em português) Tradução da GPL para Português do Brasil (não oficial)
•(em português) Licença Pública Geral do GNU (GPL) do Creative Commons (não
oficial)

123Microsoft anti-GPL fine print threatens competition | The Register


124IBM's Linux revenue: Services to overtake servers
125Red Hat revenue surges 46 percent
126Bjørn Reese and Daniel Stenberg, Working Without Copyleft (December 19, 2001)
•(em português) Como usar a GPL em seus próprios programas
•(em inglês) Como denunciar uma violação da GPL
•(em inglês) Veja e participe na discussão da GPL v3

Free Software Foundation


logotipo da Free Software Foundation
A Free Software Foundation (FSF,
Fundação para o Software Livre) é uma organização sem fins lucrativos, fundada
em 1985 por Richard Stallman e que se dedica à eliminação de restrições sobre a
cópia, redistribuição, entendimento e modificação de programas de
computadores – bandeiras do movimento do software livre, em essência. Faz isso
promovendo o desenvolvimento e o uso de software livre em todas as áreas da
computação mas, particularmente, ajudando a desenvolver o sistema operacional
GNU e suas ferramentas.
Até meados da década de 1990 a fundação dedicava-se mais à escrita do
software. Como hoje existem muitos projetos independentes de software livre, a
FSF dedica-se mais aos aspectos legais e estruturais da comunidade do software
livre. Entre suas atribuições atuais, encarrega-se de aperfeiçoar licenças de
software e de documentação (como a GNU General Public License, GPL ou a
GNU Free Documentation License, GFDL), de desenvolver um aparato legal
acerca dos direitos autorais dos programas criados sob essas licenças, de
catalogar e disponibilizar um serviço com os softwares livres desenvolvidos (o
Free Software Directory), e de discutir e aperfeiçoar a própria definição de
software livre..

Ver também
•GNU
•GNU/Linux
•Free Software Foundation Latin America
•Free Software Foundation Europe
•Free Software Foundation India
•Richard M. Stallman
•GNU General Public License
•GNU Free Documentation License

Ligações externas
•FSF Página Principal
Linux
Linux

Modelo do desenvolvimento: Open source


Núcleo: Monolítico/Modular
Licença: Várias
Estado do desenvolvimento: Ativo
Portal Tecnologias de informação
Linux é o termo geralmente usado para designar qualquer sistema operativo
(português europeu)
ou sistema operacional (português brasileiro) que utilize o núcleo Linux. Foi
desenvolvido pelo finlandês Linus Torvalds, inspirado no sistema Minix. O seu
código fonte está disponível sob licença GPL para qualquer pessoa que utilizar,
estudar, modificar e distribuir de acordo com os termos da licença.
Inicialmente desenvolvido e utilizado por grupos de entusiastas em
computadores pessoais, o sistema Linux passou a ter a colaboração de grandes
empresas, como a IBM, a Sun Microsystems, a Hewlett-Packard (HP), Red Hat,
Novell, Google e a Canonical.127

História
Linus Torvalds, criador e principal mantenedor do núcleo Linux.

127http://www.linuxfoundation.org/about/members
O núcleo Linux foi, originalmente, escrito por
Linus Torvalds do Departamento de Ciência da
Computação da Universidade de Helsinki, Finlândia, com a
ajuda de vários programadores voluntários
através da Usenet (uma espécie de sistema de listas
de discussão existente desde os primórdios da Internet).
Linus Torvalds começou o desenvolvimento do núcleo
como um projeto particular, inspirado pelo seu interesse
no Minix, um pequeno sistema UNIX desenvolvido
por Andrew S. Tanenbaum. Ele limitou-se a criar, nas
suas próprias palavras, "um Minix melhor que o Minix"
("a better Minix than Minix"). E depois de algum tempo de
trabalho no projecto, sozinho, enviou a seguinte
mensagem para comp.os.minix:
Você suspira pelos bons
tempos do Minix-1.1,
quando os homens eram
homens e escreviam seus
próprios "device
drivers"?128 Você está sem
um bom projecto em mãos
e deseja trabalhar num
S.O. que possa modificar
de acordo com as suas
necessidades? Acha
frustrante quando tudo
funciona no Minix? Chega
de noite ao computador
para conseguir que os
programas funcionem?
Então esta mensagem
pode ser exactamente
para você. Como eu
mencionei há um mês
atrás, estou trabalhando
numa versão
independente de um S.O.
similar ao Minix para
computadores AT-386. Ele
está, finalmente, próximo
do estado em que poderá
ser utilizado (embora
possa não ser o que você
espera), e eu estou
disposto a disponibilizar o

128Primeiro período do original, em inglês: Do you pine for the nice days of minix-1.1, when men
were men and wrote their own device drivers?
código-fonte para ampla
distribuição. Ele está na
versão 0.02... contudo eu
tive sucesso ao executar
bash, gcc, gnu-make, gnu-
sed, compressão etc. nele.
Curiosamente, o nome Linux foi criado por Ari Lemmke, administrador do site
ftp.funet.fi que deu esse nome ao diretório FTP onde o núcleo Linux estava
inicialmente disponível.129 (Linus tinha-o baptizado como "Freax", inicialmente)130
No dia 5 de outubro de 1991 Linus Torvalds anunciou a primeira versão "oficial"
do núcleo Linux, versão 0.02. Desde então muitos programadores têm
respondido ao seu chamado, e têm ajudado a fazer do Linux o sistema
operacional que é hoje. No início era utilizado por programadores ou só por
quem tinha conhecimentos, usavam linhas de comando. Hoje isso mudou,
existem diversas empresas que criam os ambientes gráficos, as distribuições
cada vez mais amigáveis de forma que uma pessoa com poucos conhecimentos
consegue usar o Linux. Hoje o Linux é um sistema estável e consegue reconhecer
todos os periféricos sem a necessidade de se instalar os drivers de som, vídeo,
modem, rede, entre outros.

Núcleo
Interface padrão do gNewSense, uma das distribuições do Linux
O termo Linux refere-se ao núcleo (em inglês:
"kernel") do sistema operativo. O termo
também é usado pelos meios de comunicação e
usuários para referir-se aos sistemas operacionais
baseados no núcleo Linux agregado a outros
programas. Segundo Tanenbaum e Silberschatz,
um núcleo pode ser considerado o próprio
sistema operativo, quando este é definido como um
gerenciador de recursos de hardware.

129Lars Wirzenius (27 de abril de 1998). Linux Anecdotes. Página visitada em 15 de junho de
2007.
130Carlos E. Morimoto. Linux, Ferramentas Técnicas 2ed (em Português). 2.ed. GDH Press e Sul
Editores, 2006. pp. 312. ISBN 85-205-0401-9
Arquitetura
O Linux é um núcleo monolítico: as funções do núcleo (escalonamento de
processos, gerenciamento de memória, operações de entrada/saída, acesso ao
sistema de arquivos) são executadas no espaço de núcleo. Uma característica do
núcleo Linux é que algumas das funções (drivers de dispositivos, suporte à rede,
sistema de arquivos, por exemplo) podem ser compiladas e executadas como
módulos (em inglês: LKM - loadable kernel modules), que são bibliotecas
compiladas separadamente da parte principal do núcleo e podem ser carregadas
e descarregadas após o núcleo estar em execução.

Portabilidade
Embora Linus Torvalds não tenha tido como objetivo inicial tornar o Linux um
sistema portável, ele evoluiu nessa direção. Linux é hoje um dos núcleos de
sistemas operativos mais portáveis, correndo em sistemas desde o iPaq (um
computador portátil) até o IBM S/390 (um denso e altamente custoso
mainframe).
Os esforços de Linus foram também dirigidos a um diferente tipo de
portabilidade. Portabilidade, de acordo com Linus, era a habilidade de facilmente
compilar aplicações de uma variedade de código fonte no seu sistema;
consequentemente, o Linux originalmente tornou-se popular em parte devido ao
esforço para que os códigos-fonte GPL ou outros favoritos de todos corressem em
Linux.
O Linux hoje funciona em dezenas de plataformas, desde mainframes até um
relógio de pulso, passando por várias arquitecturas: x86 (Intel, AMD), x86-64
(Intel EM64T, AMD64), ARM, PowerPC, Alpha, SPARC etc., com grande
penetração também em sistemas embarcados, como handhelds, PVR, consola de
videojogos e centros multimídia, entre outros.

Termos de Licenciamento
Inicialmente, Torvalds lançou o Linux sob uma licença de software que proibia
qualquer uso comercial. Isso foi mudado de imediato para a GNU General Public
License. Essa licença permite a distribuição e mesmo a venda de versões
possivelmente modificadas do Linux mas requer que todas as cópias sejam
lançadas dentro da mesma licença e acompanhadas do código fonte.
Apesar de alguns dos programadores que contribuem para o núcleo permitirem
que o seu código seja licenciado com GPL versão 2 ou posterior, grande parte do
código (incluído as contribuições de Torvalds) menciona apenas a GPL versão 2.
Isto faz com que o núcleo como um todo esteja sob a versão 2 exclusivamente,
não sendo de prever a adopção da nova GPLv3.
Sistemas de arquivos suportados
O Linux possui suporte de leitura e escrita a vários sistema de arquivos, de
diversos sistemas operacionais, além de alguns sistemas nativos. Por isso,
quando o Linux é instalado em dual boot com outros sistemas (Windows, por
exemplo) ou mesmo funcionando como Live CD, ele poderá ler e escrever nas
partições formatadas em FAT e NTFS. Por isto, Live CDs Linux são muito
utilizados na manutenção e recuperação de outros sistemas operacionais.
Entre os sistemas de ficheiros suportados pelo Linux, podemos citar FAT, NTFS,
JFS, XFS, HPFS, Minix e ISO 9660 (sistema de ficheiros usado em CD-ROMs).
Alguns sistemas de ficheiros nativos são, dentre outros, Ext2, Ext3, Ext4,
ReiserFS e Reiser4.131 Alguns sistemas de ficheiros com características especiais
são SWAP, UnionFS, SquashFS, Tmpfs, Aufs e NFS, dentre outros.

Sistema Operacional
Richard Stallman, fundador do projeto GNU para um sistema
operacional livre.
Logo que Linus Torvalds passou a disponibilizar o
Linux, ou seja na sua versão 0.01, já havia suporte ao disco
rígido, tela, teclado e portas seriais, o sistema de arquivos
adotava o mesmo layout do Minix (embora não houvesse
código do Minix no Linux), havia extensos trechos em
assembly, e ela já era capaz de rodar o bash e o gcc.
A linha guia quando
implementei o Linux foi:
fazê-lo funcionar rápido.
Eu queria o núcleo
simples, mas poderoso o
suficiente para rodar a
maioria dos aplicativos
Unix.132
O próprio usuário deveria procurar os programas que dessem funcionalidade ao
seu sistema, compilá-los e configurá-los. Talvez por isso, o Linux tenha carregado
consigo a etiqueta de sistema operativo apenas para técnicos. Foi neste
ambiente que surgiu a MCC Interim Linux, do Manchester Computer Centre, a
primeira distribuição Linux, desenvolvida por Owen Le Blanc da Universidade de
Manchester, capaz de ser instalada independentemente em um computador. Foi
uma primeira tentativa de facilitar a instalação do Linux.

131Reiser4 ainda está em desenvolvimento.


132No original, em inglês: the guiding line when implementing linux was: get it working fast. I
wanted the kernel simple, yet powerful enough to run most unix software.
Desde o começo, o núcleo Linux incluía um sistema básico para chamadas do
sistema e acesso aos dispositivos do computador. O núcleo de um sistema
operativo define entre várias operações, o gerenciamento da memória, de
processos, dos dispositivos físicos no computador e é uma parte essencial de
qualquer sistema operacional utilizável, contudo para um sistema operacional
adquirir funcionalidade são necessários também vários outros aplicativos que
determinam funções específicas que aquele sistema será capaz de desenvolver,
os aplicativos existentes em um sistema operacional com a única exceção
do núcleo são determinados pelo usuário do computador, como por
exemplo: interpretadores de comandos, gerenciadores de janelas, que oferecem
respectivamente uma interface para o usuário do computador, CLI ou GUI, e
outros aplicativos como editores de texto, editores de imagem, tocadores de som,
e, mas não necessariamente, compiladores.
A maioria dos sistemas inclui ferramentas e utilitários baseados no BSD e
tipicamente usam XFree86 ou X.Org para oferecer a funcionalidade do sistemas
de janelas X — interface gráfica. Assim como também oferecem ferramentas
desenvolvidas pelo projeto GNU.
No momento do desenvolvimento do Linux, vários aplicativos já vinham sendo
reunidos pelo Projeto GNU da Free Software Foundation (‘Fundação Software
Livre’), que embarcara em um subprojeto que ainda continua para obter um
núcleo, o GNU Hurd. Porém devido a várias complicações o projeto GNU e
demora em desenvolver o Hurd, Stallman acabou adotando o núcleo Linux como
base para distribuir os programas do projeto GNU , não obstante diversas
pessoas e instituições tiveram a mesma idéia e assim várias distribuições
começaram a surgir baseadas no núcleo desenvolvido inicialmente por Linus.

Distribuições
Atualmente, um Sistema Operacional (em Portugal Sistema Operativo) Linux ou
GNU/Linux completo (uma "Lista de distribuições de Linux ou GNU/Linux") é
uma coleção de software livre (e por vezes não-livres) criados por indivíduos,
grupos e organizações de todo o mundo, incluindo o núcleo Linux. Companhias
como a Red Hat, a SuSE, a Mandriva (união da Mandrake com a Conectiva) e a
Canonical (desenvolvedora do Ubuntu Linux), bem como projetos de
comunidades como o Debian ou o Gentoo, compilam o software e fornecem um
sistema completo, pronto para instalação e uso. Patrick Volkerding também
fornece uma distribuição Linux, o Slackware.
As distribuições do Linux ou GNU/Linux começaram a receber uma popularidade
limitada desde a segunda metade dos anos 90, como uma alternativa livre para
os sistemas operacionais Microsoft Windows e Mac OS, principalmente por parte
de pessoas acostumadas com o Unix na escola e no trabalho. O sistema tornou-se
popular no mercado de Desktops e servidores, principalmente para a Web e
servidores de bancos de dados.
No decorrer do tempo, várias distribuições surgiram e desapareceram, cada qual
com sua característica. Algumas distribuições são maiores outras menores,
dependendo do número de aplicações e sua finalidade. Algumas distribuições de
tamanhos menores cabem num disquete com 1,44 MB, outras precisam de vários
CDs, existindo até algumas versões em DVD. Todas elas tem o seu público e sua
finalidade, as pequenas (que ocupam poucos disquetes) são usadas para
recuperação de sistemas danificados ou em monitoramento de redes de
computadores.
De entre as maiores, distribuídas em CDs, podem-se citar: Slackware, Debian,
Suse, e Conectiva. O que faz a diferença é como estão organizadas e pré-
configuradas as aplicações. A distribuição Conectiva Linux, por exemplo, tinha as
suas aplicações traduzidas em português, o que facilitou que usuários que falam
a Língua Portuguesa tenham aderido melhor a esta distribuição. Hoje esta
distribuição foi incorporada à Mandrake, o que resultou na Mandriva. Para o
português, existe também a distribuição brasileira Kurumin, construída sobre
Knoppix e Debian, e a Caixa Mágica, existente nas versões 32 bits, 64 bits, Live
CD 32 bits e Live CD 64 bits, e com vários programas open source:
OpenOffice.org, Mozilla Firefox, entre outros.
Existem distribuições com ferramentas para configuração que facilitam a
administração do sistema. As principais diferenças entre as distribuições estão
nos seus sistemas de pacotes, nas estruturas dos diretórios e na sua biblioteca
básica. Por mais que a estrutura dos diretórios siga o mesmo padrão, o FSSTND
é um padrão muito relaxado, principalmente em arquivos onde as configurações
são diferentes entre as distribuições. Então normalmente todos seguem o padrão
FHS (File Hierarchy System), que é o padrão mais novo. Vale lembrar,
entretanto, que qualquer aplicativo ou driver desenvolvido para Linux pode ser
compilado em qualquer distribuição que vai funcionar da mesma maneira.
Quanto à biblioteca, é usada a Biblioteca libc, contendo funções básicas para o
sistema Operacional Linux. O problema está quando do lançamento de uma nova
versão da Biblioteca libc, algumas das distribuições colocam logo a nova versão,
enquanto outras aguardam um pouco. Por isso, alguns programas funcionam
numa distribuição e noutras não. Existe um movimento LSB (Linux Standard
Base) que proporciona uma maior padronização. Auxilia principalmente
vendedores de software que não liberam para distribuição do código fonte, sem
tirar características das distribuições. O sistemas de pacotes não é padronizado.
ArchLinux, Debian, Fedora, Mandriva, Mint, Opensuse, PCLinuxOS, Puppy,
Sabayon, Slackware e Ubuntu são algumas das distribuições mais utilizadas
actualmente, listadas aqui por ordem alfabética.
Um exemplo de distribuição que corre num CD é o Kurumin Linux, criado por
Carlos E. Morimoto, baseada no Knoppix.
De entre as distribuições consideradas mais difíceis de gerir (por preferirem
assegurar a estabilidade tecnológica em detrimento da interface de utilizador),
destacam-se a Debian, Gentoo e Slackware.
Código Aberto e Programas Livres
Um programa, assim como toda obra produzida atualmente, seja ela literária,
artística ou tecnológica, possui um autor. Os Direitos sobre a idéia ou
originalidade da obra do autor, que incluem essencialmente distribuição,
reprodução e uso é feito no caso de um programa através de sua licença.
Existem dois movimentos que regem o licenciamento de programas no mundo
livre, os programas de código aberto e os programas livres. Os dois
representados respectivamente pela OSI e pela FSF oferecem licenças para
produção de software, sendo seus maiores representantes a licença BSD e a
GPL.
O Linux oferece muitos aplicativos de open source, contudo nem todos podem
ser considerados programas livres, dependendo exclusivamente sob qual licença
estes programas são distribuídos. Os programas distribuídos sob tais licenças
possuem as mais diversas funcionalidades, como desktops, escritório, edição de
imagem e inclusive de outros sistemas operacionais.
Também existem organizações inclusive no mundo livre como a organização
Linux Simples para o Usuário Final (SEUL) que tem como objetivo adotar a
maior gama possível de aplicativos de alta qualidade produzidos sobre a GPL. É
um projeto voluntário que atualmente se foca no aprendizado de Linux, seu uso
na ciência e em documentos de advocacia, bem como gerenciar e coordenar
projetos de desenvolvimento de aplicativos.

Controvérsias quanto ao nome


Linux foi o nome dado ao núcleo de sistema operacional criado por Linus
Torvalds. Por extensão, sistemas operacionais que usam o núcleo Linux são
chamados genericamente de Linux. Entretanto, a Free Software Foundation
afirma tais sistemas operacionais são, na verdade, sistemas GNU, e o nome mais
adequado para tais sistemas é GNU/Linux, uma vez que grande parte do código-
fonte dos sistemas operacionais baseados em Linux são ferramentas do projeto
GNU.133
Há muita controvérsia quanto ao nome. Eric Raymond afirma, no Jargon File,
que a proposta da FSF só conseguiu a "aceitação de uma minoria" e é resultado
de uma "disputa territorial".134 Linus Torvalds afirma que consideraria "justo"
que tal nome fosse atribuído a uma distribuição do projeto GNU, mas que
chamar os sistemas operacionais Linux como um todo de GNU/Linux seria
"ridículo".135 Linus disse não se importar sobre qual o nome usado, considera a
proposta da GNU como "válida" ("ok") mas prefere usar o termo "Linux".136
133Richard Stallman. Linux and the GNU Project (HTML) (em inglês). Página visitada em 7 de
março de 2008.
134Eric Raymond. Linux (HTML) (em inglês). Página visitada em 7 de março de 2008.
135Revolution OS, documentário de 2001 sobre o Linux. Produzido, dirigido e escrito por J.T.S.
Moore
136Linus Torvalds (3 de junho de 1996). Lignux, what's the matter with you people? (HTML) (em
Sobre o símbolo
O símbolo do software foi escolhido pelo seu criador, que achou a foto de um
pinguim na internet. 137
Em 1996, muitos integrantes da lista de discussão "Linux-Kernel" estavam
discutindo sobre a criação de um logotipo ou de um mascote que representasse o
Linux. Muitas das sugestões eram paródias ao logotipo de um sistema
operacional concorrente e muito conhecido. Outros eram monstros ou animais
agressivos. Linus Torvalds acabou entrando nesse debate ao afirmar em uma
mensagem que gostava muito de pingüins. Isso foi o suficiente para dar fim à
discussão.
Tux.
Depois disso, várias tentativas foram feitas numa espécie de
concurso para que a imagem de um pingüim servisse aos
propósitos do Linux, até que alguém sugeriu a figura de um
"pingüim sustentando o mundo". Em resposta, Linus
Torvalds declarou que achava interessante que esse pingüim
tivesse uma imagem simples: um pingüim "gordinho" e com
expressão de satisfeito, como se tivesse acabado de comer
uma porção de peixes. Torvalds também não achava
atraente a idéia de algo agressivo, mas sim a idéia de
um pingüim simpático, do tipo em que as crianças perguntam
"mamãe, posso ter um desses também?". Ainda, Torvalds também frisou que
trabalhando dessa forma, as pessoas poderiam criar várias modificações desse
pingüim. Isso realmente acontece. Quando questionado sobre o porquê de
pingüins, Linus Torvalds respondeu que não havia uma razão em especial, mas
os achava engraçados e até citou que foi mordido por um "pingüim assassino" na
Austrália e ficou impressionado como a mordida de um animal aparentemente
tão inofensivo podia ser tão dolorosa.

Ver também
•Commons
•Wikilivros
•Lista de distribuições de Linux
•Comparação entre distribuições Linux
•LINUX Guia de Comandos
•Installfest
•Lei de Linus

inglês). Página visitada em 7 de março de 2008.


137Revista Superinteressante, O Mistério das Marcas, edição 261, janeiro de 2009, p. 34
Ligações externas
•Um guia completo sobre sistemas operacionais GNU/Linux
•Controvérsia sobre o nome
•O que é Linux
•What is Linux (em inglês)
•GNU/Linux distro timeline (em inglês)
•Linux: The 0.01 Release (em inglês)

Linux (núcleo)
Linux

Mascote
Linux

Desenvolvedor: Linus Torvalds, Andrew Morton e


centenas de colaboradores
Modelo do desenvolvimento: Software Livre
Versão estável: 2.6.32.3 / 6 de Janeiro de 2010 138

Família do SO: Tipo unix


Núcleo: Monolítico
Licença: GNU General Public License V.2 (GPL2)
Estado do desenvolvimento: Ativo
Website Kernel.org
Portal Tecnologias de informação

138Sobre a última versão estável (em inglês).


O Linux é o núcleo de um sistema operativo compatível com UNIX. Segundo
Bach,139 Tanenbaum140 e Silberschatz, Galvin e Gagne,141 sistema operacional
(sistema operativo) e núcleo (quando monolítico) podem ser considerados
sinônimos.
Foi criado por Linus Torvalds, do Departamento de Ciência da Computação da
Universidade de Helsinki (Finlândia), com a ajuda de vários programadores
voluntários por meio da Usenet em 1991, e subseqüentemente desenvolvido com
a ajuda de programadores de todo o mundo como software livre (SL).

História
O Linux foi originalmente escrito por Linus Torvalds, do Departamento de
Ciência da Computação da Universidade de Helsinki, Finlândia, e posteriormente
desenvolvido com a ajuda de vários programadores voluntários por meio da
Usenet.
Torvalds começou o desenvolvimento do núcleo como um projeto particular,
inspirado pelo seu interesse no Minix, um pequeno sistema UNIX desenvolvido
por Andrew S. Tanenbaum. Seus passos podem ser acompanhados pela lista de
discussão comp.os.minix (cujas mensagens podem ser vistas em
http://groups.google.com/group/comp.os.minix/topics).
Em 3 de julho de 1991 ele tentou obter a especificação POSIX.142
Em 25 de agosto de 1991 anunciou que estava trabalhando num sistema
operacional livre para plataformas Intel 386 e 486.143 Também informou que seu
sistema não utilizava código do Minix, e que não seria portável.
Finalmente, em 5 de outubro de 1991, Torvalds disponibilizou a versão 0.02 do
núcleo Linux no servidor nic.funet.fi (endereço IP 128.214.6.100). Na mensagem
que divulgou essa disponibilização aparece um período bastante conhecido da
comunidade (veja o texto original, em inglês144):

139BACH, Maurice J. The design of the Unix operating system. New Jersey: Prentice Hall.
1990.
140TANENBAUM, Andrew. Sistemas operacionais modernos. Rio de Janeiro: LTC. 1999.
141SILBERSCHATZ, Avi; GALVIN, Peter B.; GAGNE, Greg. Operating system concepts. 7.ed.
Hoboken: Wiley. 2005.
142TORVALDS, Linus. Gcc-1.40 and a posix-question. 03 de julho de 1991. Disponível em
http://groups.google.com/group/comp.os.minix/msg/a4ea0f118ba82dd0. Acessado em 18 de
janeiro de 2009.
143TORVALDS, Linus. What would you like to see most in minix?. 25 de agosto de 1991.
Disponível em http://groups.google.com/group/comp.os.minix/msg/b813d52cbc5a044b. Acessado
em 18 de janeiro de 2009.
144TORVALDS, Linus. Free minix-like kernel sources for 386-AT. 05 de outubro de 1991.
Disponível em http://groups.google.com/group/comp.os.minix/msg/2194d253268b0a1b. Acessado
em 18 de janeiro de 2009.
1. Você suspira pelos bons tempos do Minix-1.1, quando os homens eram
homens e escreviam seus próprios controladores de dispositivos? Você
está sem um bom projecto em mãos e deseja trabalhar num SO que
possa modificar de acordo com as suas necessidades? Acha frustrante
quando tudo funciona no Minix? Sem noites em claro para conseguir
que um programa funcione? Então esta mensagem pode ser
exactamente para você:-)

E continua:

1. Como eu mencionei há um mês(?) atrás, estou trabalhando numa versão


livre de um sistema similar ao Minix para computadores AT-386. Ele
finalmente atingiu um estágio em que poderá ser utilizado (embora
possa não o ser, dependendo do que você espera), e eu estou disposto a
disponibilizar o código-fonte para ampla distribuição. Está apenas na
versão 0.02 (…), contudo eu tive sucesso ao executar o bash, gcc, gnu-
make, gnu-sed, compress, etc. nele.

Inicialmente, Torvalds disponibilizou o Linux sob uma licença que proibia


qualquer uso comercial.145 Posteriormente foi adotada a Licença Pública Geral
GNU.146
Apesar de alguns dos programadores que contribuem para o núcleo permitirem
que o seu código seja licenciado com GPL versão 2 ou posterior, grande parte do
código, incluídas as contribuições de Torvalds, menciona apenas a GPL versão 2.
Isto faz com que o núcleo como um todo esteja sob a versão 2 exclusivamente,
não havendo previsões sobre a adopção da nova GPL versão 3.

Versões
Este diagrama, criado com o Free Code Graphing Project, é uma representação artística do
núcleo Linux, na sua versão 2.4.0

145TORVALDS, Linus. Notes for Linux release 0.01. Disponível em


http://www.kernel.org/pub/linux/kernel/Historic/old-versions/RELNOTES-0.01. Acessado em 18
de janeiro de 2009.
146TORVALDS, Linus. Release notes for Linux v0.12. Disponível em
http://www.kernel.org/pub/linux/kernel/Historic/old-versions/RELNOTES-0.12. Acessado em 18
de janeiro de 2009.
Torvalds e sua equipe têm continuado a lançar
novas versões, consolidando
contribuições de outros programadores e
introduzindo alterações suas. Antes do
lançamento da versão 2.6, o número de versão
menor (o segundo componente) par
indicavam uma série estável: 1.0.x, 1.2.x,
2.0.x, 2.2.x e 2.4.x; os lançamentos com um
número de versão menor ímpar correspondiam a
versões de desenvolvimento. O
terceiro componente do número de versão
correspondia a correções (releases) da
versão. A partir da versão 2.6, Torvalds
alterou esse padrão, criando um quarto
dígito. Assim, a árvore estável e a de
desenvolvimento confundem-se.
Atualmente, considera- se uma versão tanto
mais estável quanto maior o quarto dígito. Enquanto que Torvalds continua a
lançar as versões de desenvolvimento mais recentes, a manutenção das versões
"estáveis" mais antigas é delegada a outros, incluindo David Weinehal (2.0), Alan
Cox e mais tarde Marc-Christian Petersen (2.2), Marcelo Tosatti e depois Willy
Tarreau (2.4) e o próprio Torvalds, Andrew Morton e Adrian Bunk (2.6). Para
além dos núcleos "oficiais", "árvores" alternativas podem ser obtidas de outras
fontes. Distribuidores de sistemas operativos completos mantêm as suas próprias
versões do Linux, onde, por exemplo, incluem conrtoladores de dispositivos
(drivers) que não se encontram incluídos na versão oficial.

Versões iniciais

•0.01 - Setembro de 1991 - primeira versão (10.239 linhas de código).


•0.02 - Outubro de 1991 - primeira versão disponibilizada publicamente.
•0.12 - Janeiro de 1992 - primeira versão sob GPL (19.258 linhas de código).

Versões estáveis

•1.0 - Março de 1994 - Suportava apenas máquinas monoprocessadoras i386


(176.250 linhas de código).
•1.2 - Março de 1995 - Adicionado suporte para Alpha, SPARC e MIPS(310.950
linhas de código).
•2.0 - Junho de 1996 - Adicionado suporte para mais processadores e foi incluído
suporte para SMP (777.956 linhas de código).
•2.2 - Janeiro de 1999 (1.800.847 linhas de código).
•2.4 - Janeiro de 2001 (3.377.902 linhas de código).
•2.6 - Dezembro de 2003 (5.929.913 linhas de código).

Características técnicas
Um diagrama simplificado do núcleo Linux, mostrando seus
componentes principais e as camadas que o cercam
As características analisadas nesta seção,
particularmente as partes referentes a
processos e sistemas de arquivos, são descritas
com mais detalhes por Bovet e Cesati;147 o texto
sobre gerenciamento de memória baseia-se em
Gorman.148

Arquitetura
O Linux é um núcleo monolítico. Isto significa
que as funções do núcleo (escalonamento
de processos, gerenciamento de
memória, operações de entrada e saída, acesso
ao sistema de arquivos) são executadas no
espaço do núcleo, compiladas
estaticamente ou usando módulos carregáveis.
Herdou da linhagem UNIX a capacidade de
multitarefa, multiprocessamento, uso
de linhas de execução no núcleo (em inglês: kernel threading), preempção do
núcleo, suporte a aplicações multi-encadeadas (multithreaded application
support, por meio de processos leves—LWP), sistema de arquivos baseado em
VFS (Virtual File System).149

147BOVET, Daniel P.; CESATI, Marco. Understanding the Linux kernel. 3.ed. Sebastopol:
O'Reilly. 2005
148GORMAN, Mel. Understanding the Linux virtual memory manager. New Jersey: Prentice
Hall. 2004.
149
Todo acesso ao núcleo por uma aplicação deve ser efetuado por meio de
chamadas de sistema. Uma chamada de sistema é uma função que permite a
criação de processos, solicitação de memória, operação com arquivos, etc.
Já a comunicação do núcleo com o hardware ocorre, basicamente, de dois modos:
(i) o núcleo reconhece e gerencia o hardware usando drivers de dispositivos; (ii)
o hardware comunica-se com o núcleo por meio de interrupções.
Os controladores (drivers) de dispositivos e extensões do núcleo correm
tipicamente no espaço do núcleo, juntamente com o restante do núcleo, com
acesso total ao hardware. Diferentemente dos núcleos monolíticos tradicionais,
os controladores de dispositivos podem ser configurados como módulos (em
inglês: loadable kernel modules), que são bibliotecas compiladas fora do núcleo
propriamente dito, o que permite que sejam carregados e descarregados
enquanto o sistema corre.
Também podem ser interrompidos (preempted (em inglês)) sob certas condições.
Esta característica foi adicionada para lidar com interrupções de hardware
corretamente e para melhorar o suporte ao multiprocessamento.
O facto do Linux não ser micronúcleo foi tema duma famosa discussão entre
Linus Torvalds e Andy Tanenbaum no grupo de discussão comp.os.minix na
Usenet em 1992. Esse debate foi descrito por DiBona, Ockman e Stone.150

Processos
Um processo é uma instância de um programa em execução.151 Todo processo no
Linux tem um pai (processo criador) e um número identificador (PID). O pai de
todos os processos num ambiente Linux é o init, cujo PID é 1. Este processo é
criado pelo processo 0, que é um encadeamento (thread) do próprio núcleo. O
processo init irá permanecer em execução até o desligamento do sistema, e sua
função é monitorar e criar os processos que implementam as camadas exteriores
do sistema operacional.
Os processos são criados pela chamadas de sistema fork() (processos
tradicionais ou heavy weight) e clone() (processos leves ou light weight). Para
otimizar a criação de processos tradicionais, o Linux usa o recurso de copy-on-
write: quando um processo-filho é criado, ele compartilha as mesmas páginas de
memória do pai. Quando um dos dois tenta escrever na memória, é gerada uma
interrupção para o núcleo, que então copia o conteúdo das páginas de memória
para novas molduras de páginas, e estas são atribuídas ao processo que efetuou
a escrita.

150DiBONA, Chris; OCKMAN, Sam; STONE, Mark. Open sources: voices from the open source
revolution. Sebastopol: O'Reilly. 1999.
151
Para manter um ambiente multitarefa e possibilitar o multiprocessamento, o
Linux mantém algumas estruturas importantes, das quais podemos citar duas: (i)
o descritor do processo (task_struct), que contém todas as informações relativas
ao processo; (ii) uma fila (runqueue) de processos por processador. Quando o
sistema possui mais de um processador, o agendador do Linux faz o
balanceamento de carga entre as filas.

Agendamento
Para poder fazer um adequado compartilhamento de tempo do processador, o
Linux usa duas classificações para avaliar qual a prioridade que um processo
deve ter: (i) determina a responsividade do processo (tempo real, interativo, em
segundo plano); (ii) verifica se o processo usa muito tempo de processador (CPU-
bound) ou faz muitas operações de entrada e saída (I/O-bound).
Essas duas classes são razoavelmente independentes. Um processo pode
executar em segundo plano (um daemon, por exemplo) e ser consumidor de
recursos de entrada e saída (um servidor de banco de dados) ou usar muito
tempo de processador (um compilador). Um processo que executa em tempo real
foi assim definido pelo seu programador, mas o agendador do Linux necessita
fazer uma análise heurística para saber se um processo é interativo ou está
executando em segundo plano.
O Linux utiliza um sistema de prioridades, onde um processo que possui
prioridade maior tem precedência sobre um de prioridade menor para obter o
processador. A identificação da prioridade de um processo pode ser estática ou
dinâmica e varia de 1, a maior prioridade, a 139, a menor. Os números 1 a 99 são
atribuídos a processos de tempo real e 100 a 139 são atribuídos a processos
tradicionais (interativos e segundo plano).
Um processo em tempo real é classificado em FIFO (first-in, first-out) ou RR
(Round-Robin) e somente será retirado do processador nos seguintes casos: (i)
fim de execução; (ii) para ser substituído por um processo de maior prioridade;
(iii) executar uma operação de bloqueio; (iv) espontaneamente; (v) é RR e
esgotou seu quantum de processamento.
Um processo tradicional tem inicialmente atribuída uma prioridade estática (em
geral 120) que determina o seu quantum de processamento, mas pode ter uma
prioridade dinâmica, que é o valor analisado pelo agendador quando percorrer a
lista de processos para determinar qual irá usar o processador. A prioridade
dinâmica pode alterar o valor da prioridade estática em 5 pontos, para mais
(penalidade) ou para menos (bônus), dependendo do passado do processo. O
passado irá beneficiar o processo se o mesmo ficou muito tempo fora do
processador (sleep time). Caso este tempo seja pequeno, o processo será
penalizado.
Obs.: essa estrutura acima pode ser modificada a partir da release 2.6.23 ou
posterior, com a introdução do CFS (completely fair scheduler).
Gerenciamento de memória
O Linux utiliza memória virtual, que possui, pelo menos, 4 funções básicas: (i)
assegurar que cada aplicação (processo) tenha seu próprio espaço de
endereçamento, começando em zero-problema de relocação;152153 (ii) proteção de
memória, para impedir que um processo utilize um endereço de memória que
não lhe pertença;154 (iii) compartilhamento de memória—processos diferentes
podem compartilhar código ou dados;155 (iv) possibilitar que uma aplicação
utilize mais memória do que a fisicamente existente (essa é a função mais óbvia).
Seu código divide-se em duas partes. Uma é dependente da arquitetura, onde
são definidos o endereçamento — virtual e físico, o tamanho de página e o
tratamento das tabelas de páginas. Na parte independente ficam o controle de
alocação e liberação de memória e o esquema de substituição páginas.
O Linux utiliza tamanhos de páginas de acordo com a arquitetura. Os
processadores x86 utilizam páginas de 4 KiB (padrão), 2 MiB (caso seja utilizado
o recurso de PAE – Page Address Extension – da Intel) ou de 4 MiB. Nas
arquiteturas RISC o tamanho padrão é de 8 KiB, mas não é o único.
O endereçamento virtual é dividido em espaço do usuário e espaço do núcleo. O
primeiro é privativo de cada processo, com início no endereço lógico zero e
terminando no endereço determinado pela macro PAGE_OFFSET (v. figura 1). O
espaço do núcleo é único e começa depois do espaço do usuário. Na arquitetura
x86 PAGE_OFFSET determina um valor de 3 GiB para o espaço do usuário e 1 GiB
para o espaço do núcleo.
(Figura 1: está faltando)
O código do Linux é carregado no início do espaço do núcleo, sendo seguido pela
área fisicamente mapeável (mem_map, estrutura que indexa as páginas físicas, e as
páginas propriamente ditas). Na arquitetura x86, os últimos 128 MiB do espaço
do núcleo são reservados para alocação de memória não contígua e memória
alta, limitando a memória física endereçável pelo Linux, na compilação padrão, a
896 MiB.
Um endereço virtual no Linux (v. figura 2), é dividido em 5 campos: diretório de
páginas (PGD), diretório superior de páginas (PUD), diretório intermediário de
páginas (PMD), tabela de páginas (PTE) e deslocamento (offset). A arquitetura
x86 possui um espaço de endereçamento de 32 bits; quando são utilizadas
páginas de 4 KiB (o padrão) o PUD e o PMD não são utilizados; o PGD e o PTE
usam 10 bits cada, e o deslocamento usa 12 bits.
(Figura 2: está faltando)

152
153STALLINGS, William. Operating systems: internals and design principles. 5.ed. Upper
Saddle River: Pearson Prentice Hall. 2005.
154
155
O esquema de substituição de páginas no Linux usa o algoritmo LRU (por
aproximação) mantendo duas listas de envelhecimento (aging). A primeira
(active_list) contém as páginas atualmente em uso (as páginas mais
recentemente referenciadas estarão mais próximas do início da lista) e a
segunda (inactive_list) contém as candidatas a paginação (page out).
A paginação para disco pode ocorrer sob demanda, quando algum processo
solicitar página e não houver alguma disponível. Neste caso, a página no final da
lista inactive_list é liberada. Entretanto, existe um processo chamado kswapd,
inicializado pelo núcleo, que verifica, periodicamente, o número de páginas
livres. Caso este número seja menor que pages_low, kswapd é acordado para liberar
páginas. Se o valor chegar a pages_min, kswapd entra num regime síncrono para
agilizar a liberação. Quando o valor de páginas livres atingir pages_high, kswapd vai
dormir.

Sistema de arquivos
O gerenciamento de arquivos no Linux baseia-se num esquema de vários níveis,
onde a camada principal é o VFS (Virtual File System), que esconde da aplicação
as características dos diversos sistemas de arquivo reconhecidos pelo Linux.
Quando uma aplicação solicita uma operação sobre algum arquivo, essa
solicitação é encaminhada para o VFS, que reenvia a solicitação para um dos SA
registrados.
O VFS utiliza uma estrutura chamada superbloco para manter as informações
referentes aos diversos sistemas de arquivos montados (tipo, ponto de
montagem, dispositivo de bloco utilizado, arquivos abertos). Também utiliza nós-
i, semelhantes aos nós-i do EXT2, com as informações sobre os arquivos
(permissões, blocos utilizados, dono, etc.).
Os sistemas de arquivos registrados no VFS podem ser classificados em 3
grupos: (i) dispositivos de blocos (EXT2, EXT3, Reiserfs, XFS, VFAT); (ii)
associados a rede (NFS, SMB); (iii) dispositivos especiais (procfs, tempfs). Todos
esses sistemas podem ser carregados como módulos.
O Ext2 está deixando de ser o padrão, particularmente por sua deficiência
quando ocorre uma pane. Neste caso, o sistema operacional deve executar uma
varredura completa para verificar o estado do sistema (fsck). Outros sistemas
foram criados para sanar essa deficiência, utilizando um recurso chamado
journaling, que é a utilização de um registro (log) de alterações (journal). Os
sistemas de arquivos desse tipo mais importantes são: Ext3, Reiserfs, XFS e JFS.
Pânico do núcleo
Um pânico do núcleo (em inglês: kernel panic) é um erro de sistema não-
recuperável detectado pelo núcleo, ao contrário dos erros de impressão e
utilização por código do espaço de utilizador. É possível que o código do núcleo
indique essa condição ao invocar a função panic localizada no ficheiro-cabeçalho
sys/system.h. No entanto, grande parte dos pânicos são o resultado de excepções
do processador não-lidadas no código do núcleo, tal como referências a moradas
de memória inválidas. São normalmente não indicativo de erros algures na
cadeia de chamadas que levam ao pânico.

Portabilidade
Embora Linus Torvalds não tenha tido como objetivo inicial tornar o Linux um
sistema portável, ele evoluiu nessa direção. O Linux é hoje, o núcleo de sistema
operacional com maior portabilidade, correndo em sistemas desde o iPaq, um
computador portátil, até o IBM S/390, um denso e altamente custoso mainframe.
De qualquer modo, é importante notar que os esforços de Linus foram também
dirigidos a um diferente tipo de portabilidade. Portabilidade, de acordo com
Linus, era a habilidade de facilmente compilar aplicações de uma variedade de
códigos fonte no seu sistema; portanto o Linux originalmente tornou-se popular
em parte devido ao esforço para que os códigos fonte GPL ou outros favoritos de
todos corressem em Linux.
O Linux hoje funciona em dezenas de plataformas, desde mainframes até um
relógio de pulso, passando por várias arquitecturas: x86 (Intel, AMD), x86-64
(Intel EM64T, AMD64), ARM, PowerPC, Alpha, SPARC etc., com grande
penetração também em sistemas embarcados, como handhelds, PVR, vídeo-jogos
e centros multimídia, entre outros.

Miscelânea

Mascote
Tux, mascote do projeto
O mascote do Linux (núcleo e tudo que é relacionado) é um
pinguim chamado Tux, criado por Larry Ewing. O motivo
pelo qual a mascote é um pinguim é, como Torvalds
disse, "O Linus gosta de pinguins. É isso." O nome
Tux foi sugerido para representar Torvalds' Unix, e
ficou assim.

Termos de licenciamento
Inicialmente, Torvalds lançou o Linux sob uma licença que
proibia qualquer exploração comercial, mas mais tarde adoptou a GPL (versão 2
exclusivamente). Esta licença permite a distribuição e até a venda de versões do
Linux mas exige que todas essas cópias sejam lançadas sob a mesma licença e
que sejam acompanhadas com o código-fonte. Torvalds descreveu o
licenciamento do Linux sob a GPL como "a melhor coisa que fez desde sempre."
Uma dúvida que é levantada na aplicação da GPL no Linux é a consideração sob
a lei de direitos de autor de módulos carregáveis como sendo ou não "trabalho
derivado" e, consequentemente, serem submetidos aos termos da GPL. Torvalds
declarou que módulos que usam apenas um conjunto público e limitado do
interface do núcleo podem, por vezes, ser trabalho não-derivado, assim
permitindo alguns drivers distribuídos apenas em formato binário e outros
módulos que não respeitem os termos da GPL. Contudo, nem todos os
contribuintes do núcleo concordam com esta interpretação e até Torvalds
concorda que muitos módulos do núcleo são claramente obras derivadas.

Ver também
•TORVALDS, Linus; DIAMOND, David (2001). Just For Fun: The story of an
accidental revolutionary. HarperBusiness. ISBN 0-06-662072-4 (hardcover);
HarperAudio ISBN 0-694-52539-1 (audio tape, abridged ed., read by David
Diamond) - on the beginnings of the Linux kernel; No Brasil: Só por Prazer.
Campus. ISBN 85-352-0801-1.
•Lista de distribuições de Linux
•Comparação entre distribuições Linux
•LINUX Guia de Comandos
•Installfest
•Lei de Linus
Ligações externas
•www.kernel.org (em inglês) The Linux Kernel Archives, the official kernel
repository, acessado pela última vez há 56 semanas e 6 dias
•KernelTrap (em inglês), acessado pela última vez há 56 semanas e 6 dias
•Cobertura sobre o kernel em LWN.net (em inglês), acessado pela última vez há
56 semanas e 6 dias
•Linux Kernel Source Code Viewer (em inglês), acessado pela última vez há 56
semanas e 6 dias
•Linux Kernel Janitor (em inglês), acessado pela última vez há 56 semanas e 6
dias
•Linux Device Drivers, 3rd Edition (em inglês), acessado pela última vez há 56
semanas e 6 dias
•Understanding the Linux Kernel, 2nd Edition (em inglês), acessado pela última
vez há 56 semanas e 6 dias
•LinkSys and binary modules] (em inglês) LWN.net Weekly Edition, October 16,
2003, acessado pela última vez há 56 semanas e 6 dias
•The Wonderful World of Linux 2.6 (em inglês) Joseph Pranevich; December
2003, acessado pela última vez há 56 semanas e 6 dias
•O Maravilhoso Mundo do Linux 2.6 (em português) tradução do artigo acima
por Cesar A. K. Grossmann, acessado pela última vez há 56 semanas e 6 dias
•Understanding the Linux 2.6.8.1 CPU Scheduler (em inglês) Josh Aas, 17th
February 2005, acessado pela última vez há 56 semanas e 6 dias
•Linux Online - Linux Kernel Information (em inglês), acessado pela última vez
há 56 semanas e 6 dias
•Open Directory - Linux: Kernel (em inglês), acessado pela última vez há 56
semanas e 6 dias
•Google Directory - Linux > Kernel (em inglês), acessado pela última vez há 56
semanas e 6 dias
•Linux Links - The Linux Portal: Kernel (em inglês), acessado pela última vez há
56 semanas e 6 dias
•Loads of Linux Links (em inglês), acessado pela última vez há 56 semanas e 6
dias
•VGER.KERNEL.ORG (em inglês) Linux Kernel Developers' email list, acessado
pela última vez há 56 semanas e 6 dias
•Linux Kernel Newbies.org (em inglês), acessado pela última vez há 56 semanas
e 6 dias
•linux kernel links (em inglês) linux kernel source and news, acessado pela
última vez há 56 semanas e 6 dias
•Foca GNU/Linux: Página oficial: (em português) Um guia completo sobre
sistemas operacionais GNU/Linux, acessado pela última vez há 56 semanas e
6 dias
•What is Linux (em inglês), acessado pela última vez há 56 semanas e 6 dias
•O que é Linux (em inglês), acessado pela última vez há 56 semanas e 6 dias
•GNU/Linux distro timeline (em inglês), acessado pela última vez há 56 semanas
e 6 dias
•GNU/Linux naming controversy (em inglês), acessado pela última vez há 56
semanas e 6 dias
•Linux: The 0.01 Release (em inglês), acessado pela última vez há 56 semanas e
6 dias

Linus Torvalds
Linus Torvalds
Linus Torvalds aos 35 anos de idade
Linus Benedict Torvalds (Helsínquia,
28 de Dezembro de 1969) é o criador do
núcleo do sistema operacional GNU/Linux,
muitas vezes chamado simplesmente de
"Linux".
Linus Torvalds pertence à comunidade dos
Finlandssvensk, um extrato da população
representando 6% dos habitantes da Finlândia,
que falam sueco. Ele estudou na Universidade
de Helsinki. Vive atualmente em Santa
Clara, na Califórnia, com a sua mulher Tove e suas
três filhas. Atualmente trabalha na Open Source
Development Labs (OSDL).

Biografia
Começou a lidar com a informática quando tinha
11 anos. O avô, Leo Waldemar Tornqvist, um
matemático e estatístico da Universidade comprou um dos primeiros
computadores Commodore em 1980 e pediu-lhe ajuda para usá-lo.
Tornou-se tão interessado que passou um verão inteiro dentro de casa ou,
melhor dizendo, no quarto em frente ao computador desenvolvendo o que
restava do núcleo.
Em 1983 Richard Stallman criou a Free Software Foundation (GNU project). Em
1986 Marice J. Bach publicou Design of the Unix Operating System. Em 1988
Linus foi admitido na Universidade de Helsinki. No mesmo ano Andy Tanenbaum
traz a público o Sistema Operacional Minix, um Unix para fins didáticos e que
rodava em IBM/PC. Em 1990 Torvalds começa a aprender C em seus estudos.
No fim dos anos 80 ele tomou contato com os computadores IBM/PC compatíveis
e em 1991 comprou um 80386. Com 21 anos, 5 já de experiência programando
(em C), ele tinha contato com o Sistema Unix da Universidade (SunOS,
atualmente Solaris) e desejava rodar a versão de Tannenbaum (Minix) no seu
recém adquirido 80386. Entretanto, descontente com os recursos do Minix,
especialmente em relação ao emulador de terminal do Minix que ele utilizaria
para acessar remotamente o Unix da Universidade, começa a desenvolver o seu
próprio emulador de terminal que não rodaria sobre o Minix, mas diretamente no
hardware do PC 386. Este projeto pessoal foi sendo modificado gradualmente e
adquirindo características de um Sistema Operacional independente do Minix.
Este é o início do desenvolvimento do núcleo Linux, relatado pelo próprio Linus
Torvalds em seu livro Just for fun.
O núcleo Linux foi inicialmente desenvolvido por Linus Torvalds numa tentativa
de criar um sistema operacional similar ao Unix que rodava em processadores
Intel 80386. O projeto foi lançado em 1991 em uma famosa mensagem para a
Usenet em que ele divulgou que estava disposto a disponibilizar o código-fonte e
contar com a colaboração de outros programadores. Desde os primeiros dias, ele
recebeu ajuda de hackers do Minix, e hoje recebe contribuições de milhares de
programadores dos mais diversos locais do mundo.
Em 1997 Linus Torvalds recebeu os prêmios "1997 Nokia Foundation Award'y" e
"Lifetime Achievement Award at Uniforum Pictures". No mesmo ano finaliza os
estudos superiores (1988 - 1997) passou 10 anos como estudante e investigador
na Universidade de Helsinki, coordenando o desenvolvimento do núcleo do S.O.
desde 1992.
Torvalds trabalhou na Transmeta (fabricante de processadores para portáteis)
entre 1997 e 2003, e neste ano juntou-se à Open Source Development Labs
(OSDL), uma fundação criada para ajudar no desenvolvimento do núcleo Linux,
como OSDL fellow. Fazem parte dessa fundação várias grandes empresas do
ramo da informática, como IBM, Sun, Nokia e outras.
Torvalds possui a marca registrada "Linux" e supervisiona156 o uso (ou abuso) da
marca através da organização sem fins lucrativos Linux International.

Curiosidades

156Título ainda não informado (favor adicionar).


•Uma vez, o seu avô comprou um veleiro montável com cerca de 1000 peças
para ser montado com o neto, Linus e pudessem velejar juntos. Mas no dia em
que o veleiro chegou já era tarde, o avô preferiu esperar até amanhã. Mas Linus
não conseguiu aguentar tanto tempo e montou o veleiro sozinho. O seu avô ficou
espantado pois, um veleiro destes é muito difícil de ser montado.
•O nome do mascote Tux (o pingüim do Linux), foi escolhido por votação, pelo
próprio Linus. Segundo ele "gostaria de um pingüim cheio, satisfeito por ter
comido muitos peixes". Diz a lenda que o motivo por trás da escolha do Tux como
mascote foi uma mordidela que Linus levou de um pinguim num jardim
zoológico.
•Ainda a cerca da mordidela, eis a lenda: Linus estava em um zoológico, parece
que alimentando os pingüins, e eis que toma uma mordida em um dedo, que
havia doído bastante. Ao perceber a dor que sentiu de um animal de pequeno
porte como um pingüim, Linus pensa: "Se um animal tão pequeno consegue me
machucar assim, porque meu pequeno S.O. não pode 'machucar' um maior?"

Ver também
•Commons
•Wikiquote
•Hacker
•Linux
•Free Software Foundation
•Just for fun, livro de Torvalds.

Ligações externas
•Entrevista
•Blog pessoal (em inglês)

Tux
Tux, o mascote GNU/Linux. Trata-se de um pingüim gordo e satisfeito.
O Tux é a mascote oficial do sistema
operativo GNU/Linux. O Tux, criado por Larry
Ewing em 1996, é um pinguim gorducho que
tem um ar satisfeito e saciado. A ideia da
mascote do Linux ser um pinguim veio de
Linus Torvalds, o criador do núcleo Linux.
É, por vezes, alegado que o nome deriva de
Torvalds UniX, um nome sugerido por James
Hughes, em vez da explicação que os
pinguins aparentam vestir um smoking.
O Tux foi criado para um concurso de
logotipos para Linux. O logotipo vencedor foi
criado por Larry Ewing usando o GIMP (um
pacote de software livre de edição gráfica) e foi
lançado por ele sob as seguintes condições:
A autorização para o uso e/ou modificação desta imagem é concedida desde
que me reconheça lewis@isc.tamu.edu e o GIMP, caso alguém pergunte [13]
Segundo Jeff Ayers, Linus Torvalds tinha uma "fixação por aves marinhas gordas
e desprovidas da capacidade de vôo!" e o Torvalds reivindica que contraiu uma
"penguinite" após ter sido gentilmente mordiscado por um pinguim: "A
penguinitie faz com que passemos as noites acordados só a pensar em pinguins e
a sentir um grande amor por eles." A suposta doença de Torvalds é, pois claro,
uma piada, mas ele foi mesmo mordido por um pequeno pinguim numa visita a
Canberra.
O Tux tornou-se num icone para a comunidade Linux e Open Source, com um
grupo de utilizadores de linux britânico adoptando um pinguim no Jardim
Zoológico de Bristol. Ele é muito mais famoso que o seu grande amigo, GNU, um
pacífico e tímido gnu que representa o Projecto GNU. Ele é frequentemente
vestido ou retratado de maneiras diferentes, dependendo do contexto; por
exemplo, quando representando o algoritmo de segurança PaX, ele usa um
capacete e enverga um machado e um escudo, e os seus olhos são vermelhos.
O Tux é a estrela de um jogo para Linux chamado Tux Racer, em que o jogador
guia o Tux abaixo duma variedade de montes gelados na sua barriga, tentando
apanhar arenques e a bater o limite de tempo. Tux é também uma personagem
do webcomics, User Friendly.
Em algumas distribuições de Linux, caso o suporte a framebuffer esteja ativado,
o Tux saúda o utilizador durante o processo de boot. Em sistemas com múltiplos
processadores são exibidos vários Tuxes, sendo um para cada processador.
Tux aparece também nos textos de Éder Luiz sendo um super herói nos textos
Tux e a equipe fedora
TUX é também o nome do servidor web baseado no núcleo de Linux, que é capaz
de servir páginas de web estáticas muito mais rapidamente que servidores
tradicionais, tais como o servidor Apache HTTP, software esse mantido pela Red
Hat.
Tributos ao Tux
•O pinguim Ted é uma personagem no popular webcomic Ctrl Alt Del. Ted, sendo
o animal de estimação do único guru de Linux na tira, é claramente um tributo
ao Tux.

Alguns programas do Tux


Imagem do game Super Tux.
•Super Tux Milestone 1 (0.1.2)2003
•Tux Walk 1.0 2004
•Tux Racer 2002
•Super Tux Milestone 2 (1.234) 2005
•Tux Paint
•TuxGuitar

Ver também
•Glenda - Mascote do Sistema Operacional Plan 9

Ligações externas
•Linux 2.0 Penguins (Larry Ewing)
•A complete history of Tux
•Wired News story on Tux
•The Linux Logo Competition site
•Desenhando o Tux no InkScape (em português)

Lei de Linus
Com um grande número de colaboradores, erros em sistemas
tendem a ser detectados e corrigidos mais facilmente. A
fotografia mostra entusiastas de software livre em um encontro
sobre Linux.
A Lei de Linus (Linus's Law) é uma lei epigramática
formulada pelo hacker Eric S. Raymond. O enunciado
dela é o seguinte:
"Dados olhos suficientes, todos os erros são triviais"
(Given enough eyeballs, all bugs are shallow)
A frase possui relação com o modo de funcionamento da base do código aberto
(open source) e da internet, em que com um grande número de colaboradores
("olhos"), qualquer problema em um sistema pode ser detectado e corrigido. Na
proporção em que os colaboradores aumentam, a facilidade com que as
correções são feitas também aumenta, ou seja, o número de colaboradores é
diretamente proporcional à facilidade de detecção e correção do erro.

Surgimento e uso
Eric S. Raymond
O adágio foi publicado por Eric S. Raymond — um
famoso hacker e ícone no movimento do código aberto
e do software livre — em seu ensaio A Catedral e o Bazar,
descrito no capítulo 10 ("O Contexto Social do Código
Aberto"). O nome da lei é uma alusão ao finlandês
Linus Torvalds, criador do sistema operacional Linux,
um software livre.
De certa forma, podemos dizer que tal lei possui
semelhança com o ditado popular "O olho do dono
engorda o boi".
Os conceitos expressados pela Lei de Linus são tão
universais que a lei tem sido constantemente usada fora do contexto puramente
informático. Um exemplo é a Wikipédia, que segue um modelo baseado na lei de
Linus, já que, podendo ser editada por qualquer pessoa, muitos erros podem ser
gerados, mas se houver um grande número de colaboradores para cuidar dos
erros, eles podem ser facilmente contornados. Isso é bem conhecido pelos
administradores (ou sysops) de cada Wikipédia, que cuidam da manutenção do
projeto.
Larry Sanger, co-fundador da Wikipédia, afirmou certa vez, sobre o fato de que
qualquer pessoa pode criar e editar artigos na Wikipédia, que "dados olhos
suficientes, todos os erros são triviais", em uma alusão direta à lei de Linus.
Tom Arriola, o desenvolvedor do Crime Scene (Cena do Crime), um site que dá
aos seus milhares de membros a tarefa de resolver coletivamente mistérios de
assassinatos fictícios, chamou de "efeito ocular" uma versão que postulou da Lei
de Linus: "Quanto mais olhos vêem algo, mais provável é que alguém veja
alguma coisa que ninguém viu antes."157

A ética hacker
Linus Torvalds

157Terdiman, Daniel (2005-02-14). Brute Force for Brain Teasers. URL acessada em 16 de Abril
de 2006.
A noção do próprio Linus sobre a lei foi usada em
conjunto com as definições filosóficas do hacker ativo,
registrada no prólogo do livro A Ética Hacker.158
De acordo com essa definição, a atividade que
pressiona os humanos pode ser dividida em três
categorias. O avanço bem- sucedido de uma fase para
outra determina o processo de evolução. Estas três
categorias são, em ordem: a sobrevivência, a vida social e
o entretenimento.
A sobrevivência é a base da própria existência. É
portanto um fator de motivação, mas em um
sistema socio-econômico bem desenvolvido, não passa de
uma preocupação cotidiana.
A vida social é um fator de motivação muito forte. Em
muitos casos, maior consideração é dada para os laços sociais do que para a
"auto-pessoa". São tarefas semelhantes aos conceitos de "morrer por sua
família/por religião/pelo país".
O entretenimento é a última das três categorias. Esse "entretenimento" não está
relacionado com ações como jogar jogos eletrônicos ou assistir a televisão, mas
fazer algo interessante e estimulante, um estímulo positivo para a base de nossas
ações. Linus Torvalds assim descreveu esta última fase: "É a ginástica mental
necessária na tentativa de explicar o universo".
Pode-se observar a aderência dessas três categorias com as cinco necessidades
da conhecida Hierarquia de necessidades de Maslow: fisiologia, segurança,
amor/relacionamento, estima e realização pessoal, amplamente conhecidas no
terreno da Administração.
Concluindo, o hacker portanto precisará fazer uso do computador para que
sobreviva. O computador passa a ser o principal meio de obter relações sociais,
mas acima de tudo, entretenimento. O desenvolvimento de um sistema open-
source é realizada mais por causa da paixão dos desenvolvedores no seu próprio
projeto, e não para meios puramente comerciais.

158Himanen, Pekka; Linus Torvalds, Manuel Castells (2001-01-30). The Hacker Ethic, Random
House. ISBN 0375505660.
Críticas
Alguns estudos contestaram a Lei de Linus, citando o número relativamente
pequeno de contribuições feitas para projetos open source por pessoas "de fora",
isto é, pessoas que não pertencem a um pequeno grupo principal de
colaboradores.159 Isso é, em grande parte, o resultado do investimento necessário
que os colaboradores precisam realizar para manter positivamente os ajustes na
interface do usuário e entender um pouco do código antes que possam
efetivamente contribuir para o mesmo.
Alguns projetos também não confiam em contribuições externas, temendo que
eles possam criar bugs difíceis de serem encontrados ou brechas na segurança, e
assim esses projetos criam um inconveniente processo de revisão que pode
prejudicar desenvolvimento externo.
Os defensores do código aberto argumentam, no entanto, que existem maneiras
de se minimizar estes problemas e de se facilitar a integração de colaboradores
externos. Seguindo práticas efetivas de engenharia de software, é possível
produzir um código de fácil manutenção. Os exemplos podem incluir o uso de
componentes modulares com acoplamento frouxo, ou um bom conjunto de testes
para a verificação das contribuições externas, ou uma simples estratégia de
desenvolvimento suportada por ferramentas como o autoconf.
Também é considerado uma ajuda importante ter uma boa documentação,
incluindo tanto uma visão geral quanto descrições detalhadas da interface,
opcionalmente suportadas por ferramentas como o Javadoc e ferramentas de
visualização de código. Porém nem todos os projetos open source implementam
tais medidas.
Outro argumento contra o código aberto é o de que falhas de segurança podem
ser facilmente encontradas pelo exame do código fonte, destruindo efetivamente
qualquer segurança por obscuridade (en:security through obscurity). Outros
dizem que isso é um ponto forte: significa que não apenas usuários maliciosos,
mas também desenvolvedores externos e usuários legítimos, podem encontrar tal
falha de segurança mais facilmente e diagnosticar ataques mais rapidamente.
Por serem expostos rapidamente e para mais pessoas, os problemas de
segurança podem ser consertados antes que a aplicação esteja completamente
desenvolvida e eles se tornem um problema mais sério.

Ver também
•Eric S. Raymond
•A Catedral e o Bazar
•Linus Torvalds
•Software livre
159Obasanjo, Dare (2002). The Myth of Open Source Security Revisited. URL acessada em 16 de
Abril de 2006
•Revisão por pares

Ligações externas
•Leis epigramáticas

Guia de comandos para Linux/Unix


Esta é uma lista de programas de computador para o sistema operacional Linux
e sistemas compatíveis, como o Unix.

Comentários
A linha de comando do sistema operacional Linux permite a realização de
inúmeras tarefas através de seus comandos, de manipulação de arquivos a
verificação do tráfego em rede. Para exibir uma descrição detalhada de cada
comando abra uma console ou xterm e digite man comando, onde comando é o
comando em questão. Outro detalhe muito importante! pratique cada comando
muitas vezes até que se torne algo natural.

Comandos de manipulação de diretório

mkdir cria um diretório exemplo: mkdir docsrmdir exclui um


diretorio (se estiver vazio)rm -rf exclui um diretório e todo o seu
conteúdocd entra num diretório (exemplo: cd docs) ou retorna para
HOMEcd ~ vai direto para o diretório home do usuário logado.cd -
volta ao último diretório acessadopwd exibe o local do diretório
atualls listar o conteúdo do diretóriols -alh mostra o conteúdo
detalhado do diretóriols -ltr mostra os arquivos no formado longo(l) em
ordem inversa(r) de data (t)du (Unix)du -msh mostra o tamanho do diretório
em Megabyteswhereis mostra onde se encontra determinado arquivo (binários)
exemplo: whereis sambawhich mostra qual arquivo binário está sendo
chamado pelo shell quando chamado via linha de comando

Dicas úteis

Qual o maior diretório?


Para obter uma listagem de diretórios em sistemas GNU/Linux, ordenados do
maior para o menor, use o comando:
du -Sk | sort -nr | more

ou

du -Sh | sort -nr | more

para exibir resultado em UNID (Kbytes,Mbytes ou Gbytes)

O tamanho de cada diretório ou subdiretório

du -ach --max-depth=1 /var/du -ach --max-depth=1 /var/ | sort -nrdu -ach


--max-depth=1 /var/ | sort -nr | more

Criar diretórios dentro de diretorios

mkdir -p teste teste1 teste2 teste3

Criar uma árvore completa de diretórios

mkdir -p docs/{img/{fotos,icons,wallpapers,svg},textos/{artigos,man},tmp}

A regra aqui é a seguinte:

para cada pasta que conterá subpastas use "nome/{}"dentro das chaves coloque
os nomes separados por vírgulae não esqueça de usar o parâmetro '-p' no
começo do comando!
Comandos para manipulação de arquivos

cat (Unix)cat mostra o conteúdo de um arquivo binário ou textotac


semelhante ao cat mas inverte a ordem tail mostra as últimas 10 linhas
de um arquivo (util para ler logs)head mostra as primeiras 10 linhas de
um arquivoless mostra o conteúdo de um arquivo de texto com controlevi
editor de ficheiros de textovim versão melhorada do editor
supracitadorm remoção de arquivos (também remove diretórios)cp
(Unix)cp copia diretórios 'cp -r' copia recursivamentemv move
ou renomeia arquivos e diretórioschmod altera as permissões de arquivos
ou directórioschown altera o dono de arquivos ou diretórioscmd>txt cria
um novo arquivo(txt) com o resultado do comando(cmd)cmd>>txt adiciona o
resultado do comando(cmd) ao fim do arquivo(txt)touch touch foo.txt -
cria um arquivo foo.txt vazio; também altera data e hora de
modificação para agora> arquivo.txt mais rápido que o touch para criação
de arquivossplit divide um arquivorecode recodifica um arquivo ex: recode
iso-8859-15..utf8 file_to_change.txt[mc] poderoso editor de texto

Comandos para administração

man mostra informações sobre um comando adduser adiciona


usuáriosaddgroup adiciona gruposapropos realiza pesquisa por palavra ou
stringdmesg exibe as mensagens da inicialização(log)du_(Unix)du
exibe estado de ocupação dos discos/partiçõesfind comando de busca ex: find
~/ -cmin -3userdel remove usuárioschfn altera informação relativa a
um utilizadorwho informa quem está logado no sistemawhoami informa
com qual usuário você está logadopasswd modifica senha (password) de
usuáriosumask define padrões de criação de arquivos e diretóriosps
(Unix)ps mostra os processos correntesps -aux mostra todos os
processos correntes no sistemakill manda um sinal para um processo. Os
sinais SIGTERM e SIGKILL encerram o processo.killall manda um sinal para
todos os processos.su troca para o super-usuário root (é exigida a
senha)su user troca para o usuário especificado em 'user' (é exigida a
senha)chown altera a propriedade de arquivos e pastas (dono)env
mostra variaveis do sistema
Comandos para administração de rede

ifconfig mostra as interfaces de redes ativas e as informações


relacionadas a cada uma delasroute mostra as informações referentes as
rotasmtr mostra rota até determinado IPnmap lista as portas de
sistemas remotos/locais atras de portas abertas. Pode verificar
sistema operacional em execução no host remoto.netstat exibe as portas e
protocolos abertos no sistema.iptraf analisador de trafego da rede com
interface gráfica baseada em diálogostcpdump sniffer muito popular.
Sniffer é uma ferramenta que "ouve" os pacotes que estão passando
pela rede.traceroute traça uma rota do host local até o destino mostrando os
roteadores intermediáriosnslookup consultas a serviços DNSdig
consultas a serviços DNS

Referências
•Foca GNU/Linux
•UNIX ON-LINE Man Pages

Anexo:Lista de distribuições de Linux

Distribuições de propósito geral


•ALT Linux
•Arch Linux
•Debian
1. BrDesktop
2. Damn Small Linux
3. Famelix
4. Freedows
5. Insigne GNU Linux
6. KeeP-OS
7. Knoppix
1. Kurumin NG
2. DreamLinux
3. Big Linux
8. Linex
9. Resulinux
10. Rxart
11. Satux
12. Skolelinux
13. Ubuntu
1. Alinex
2. Fluxbuntu
3. gNewSense
4. Gobuntu
5. Goobuntu
6. Jolicloud
7. Kubuntu
1. Kubuntu Netbook Remix
2. Linux Educacional 3.0

8. Linux Mint
9. Ubuntu Netbook Remix
10. Ubuntu Studio
11. Ultimate Edition
12. Xubuntu
13. ZeVenOS

14. Xandros

•Foresight Linux
•Gentoo
1. Guaranix
2. Librix
3. Litrix Linux
4. Sabayon Linux
5. Tutoo
•GoboLinux
•Linux From Scratch
•Neo Dizinha
•OpenSuSE
•Puppy Linux
•Red Hat Linux
1. Caixa Mágica
2. CentOS
3. Fedora
1. Ekaaty
2. Insigne GNU Linux - versão 3
3. Libertas
4. Muriqui
5. Vixta

4. Mandriva
1. PCLinuxOS

5. Yellow Dog Linux

•Resulinux
•Slackware
1. GoblinX
2. Slax
3. Vector Linux

Distribuições LiveCD
As distribuições em LiveCD rodam direto do cd-rom.
•ALT Linux
•Arch Linux
•Arco-Debian Linux
•Big Linux
•Caixa Mágica LiveCD
•CentOS
•CLive (baseada em Conectiva Linux)
•Damn Small Linux
•Dizinha Linux (baseada no Kurumin)
•Dreamlinux
•Famelix (Baseada em Debian e Knoppix) Ambiente similar ao Windows
XP/Vista
•Fedora
•Fenix Linux
•Gentoo
•GoblinX
•Gnoppix (baseada em Knoppix)
•Incognito
•Insigne GNU Linux (baseada em Debian/Fedora)
•Litrix Linux
•Linux Mint
•Linux Educacional 3.0
•Linius (Basado em caixa mágica)
•Kya Linux (baseada em Slackware Linux)
•Kalango Linux (baseada no Kurumin)
•Kanotix (baseada em Knoppix)
•KeeP-OS
•Knoppix (baseada em Debian Linux)
•Kubuntu
•Kurumin (baseada em Knoppix)
•Kurumin Games (Baseada no Kurumin)
•NUbuntu
•LinuxFX
•Mandriva
•Mepis
•Moblin
•Morphix
•Neo Dizinha
•NimbleX
•openSUSE
•Paipix
•PCLinuxOS
•PHLAK (Baseado no Morphix)
•Poseidon Linux (baseada no Ubuntu) (live-DVD)
•Puppy Linux
•Quantix
•Resulinux
•Sabayon Linux
•Sacix
•Satux (Baseada em Debian )
•Slax (baseada em Slackware Linux)
•Super OS
•Tatui x
•Ubuntu (baseada em Debian Linux)
•Vixta (projeto baseado no Fedora com aparencia do Windows Vista)
•Yoper

Distribuições de propósito especial


•andLinux , versão do Ubuntu que roda integrada ao Windows junto com o
Explorer.
•Ångström - Desenvolvida para o console portatil Pandora.
•Android - Sistema operacional voltada para smartphones, desenvolvida pela
Google.
•Arm-Linux
•BackTrack (Fusão do Whax com Auditor Security Collection)
•Bootable Business Card
•BrazilFW
•Coyote Linux
•Cytrun Linux
•Dyne:Bolic
•Edubuntu
•Embedded Debian
•Endian Firewall
•EOS Enhanced Operating System - Desenvolvida para automatizar instalação
de produtos.
•F.I.R.E
•FREESCO
•GeexBox
•Indymix
•IPCop
•Linux Educacional - Voltados para uso de professores, gestores e alunos da
rede pública de ensino brasileira.
•Live Android - É um projeto que visa a utilização do sistema Android para
PC's.
•Mikrotik
•Musix
•Mythbuntu
•Openfiler
•Pentoo
•Portable Ubuntu for Windows - Outra versão do Ubuntu que roda integrada ao
Windows junto com o Explorer.
•Progeny Debian
•Sentry Firewall
•Skolelinux
•Sysresccd - Distro com ferramentas essenciais para manutenção em geral
•Terabeauts - Distro em disquete destinada a criação e manutenção de
sistemas de arquivos
•The Linux Router Project
•Tupiserver
•Ubuntu Studio
•UcLinux

Desktops
Desktop padrão KDE 4.3
Desktop Gnome 2.20
Desktop do Xfce - GoblinX
O sistema operacional Linux possui dois tipos
de interfaces para que o usuário possa interagir
com o sistema operacional. As
interfaces gráficas e a interface de linha de
comando.
As interfaces gráficas foram desenvolvidas
inicialmente por Douglas C. Engelbart e também
chamadas de ambientes gráficos, Desktop's ou
GUI(Graphical User Interfaces). Alguns
exemplos para o Linux são:
•Kde
•Gnome
•LXDE
•Xfce
•Fluxbox
•Blanes
•Blackbox
•Windowmaker
•Afterstep
•Enlightenment
•IceWM
•FVWM
•Kahakai
•ZappWM
•dwm
•SithWM
•Whim
•Karmen
•Sawfish
•XIGE
•Framer
•Mavosxwm
•WindowLab
•OpenBox
•xmonad

Desktops 3D
Os desktops 3D, são na verdade, Plugins para adicionar efeitos incríveis às
outras interfaces:
•AIGLX/Beryl
•XGL/Compiz
•Compiz Fusion160
•Metisse
•KWin gerenciador de janelas do KDE com efeitos nativos.

Sistemas móveis (Mobile)


•Motomagx - sistema especialmente desenvolvido para celulares Motorola
•LinuxMod - sistema baseado no Motomagx

Interpretadores de comandos
Usando o Bash - Framebuffer
Representando a interface de acesso no
modo texto, ou CLI(Command Line
Interface) do Linux, eles são a principal forma de
controle remoto e gerenciamento do
sistema.Exemplos de interfaces de linha
comando, também chamados de Shell's ou
interpretadores de comandos:
•sh
•ksh
•pdksh
•bash
•csh
•tcsh
•zsh
160Os programas Beryl e Compiz se uniram e deram origem ao programa Compiz Fusion.
•ash
•dash
•rc
•rsh
•ssh
•screen
(*) O screen é um gerenciador de sessões em modo texto

Você também pode gostar