Compreendendo os níveis de computação

9

Desculpe, pela minha pergunta confusa. Estou procurando algumas dicas.

Até agora, tenho trabalhado principalmente com Java e Python na camada de aplicativos e tenho apenas uma vaga compreensão de sistemas operacionais e hardware. Eu quero entender muito mais sobre os níveis mais baixos da computação, mas fica realmente impressionante de alguma forma. Na universidade, participei de uma aula sobre microprogramação, ou seja, como os processadores se conectam para implementar os códigos ASM. Até agora, eu sempre pensei que não faria mais se aprendesse mais sobre o "nível baixo".

Uma pergunta que tenho é: como é possível que o hardware oculte quase completamente do desenvolvedor? É preciso dizer que o sistema operacional é uma camada de software para o hardware? Um pequeno exemplo: na programação, nunca me deparei com a necessidade de entender o que é o cache L2 ou L3. Para o ambiente típico de aplicativos de negócios, quase nunca é preciso entender o montador e os níveis mais baixos da computação, porque hoje em dia existe uma pilha de tecnologias para quase tudo. Eu acho que o objetivo desses níveis mais baixos é fornecer uma interface para níveis mais altos. Por outro lado, me pergunto quanta influência os níveis mais baixos podem ter, por exemplo, toda essa coisa de computação gráfica.

Por outro lado, existe esse ramo teórico da ciência da computação, que trabalha em modelos abstratos de computação. No entanto, também raramente encontrei situações em que achei útil pensar nas categorias de modelos de complexidade, verificação de provas etc. Eu meio que sei que existe uma classe de complexidade chamada NP e que é meio impossível de resolver. um grande número de N. O que estou perdendo é uma referência para uma estrutura para pensar sobre essas coisas. Parece-me que existem todos os tipos de campos diferentes, que raramente interagem.

Nas últimas semanas, tenho lido sobre problemas de segurança. Aqui, de alguma forma, muitas das diferentes camadas se juntam. Ataques e explorações quase sempre ocorrem no nível inferior; portanto, neste caso, é necessário aprender sobre os detalhes das camadas OSI, o funcionamento interno de um sistema operacional, etc.

RParadox
fonte
11
Há uma grande resposta a este (o primeiro à pergunta) programmers.stackexchange.com/questions/81624/...
Puckl
Ataques e explorações podem acontecer em todos os níveis. Se eu escrever um script PHP vulnerável, ele poderá ser explorado independentemente do sistema operacional subjacente, quanto mais do hardware.
tdammers
11
Encontrei um ótimo livro sobre o tema: os elementos dos sistemas de computação: construindo um computador moderno a partir dos primeiros princípios Noam Nisan, Shimon Schocken. Uma palestra do Sr. Schocken sobre essa abordagem: youtube.com/watch?v=IlPj5Rg1y2w&feature=plcp
RParadox 12/12
Nos dias de hoje, usar a linguagem assembly para rotinas de gráficos VGA era a única maneira de obter desempenho, mas suponho que não sabia o que estava fazendo! Mas, nos últimos dez anos ou mais da minha carreira, não tive que olhar nada tão baixo. E agora sou principalmente ignorante do que acontece nesses níveis. Raramente eu preciso alocar ou limpar minha própria memória. Eu suspeito que muitos na minha equipe não sabem o que é uma pilha! De muitas maneiras, não é produtivo codificar em tal nível, reinventando a roda, por assim dizer. Em vez disso, estamos nos ombros de gigantes.
Gavin Howden

Respostas:

19

A palavra-chave para pensar sobre essas coisas é abstração .

Abstração significa apenas ignorar deliberadamente os detalhes de um sistema para que você possa pensar nele como um componente único e indivisível ao montar um sistema maior a partir de muitos subsistemas. É inimaginavelmente poderosa - escrevendo um programa de aplicação moderna ao mesmo tempo considerando os detalhes de alocação de memória e registrar derramar e tempos de execução transistor seria possível, de alguma forma idealizada, mas incomparavelmente mais fácil é nãopensar sobre eles e usar apenas operações de alto nível. O paradigma da computação moderna depende crucialmente de vários níveis de abstração: eletrônica de estado sólido, microprogramação, instruções de máquina, linguagens de programação de alto nível, APIs de programação de SO e Web, estruturas e aplicativos programáveis ​​pelo usuário. Virtualmente, ninguém poderia compreender todo o sistema hoje em dia, e nem existe um caminho concebível pelo qual possamos voltar a esse estado de coisas.

