Por que “Everything is a file” é exclusivo dos sistemas operacionais Unix?


70

Costumo ouvir pessoas dizerem "A filosofia única do Unix é que ele trata tudo como um arquivo" ou "No Unix, tudo é um arquivo". Mas nunca ouvi ninguém explicar por que ele é único no Unix.

Então, por que isso é exclusivo do Unix? Outros sistemas operacionais, como Windows e Macs, não operam em arquivos?

E é único se comparado a outros sistemas operacionais?


26
Nota: o macosx roda no topo de um unix.
akira

2
fwiw, enquanto coisas de nível superior não usam arquivos (como dbus ou X in * nix), o Windows de baixo nível é construído com alças. Você pode fazer o mesmo com eles, como arquivos no * nix (abrir, fechar, controlar e geralmente enviar / receber), mas você precisa ser um programador para ver essa interface. Se isso é uma coisa boa, é uma questão de preferência.
Mark

11
tudo é um arquivo, exceto interfaces de rede.
Alvin #

8
@akira - OSX é certificado Unix e não roda "em cima dele".
Rob

11
@akira Não está no topo de um Unix. OSX é um dos poucos SO UNIX certificado.
Let_Me_Be

Respostas:


53

Então, por que isso é exclusivo do Unix?

Os sistemas operacionais típicos, anteriores ao Unix, tratavam os arquivos de uma maneira e tratavam cada dispositivo periférico de acordo com as características desse dispositivo. Ou seja, se a saída de um programa foi gravada em um arquivo em disco, esse foi o único local em que a saída poderia ir; você não pode enviá-lo para a impressora ou a unidade de fita. Cada programa precisava estar ciente de cada dispositivo usado para entrada e saída e ter opções de comando para lidar com dispositivos de E / S alternativos.

O Unix trata todos os dispositivos como arquivos, mas com atributos especiais. Para simplificar os programas, entrada e saída padrão são os dispositivos de entrada e saída padrão de um programa. Portanto, a saída do programa normalmente destinada à tela do console pode ir a qualquer lugar, para um arquivo de disco, impressora ou porta serial. Isso é chamado de I / O redirecionamento .

Outros sistemas operacionais, como Windows e Macs, não operam em arquivos?

É claro que todos os sistemas operacionais modernos suportam vários sistemas de arquivos e podem "operar em arquivos", mas a distinção é como os dispositivos são manipulados? Não conhece o Mac, mas o Windows oferece algum redirecionamento de E / S.

E, comparado a quais outros sistemas operacionais são únicos?

Realmente não mais. Linux tem o mesmo recurso. Obviamente, se um SO adota o redirecionamento de E / S, ele tende a usar outros recursos do Unix e acaba como o Unix no final.


29
O OS X é basicamente o Unix, então não há muita diferença.
Slhck #

6
um pouco mais em tudo o que é um modelo de arquivo.
Artisex #

11
O parágrafo de abertura simplesmente não é verdadeiro. Havia sistemas operacionais antes do Unix, e eles tinham recursos mais tarde encontrados no Unix, incluindo redirecionamento de E / S.
Patrick Seymour

3
Plan 9 tem o mesmo conceito Tudo é um conceito de arquivo e foi mesmo chamado de "mais unix, em seguida, unix"
William

2
O Windows (desde o NT) vai um pouco mais longe. Existem muitos dispositivos que se comportam como arquivos, como portas seriais e pipes nomeados. Você pode escrever para todos usando WriteFile. Além disso, há uma categoria ainda maior de "objetos de sincronização" que inclui não apenas arquivos, mas também mutexes.
precisa saber é o seguinte

34

A idéia de que "tudo é um arquivo" veio da Multics. Os designers do Unix basearam muito do seu trabalho em antecessores, especialmente no Multics. De fato, muitas coisas na computação são baseadas em antecessores.

