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.
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.
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:
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.
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)
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.
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.
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.
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.
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
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).
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?].
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.
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.
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
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.
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
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.
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
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
UNIX
Diagrama da relação de família de predecessor/sucessor para os sistemas tipo unix.
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
Modelos de Núcleo
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
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
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.
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
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.
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
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
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)
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;
•Campos de nome struct num espaço de nome separado para cada tipo struct;
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()
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
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 */
return 0;
}
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");
}
int main(void)
{
printf("Olá, Mundo!\n");
return 0; /* Retorna 0, pois main retorna um int */
} /* Nova linha após fechar a chave principal */
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;
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
return 0;
}
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
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.
Outras publicações:
•Structured Computer Organization
•Distributed Systems: Principles and Paradigms
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).
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
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'."
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.
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.
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.
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
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)
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
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.
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.
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
Linux (núcleo)
Linux
Mascote
Linux
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:
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
Versões iniciais
Versões estáveis
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
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.
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
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.
Dicas úteis
ou
mkdir -p docs/{img/{fotos,icons,wallpapers,svg},textos/{artigos,man},tmp}
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
Referências
•Foca GNU/Linux
•UNIX ON-LINE Man Pages
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
•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
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.
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