O outro lado da abstração é a perda de poder. Ao deixar as decisões sobre os detalhes em níveis mais baixos, geralmente aceitamos que elas sejam tomadas com eficiência abaixo do ideal, uma vez que os níveis mais baixos não têm o 'Big Picture' e podem otimizar seu funcionamento apenas pelo conhecimento local e não são (potencialmente) inteligente como ser humano. (Geralmente. Por exemplo, hoje em dia, compilar HLL em código de máquina costuma ser melhor feito por máquinas do que pelo ser humano mais experiente, já que a arquitetura do processador se tornou muito complicada.)

A questão da segurança é interessante, porque falhas e 'vazamentos' na abstração geralmente podem ser exploradas para violar a integridade de um sistema. Quando uma API postula que você pode chamar os métodos A, B e C, mas apenas se a condição X for mantida, é fácil esquecer a condição e não estar preparado para a precipitação que ocorre quando a condição é violada. Por exemplo, o estouro clássico de buffer explora o fato de que gravar nas células da memória gera um comportamento indefinido, a menos que você tenha alocado esse bloco específico de memória. A API garante apenas que algocomo resultado, mas, na prática, o resultado é definido pelos detalhes do sistema no próximo nível inferior - do qual esquecemos deliberadamente! Desde que cumpramos a condição, isso não tem importância, mas, se não, um invasor que entenda os dois níveis intimamente pode normalmente direcionar o comportamento de todo o sistema conforme desejado e fazer com que coisas ruins aconteçam.

O caso dos erros de alocação de memória é particularmente ruim, porque acabou sendo muito, muito difícil gerenciar a memória manualmente sem um único erro em um sistema grande. Isso pode ser visto como um caso de abstração com falha: embora seja possível fazer tudo o que você precisa com o CmallocAPI, é simplesmente fácil de abusar. Agora, partes da comunidade de programação pensam que este era o lugar errado para introduzir um limite de nível no sistema e, ao invés disso, promover linguagens com gerenciamento automático de memória e coleta de lixo, que perde um pouco de energia, mas fornece proteção contra corrupção de memória e comportamento indefinido . De fato, uma das principais razões para o uso do C ++ atualmente é justamente o fato de permitir controlar exatamente quais recursos são adquiridos e liberados quando. Dessa maneira, o grande cisma entre as línguas gerenciadas e as não gerenciadas atualmente pode ser visto como um desacordo sobre onde definir com precisão uma camada de abstração.

O mesmo pode ser dito de muitos outros paradigmas alternativos importantes na computação - a questão realmente surge o tempo todo em que grandes sistemas precisam ser construídos, porque somos simplesmente incapazes de projetar soluções do zero para os requisitos complexos comuns hoje em dia. (Um ponto de vista comum no AI nos dias de hoje é que o cérebro humano realmente faz o trabalho assim - comportamento decorrente através de loops de feedback, redes maciçamente interligados etc., em vez de módulos separados e camadas com simples, interfaces abstratas entre eles, e que é por isso que tiveram tão pouco sucesso em simular nossa própria inteligência.)

Kilian Foth
fonte
11
Ótimo, obrigado. Portanto, o exemplo de coleta de lixo / gerenciamento de memória é provavelmente o exemplo mais conhecido dessa interação. Neil Gershenfeld escreveu algumas coisas interessantes, embora eu compreenda apenas partes dela.
RParadox 12/12/12
... Muito bom ponto sobre a complexidade. Se apenas máquinas podem projetar nossas máquinas, aonde isso leva? Se as pessoas da IA ​​estão falando sobre criar IAs mais inteligentes, estamos quase lá, talvez. ;)
RParadox