Você pode ler o trabalho do falecido Dennis Ritchie no design do Unix para obter mais. Ele referenciou coisas que eles "copiaram" do Multics, como o sistema de arquivos em forma de árvore, o shell de comando e a não estruturação de arquivos. Não estou sugerindo que o pessoal do Unix roubou o pessoal do Multics. Para todos os efeitos, eram as mesmas pessoas.


6
essa não deve ser a resposta mais votada, ela não responde à pergunta, apenas pede às pessoas que façam outra pergunta: "Por que 'Tudo é um arquivo' no Multics?"
Lie Ryan

13
@LieRyan: Na verdade, ele responde à pergunta por que é único : não é.
Goran Jovic

11
O pessoal do Unix apenas levou suas idéias quando o projeto Multics foi interrompido e o renomeou. Unix sendo apenas um jogo de palavras - um VS muitos.
Fiasco Labs

2
@ Ryan Ryan - A questão não era por que tudo é um arquivo, é por que é único. Como Goran e eu apontamos, não é.
Patrick Seymour

11
A questão realmente se refere ao "sistema operacional Unix s ", ou seja, à família. Essa família inclui razoavelmente Multics e Linux.
precisa saber é o seguinte

28

Único? Não. Definindo? Absolutamente.

Ter tudo como arquivo ou dispositivo em uma hierarquia conhecida significa que você pode usar o mesmo conjunto de ferramentas para tudo. O plano 9 do Bell Labs leva isso adiante, inclusive com dispositivos de hardware como arquivos.

Mais importante, isso permite dois conceitos muito simples e poderosos. Utilitários básicos que executam o One Thing Well (tm), que podem ser amarrados com tubos conforme necessário. Deseja encontrar algo em um arquivo de texto? Use catpara mostrar, passar grepe você está cozinhando com gás. Esse é o verdadeiro poder da maneira 'Unix' - aplicativos especializados trabalhando juntos para uma enorme quantidade de flexibilidade.

O Mac OS X também segue a filosofia do Unix, mas é melhor oculto (um pacote de 'aplicativos' é realmente um diretório cheio de arquivos) e, de fato, é um Unix certificado e adequado, descendente do NeXT , que utilizava bits do FreeBSD .

Com o Windows, existem alguns componentes binários, como o visualizador de eventos e o registro, e existem algumas vantagens de velocidade nesse cenário específico.


11
Mais 1 por mencionar o plano 9. O IMHO Fuse aproxima o plano 9 de uma implementação por meio de ad-hoc e iteração.
Danny Staple

2
Bem, o plano 9 é o plano 9, já funciona. O fusível apenas permite a expansão do sistema de arquivos no espaço do usuário de .. maneiras interessantes. Eu gosto daquele em que o IRC é tratado como um FS.
Journeyman Geek

Hmm - você sabe, eu tenho procurado pesquisá-lo há séculos desde que descobri através de um livro de Eric Raymond anos atrás ... Você finalmente me deixou com a corcunda de "contornar isso", baixei o ISO e testá-lo.
Danny Staple

2
Eu acredito que há uma versão mais nova também, chamada inferno
Journeyman Geek

11
+1 por notar que o Darwin do OS X também é um 'Unix real'.
Calum_b 4/11/11

18

Por causa dos arquivos especiais. Quando as pessoas dizem "tudo é um arquivo no Unix", arquivos e diretórios comuns não são o que eles têm em mente. Arquivos especiais são exclusivos para sistemas operacionais semelhantes ao Unix, dos quais existem muitos. Portanto, não é exclusivo do Unix.

Arquivos especiais servem a muitos propósitos. Existem, por exemplo, canos, soquetes e, principalmente, arquivos de dispositivos. Tubos e soquetes são fluxos de comunicação entre processos. Grande parte da funcionalidade dos subsistemas é disponibilizada ao espaço do usuário por meio de arquivos do dispositivo.

Tubos e soquetes

