# Diferenças técnicas entre o Plan 9 e UNIX Eu venho estudado o kernel do Plan 9 e comparando com as implementações de UNIX que temos hoje, e muitas das coisas que eu comento pela internet sobre o Plan 9 são mal interpretadas ou rotuladas como "lentas" ou contraditórias e que precisam funcionar por outro caminho. Eu fui a fundo entender essa diferença de comunicação que estamos tendo e pretendo remover esses mal-entendidos com esse post. ## "Plan 9 tem comunicação baseada em arquivo e, portanto, é lento" Apesar dos syscalls de arquivo serem semelhantes, o comportamento desses syscalls divergem bastante conforme a complexidade aumenta. Se você estiver operando um arquivo, tanto o Plan 9 quanto o UNIX vão triggar uma mudança de privilégio, que então o número do file descriptor é usado pra selecionar uma entry de um lista de virtual table que contém as operações corretas para o driver que lida com o arquivo aberto. Até aqui, não há trocas de contexto e os dois operam mais ou menos na mesma forma. A diferença é que o UNIX abandonou completamente a ideia de tudo ser um arquivo e, como o Rob Pike disse uma vez: "é tudo um arquivo, mas alguns arquivos são mais iguais que outros". Se você quiser desenhar algo na tela de um UNIX, você não faz um `write(2)` para o kernel, você é obrigado a se comunicar via IPC ou tornar o processo mais acoplado com o *driver* do sistema operacional através de shared memory. O Plan 9, por outro lado, leva isso até as ultimas consequências e de forma mais enxuta. Os drivers dos file descriptors ficam mapeados no processo, o que reduz a quantidade de trocas de contexto, e o driver lida diretamente com o buffer passado pelo programa. Um exemplo mais voltado para o gráfico como citado anteriormente, o driver `draw(3)` fica mapeado junto com o kernel, que então lida diretamente com os comandos enviados pelo programa, que realiza as operações e devolve o programa para o modo de usuário, sem realizar uma troca de contexto. Vale ressaltar que sim, operações de I/O no Plan 9 podem causar uma troca de contexto a depender do driver, então operações em rede ou sistemas de arquivo montados em 9p ou usando o `pipe(3)` geralmente triggam uma troca de contexto. A diferença é que o Plan 9 simplificou a operação e tornou I/O mais leve. [Esse documento](https://ondoc.logand.com/d/5736/pdf) descreve melhor as decisões de arquitetura do Plan 9, com as vantagens e desvantagens. ## "Plan 9 é confuso" O Plan 9 é confuso porque ainda temos a mentalidade de como um computador funciona pelo UNIX. O Plan 9 separa o sistema operacional em 3 grandes "servers": CPU server, File server e Auth server; e esses 3 têm suas configurações feitas de forma isolada, então toda instalação de um Plan 9 "standalone" é uma composição de 3 ambientes diferentes, que significa que são 3 configurações diferentes no mesmo sistema. Ou então você pode fazer 3 configurações em 3 sistemas diferentes (inclusive sendo sistemas operacionais diferentes), que foi para o quê o Plan 9 foi feito. E também muitas das coisas que temos por garantido dos UNIXes modernos são feitas de forma diferente, e como eu costumo dizer no IRC da bolha dev, o Plan 9 tem uma tendência a transformar código em infraestrutura. Um exemplo que eu posso dar é sobre o `audio/mixfs` do 9front, que é o equivalente ao `pulseaudio` ou `pipewire` do linux. O audio do Plan 9 funciona ao escrever e ler no `/dev/audio` do sistema, como nos antigos UNIXes, e esse `/dev/audio` é oferecido pelo dispositivo de sistema chamado `#A`, e como nos antigos UNIXes ele tem o problema de só um poder usar ele, etc. O `audio/mixfs` oferece um file system por 9p que tem a mesma estrutura do `#A`, que então é bindado no `/dev` do namespace e então todo software desse namespace vai rodar através do contexto do mixer e não no contexto do kernel, permitindo mixagem de audio. Com esse exemplo, fica claro como que as coisas acabam funcionando no Plan 9: é tudo sobre uma composição de namespaces, você monta o ambiente adequado que você quer que o processo rode e então roda o processo. ## "Plan 9 é inseguro" De fato o Plan 9 tem algumas coisas que estão atrasadas pois se trata de um sistema operacional de pesquisa de 3 décadas atrás, então você não vai encontrar criptografias mais recentes, como o ed25519, e também VPNs do mercado como o wireguard ou openvpn. Porém o modelo de segurança do Plan 9 não é baseado em modelo de segurança ativa, como um firewall, mas de forma mais passiva, "se um software não precisa ou não pode ver tais coisas, ele simplesmente não vê isso". Isso dá através de namespaces e, no caso do 9front, também por mecanismos parecidos com o `pledge(2)` do OpenBSD em nível de namespace, o `chdev(1)` e comunicações com o `#c/drivers`. ## Conclusão Com isso, eu acredito que algumas coisas fiquem mais claras. O Plan 9 tem um modelo de arquivo, mas a implementação desse modelo é mais enxuta e simples, permitindo uma maior performance, segurança e flexibilidade. No máximo, o Plan 9 é um sistema operacional de uso geral mas incompleto e com umas falhas devido ao tempo que foi deixado de lado, o que é triste mas interessante para explorar devido a sua codebase ser menor e mais simples, pode-se considerar como um grande uncharted territory assim como vários outros modelos que foram deixado de lados com o passar do tempo.