Os programas os usam da mesma maneira que usariam arquivos comuns. De fato, na maioria das vezes eles nem se importam com o tipo de arquivo que usam. É por isso que os comandos do Unix podem ser combinados de maneira tão múltipla para formar novos sistemas poderosos. (Veja o redirecionamento de E / S na resposta da serragem)

Arquivos de dispositivo

Como mencionado anteriormente, eles funcionam como interfaces para o espaço do usuário. Por exemplo, para ejetar a bandeja do CD, um programador abriria primeiro o arquivo do dispositivo correspondente. Outro exemplo: você deseja que seu programa mude o terminal virtual. Abra o / dev / console primeiro.

O que acontece a seguir não está enviando meros caracteres para esses arquivos, mas a emissão de ioctl () 's sobre eles. Os ioctl individuais que você pode emitir dependem do dispositivo. Por exemplo, o console está documentado em console_ioctl (4)


12

Provavelmente, vou me entusiasmar por dizer isso, mas acho que dizer que tudo é um arquivo no Unix é de fato uma falácia. O que é realmente é duas coisas.

  1. Arquivos e dispositivos (e muitas outras coisas) são objetos que podem ser modelados por uma interface que compreende funções de abrir, fechar, ler, gravar e controlar (ioctl).
  2. O espaço para nome desses objetos é hierárquico, ou seja, esses objetos são organizados em uma hierarquia.

Um sistema de arquivos implementa esse espaço para nome e implementa a estrutura que permite o envio de funções da interface para esses objetos. Um sistema de arquivos foi conceitualizado para abrigar arquivos, mas foi cooptado para organizar outros objetos na hierarquia de namespace. Um exemplo de polimorfismo anterior à orientação a objetos era uma coisa.

Não há mal em apenas chamar todos os arquivos. Mas, na realidade, são esses objetos mais genéricos (um arquivo é um desses objetos). Nessa perspectiva, essa ideia não é exclusiva do Unix. Muitos outros sistemas operacionais implementam essas hierarquias de objetos polimórficos.


Exatamente! No Unix, tudo é um descritor de arquivo (não necessariamente um arquivo!), Ou seja, tudo (exceto memória) é E / S, inclusive arquivos. Os arquivos devem ser acessados ​​como se fossem fluxos de E / S (embora eles possam ser procurados, tão acessíveis aleatoriamente, mas que o custo extremo de chamadas extras do sistema). (com exceção do que pouco pode ser feito com mmap(), naturalmente ....)
Greg A. Woods,

9

Quando as pessoas dizem "No Unix, tudo é um arquivo", o que elas querem dizer é que também coisas que não são arquivos são tratadas como arquivos.

Obviamente, a maioria dos sistemas operacionais trabalha com arquivos. Arquivos de texto, arquivos de imagem, arquivos de som. Mas nem todos os sistemas operacionais tratam os dispositivos como arquivos. Essa é uma diferença importante. Se eu listar o conteúdo da minha pasta / dev / no meu sistema operacional Ubuntu (que é baseado em Unix), receberei uma lista de mais de 200 dispositivos. Alguns desses dispositivos são de hardware, mas são mostrados dentro de uma pasta. Por exemplo, discos rígidos, portas USB, mouse e teclado, dispositivos de áudio e impressoras, entre outros. Alguns dos dispositivos são virtuais, por exemplo / dev / urandom, que se comporta como um arquivo infinito cheio de números aleatórios. Não é um arquivo real no meu disco rígido.

Todos esses dispositivos são tratados como arquivos. Posso ler dados e / ou gravar dados nesses dispositivos. Aqui há exemplos de cópia de dados de diferentes dispositivos no dispositivo de áudio. Isso é possível porque eles são tratados como arquivos. O resultado (nerd) é a capacidade de ouvir o conteúdo do disco rígido, o movimento do mouse, a memória do computador ou os pixels de uma imagem. Isso seria muito mais difícil de conseguir se os dispositivos não fossem tratados como arquivos, porque cada dispositivo exigiria métodos diferentes para ler e gravar dados.

Dito isto, o que "tudo" significa varia de sistema para sistema. Por exemplo, o OS X é baseado no Unix, mas não possui um dispositivo / dev / audio. Ele usa um sistema de áudio proprietário chamado CoreAudio. Portanto, neste caso, pode-se dizer "quase tudo é um arquivo". Então, em sistemas como o Windows, onde "nem tudo é um arquivo", você ainda pode fazer coisas como copiar o conteúdo de um arquivo para a porta da impressora (digitando algo como copy mydocument.txt >lpt1:), que é semelhante a copiar um documento para o dispositivo da impressora no Unix sistemas.

Outros sistemas operacionais, como Windows e OS X, não operam em arquivos? Sim, eles fazem. O Windows e o OS X operam em arquivos, mas o Windows não trata os dispositivos como arquivos, o que faz parte do que significa "tudo é um arquivo".


8

Eu vejo Multics citado como a fonte de "tudo é um arquivo", mas acho que você precisa parecer um pouco mais profundo do que apenas arquivos de dispositivos, pipes nomeados, arquivos regulares, etc. etc. Isso faz uma grande diferença mesmo quando existem "nomes de arquivos mágicos" AUX, CON e LP.

Veja " O nome hediondo " de Rob Pike. Ele compara a sintaxe de nomeação de arquivos do Unix com algumas outras sintaxes, principalmente o VMS. Observe que os sistemas operacionais de mainframe do final dos anos 60 / início dos anos 70, quando o Unix se originou, tinham o que a mente moderna consideraria extraordinariamente sintaxe de nomeação de arquivos rococó. Faz anos desde que eu usei VM / CMS, ou NOS ou NOS / VE, e só olhei por cima de alguém usando um sistema operacional Univac, mas basta dizer que as peculiaridades superam as regularidades.

Eu nunca vi o Multics rodar, mas você pode ver um artigo em seu sistema de arquivos . Parece que o Unix original levou o "tudo é um arquivo" um pouco mais longe do que Multics, mas sua milhagem pode variar.


11
Bem, no Multics tudo é memória, exceto E / S (embora isso também possa ser mapeado na memória). No Unix, tudo (exceto a memória) é um descritor de arquivos , incluindo arquivos. Ou seja, no Unix tudo é E / S.
Greg A. Woods,

11
Agora, existe um emulador que inicializa e executa o Multics.
Greg A. Woods,

3

Observe que mesmo Linus Torvalds discorda de que "tudo é um arquivo". Se você procurar por "

tudo é um bytestream

"você encontrará filosofias interessantes como queremos dizer que nem tudo é um arquivo, por exemplo, uma estrutura de dados abstrata na memória ou um ponteiro certamente não é um arquivo. OK, com certeza qualquer coisa pode ser representada como um arquivo, mas representar e ser são duas ações diferentes .


11
Você não forneceu um link. Em algumas pesquisas, encontrei yarchive.net/comp/linux/everything_is_file.html , citando as respostas de Torvald em um tópico de email, no qual ele afirma implicitamente que o modelo deveria ser "tudo é um arquivo".
precisa saber é o seguinte

11
Na verdade @bgvaughan é o oposto: yarchive.net/comp/linux/everything_is_file.html dá a citaçãoThe UNIX philosophy is often quoted as "everything is a file", but that really means "everything is a stream of bytes".
Pouco antiga Floresta Kami

11
@LIttleAncientForestKami: e Unix tradicionalmente tratam arquivos como simplesmente fluxos de bytes, em oposição a sistemas que tratavam arquivos como fluxos de registros (ou tinham ambos os fluxos de bytes e fluxos de registros), como coleções de fluxos (ou garfos de recursos) ou tinham modelos mais complexos, onde havia várias maneiras diferentes de acessar vários tipos diferentes de objetos.
Ninjalj # 25/17
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.