7 pontos por GN⁺ 2023-08-14 | 1 comentários | Compartilhar no WhatsApp
  • You’re the OS é um jogo em que o jogador assume o papel de um sistema operacional, gerenciando núcleos de CPU, processos, páginas de memória e espaço de swap, além de impedir que o usuário reinicie o sistema
  • O fluxo básico consiste em atribuir processos ociosos à CPU e remover processos ativos; processos deixados de lado por muito tempo passam por estágios de starvation até serem encerrados
  • Com o passar do tempo, o número de processos e a pressão sobre a memória aumentam, e é preciso lidar diretamente até com memory swapping, trazendo de volta para a RAM páginas que estão no disco
  • A implementação é baseada em Python/Pygame, com um build WebAssembly criado com pygbag para que também possa rodar no navegador
  • Não é uma simulação precisa de um sistema operacional, mas, deixando clara essa premissa, pode ser usado para explicar escalonamento de processos e situações de falta de RAM

A ideia de um jogo em que você é o sistema operacional

  • O jogo parte da ideia de que o jogador se torna o sistema operacional e gerencia núcleos de CPU, processos, páginas de memória e espaço de swap
  • O objetivo é alocar tempo de CPU aos processos para que o usuário não sinta que o sistema está lento demais e, quando necessário, fazer swap de páginas de memória
  • Para um jogo 2D simples, a escolha foi usar Pygame em vez de um motor de jogo completo
    • A vontade de voltar a usar Python também foi um dos motivos da escolha
    • O Pygame pode ser compilado para WebAssembly via pygbag, o que é vantajoso para rodar no navegador
  • O período de desenvolvimento foi de algumas semanas espalhadas ao longo de 8 meses

Escalonamento de processos e condição de fim de jogo

  • A interação central do jogo é o gerenciamento de processos e CPU
    • Ao clicar em um processo ocioso, ele é atribuído a uma CPU disponível
    • Ao clicar em um processo ativo, ele é removido daquela CPU
  • Processos ociosos passam, com o tempo, por 6 níveis de starvation, indicados por cores e emojis
    • Se ficarem tempo demais no último estágio, o usuário encerra aquele processo
    • Quando 10 processos são encerrados, o usuário reinicia o jogador, que é o sistema operacional, e o jogo termina
  • Para sobreviver por mais tempo, cada processo precisa receber tempo de CPU suficiente antes de atravessar todos os estágios de starvation

I/O e memory swapping

  • Processos ativos podem ficar em estado blocked enquanto aguardam eventos de I/O
    • Como processos blocked desperdiçam tempo de CPU, é melhor removê-los da CPU
    • Eventos de I/O são tratados clicando em um botão cuja aparência muda quando o evento ocorre
  • Com o passar do tempo, mais processos aparecem, aumentando a dificuldade
  • A partir de certo ponto, a memória usada por todos os processos passa a ser maior que a RAM, exigindo swap de páginas entre RAM e disco
    • Quando um processo ativo tenta acessar uma página que está no disco, o processo e a página correspondente piscam
    • Ao ver essa indicação, é preciso fazer swap da página necessária
  • Um processo que aguarda uma página no disco permanece em estado blocked até que essa página volte para a RAM
    • Se o estado blocked durar tempo demais, ele pode continuar avançando pelos estágios de starvation e acabar sendo encerrado

Dificuldade e configurações personalizadas

  • O jogo tem vários níveis de dificuldade
  • A dificuldade afeta o número de CPUs, a capacidade da RAM, a quantidade de processos existentes no início, a probabilidade de eventos de I/O e outros fatores
  • No modo personalizado, essas configurações podem ser ajustadas de forma independente

Valor educacional e limitações

  • Este jogo é, antes de tudo, um jogo, e foi projetado priorizando a jogabilidade em vez do realismo
  • Há partes que não retratam com precisão um sistema operacional real
    • Não se espera que o jogador reaja tão rápido quanto um computador real
    • Os processos usam muito menos páginas de memória do que processos comuns reais
    • A estrutura em que o usuário continua executando novos processos infinitamente é uma mecânica de jogo para aumentar a dificuldade
  • Embora não tenha sido criado com fins educacionais, ele pode ter valor para apresentar princípios de sistemas operacionais, desde que fique claro que não é uma representação precisa
    • Pode ser usado como exemplo para explicar escalonamento de processos e memory swapping
    • Pode mostrar o que significa ter mais núcleos de CPU e o que acontece quando falta RAM

Compilação para WebAssembly e distribuição

  • A compilação para WebAssembly foi mais fácil do que o esperado graças à documentação do pygame-web
    • As principais etapas foram instalar o pygbag e aplicar as modificações de código indicadas na documentação
  • O maior problema foi que a biblioteca pygame-emojis, usada para renderizar emojis, não funcionava com o pygbag
    • Em vez disso, foram baixados arquivos SVG do OpenMoji
    • Eles foram redimensionados no GIMP e exportados como PNG para uso
  • A versão para navegador basicamente mantém a mesma proporção da versão desktop, ajustando o tamanho à viewport do navegador
    • Se a versão desktop usar um tamanho de janela menor, a tela pode parecer esticada
    • Como o jogo tem estilo retrô, a pixelização não pareceu um problema sério
  • O jogo pode ser jogado no navegador em itch.io
  • O código-fonte está disponível no GitHub

1 comentários

 
GN⁺ 2023-08-14
Comentários do Hacker News
  • Uma ideia que poderia ser legal me veio à cabeça: um jogo de desfragmentação. Basicamente, seria um Tetris disposto em círculo, em que você ganha mais pontos quanto mais manda blocos de dados usados com frequência para as trilhas externas, e arquivos antigos ou tipos de arquivo de arquivo morto para as trilhas internas
    Eu adorava, antigamente, ver ferramentas gráficas de desfragmentação se mexendo como mágica, e, se saísse um jogo de desfragmentação, eu com certeza ia querer jogar

    • Wilmot's Warehouse é praticamente esse jogo
      É um jogo 2D visto de cima, e você está sozinho em um grande armazém vazio. Em intervalos regulares, um caminhão deixa vários itens nos fundos, e, no balcão da frente, algumas pessoas pedem itens específicos. Sua tarefa é organizar os itens no armazém para atender aos pedidos o mais rápido possível. Você pode organizá-los da forma que fizer sentido para você: por cor, função, nome etc.
      À medida que o jogo avança, os caminhões trazem uma variedade maior de itens; em geral, muitos deles também atravessam várias categorias, e os pedidos ficam cada vez mais complexos. No fim, ele mostra um timelapse de como o armazém mudou ao longo de todo o jogo, para você ver sua estratégia evoluindo com o tempo
      É bem bem-feito e simples. Na verdade, fiquei sabendo dele por um dos desenvolvedores em um comentário no HN
    • https://defrag.lolalabs.com/
    • Também existe https://classic.csunplugged.org/activities/community-activit..., e https://www.itgsnews.com/the-defragmentation-game-lesson-pla... também vale a pena ver
      https://boardgamegeek.com/boardgame/376284/defrag
      https://www.defraggame.com
      Tenho a lembrança de ter jogado, no passado, alguns jogos antigos que eram imitações mais diretas do que esses, mas não sei se outra pessoa conseguiria encontrá-los
    • Tive uma sensação parecida em relação a roteamento e layout de PCB ao criar eletrônicos
    • Vamos aumentar as apostas e fazer o jogador usar uma unidade real como sacrifício para o jogo
  • Como em Ender's Game, é legal imaginar que o jogador de elite está, sem saber, alocando a memória de alguma infraestrutura crítica em algum lugar

    • Dá uma vibe de Severance
    • “Para concluir seu cadastro, diga se há uma placa de pare nesta imagem. Por favor, apresse-se, nosso carro autônomo precisa disso.”
      https://xkcd.com/1897/
  • Li meia frase deste site e fiquei totalmente convencido
    É uma das melhores formas de entender esse tipo de problema. “Agora você é o gerenciador de memória. Boa sorte.”
    A ideia é muito boa. Dá até para deixá-la fofa e transformá-la em algo como um simulador de gerenciamento de restaurante. Só que o restaurante é o computador, e os clientes são recursos
    Human Resource Machine também era excelente nesse sentido. Lembro que, em certo momento, pensei: “peraí, eu acabei de criar uma lista encadeada?”

    • Human Resource Machine é muito bom. Minha esposa terminou aquele jogo e a sequência e acabou até fazendo uma transição de carreira para programação
  • Na verdade, acho que a vida humana é uma espécie de sistema operacional. Todos os dias lidamos com tarefas, recursos, entrada e saída, armazenamento, cache e estado
    Dashboards são ferramentas essenciais de um sistema operacional e, na escala humana, são coisas como banco, lista de tarefas, calendário e caixa de entrada. Por isso, muitos conceitos de “autoaperfeiçoamento” se traduzem de forma bem limpa para boas práticas de sistemas operacionais. Por exemplo: FIFO ou LIFO para gerenciar alocação, planejamento prévio para quebrar deadlocks, gerenciamento de paralelismo e garbage collection just-in-time

    • Isso me lembra um pouco um livro que recomendo, Algorithms to Live By
      [0] https://algorithmstoliveby.com/
    • Humanos frequentemente gostam de comparar o cérebro à tecnologia
      Por exemplo, na época em que engrenagens eram tecnologia de ponta, havia pessoas que imaginavam engrenagens girando dentro da cabeça e comparavam o ato de pensar ao movimento delas. Acho que ainda vemos esse tipo de representação às vezes em lugares como desenhos animados
    • Algo mais próximo do que pensamos como sistema operacional talvez seja o sistema nervoso autônomo. Ele abstrai as operações de baixo nível do hardware úmido
      https://en.m.wikipedia.org/wiki/Autonomic_nervous_system
    • A civilização é um sistema operacional distribuído! Ouvi isso do Joscha Bach
    • Qual seria a analogia de sistema operacional para masturbação? Limpar o cache?
  • Como referência, isso apareceu no HN em 30 de setembro, mas não recebeu atenção nenhuma, e a pessoa que postou apagou o próprio comentário
    Eu escrevi na época também: é um conceito realmente bom. Seria legal adicionar fases. Por exemplo, dividir em níveis como um microcontrolador dentro de um produto interessante, um smartphone, um balanceador de carga ou servidor de API de uma empresa SaaS, para introduzir os conceitos um por vez. Isso viraria uma disciplina de sistemas operacionais em nível universitário
    Seria bom incluir um pouco de programação para automação e se aprofundar em algoritmos de cache de sistemas operacionais. LRU é ótimo. É uma disciplina que eu poderia ter concluído antes de terminar o ensino médio
    https://news.ycombinator.com/item?id=36938032

  • Ideia ótima, mas difícil demais para mim. Mesmo no modo normal, 20 segundos depois de começar o jogo eu já estou clicando feito louco, e mesmo alternando processos bloqueados, os processos vermelhos vão se acumulando
    Alguns processos morreram porque o evento de entrada/saída simplesmente nunca veio. O modo fácil parece igual, ou até mais difícil. Eu nem chego ao ponto em que a memória vira problema e, nesse ritmo, nem quero chegar
    Pode ser que eu esteja ficando velho, e entendo que ser um sistema operacional é estressante, mas meu trabalho já é estressante. Não quero mais um trabalho
    Se começasse fácil e fosse subindo aos poucos, mas numa velocidade mais generosa, ficando só um pouco fora da minha zona de conforto, poderia ser um jogo muito divertido

    • Tive o mesmo problema de processos morrendo enquanto esperavam por eventos de entrada/saída que nunca vinham. Todos os processos mortos morreram nesse estado. Quando isso acontece, não parece haver como impedir
    • Computadores existem para fazerem tarefas repetitivas por você, sem se assustar :)
  • Esse tipo de jogo tem um futuro forte
    Jogos que inovam para além do que engines como Unity ou Unreal conseguem oferecer estão indo, por design, numa direção com mais chance de sucesso do que o que sai hoje em dia
    Se você fizer um jogo ultranerd que está tão fora do escopo que usuários de engines não conseguem mexer, você fica em outra liga. Mesmo que o jogo pareça uma bagunça, basta ser divertido e usável
    Jogo indie morreu no sentido que jogo indie tinha há 5 anos. Agora isso é o novo jogo indie. GG. Para constar, sou um desenvolvedor indie fracassado que lançou mais de 2 títulos comerciais
    É uma pena que a Zachtronics tenha parado. Eles sempre estiveram à frente

    • Talvez eu esteja deixando passar alguma coisa, mas me parece que jogos desse mesmo tipo continuam populares há décadas. Não sei se esses jogos ficaram com menor chance de sucesso, nem tenho certeza de que “você é o sistema operacional!” tenha maior chance de sucesso
      E acho que este jogo também poderia ser feito em Unity
    • Não há motivo para isso não poder ser feito em Unity ou Unreal. Dentro dos limites computacionais, dá para fazer literalmente qualquer coisa com essas engines
    • Em que sentido este jogo vai além do que a Unity pode oferecer?
    • Depende do que significa “sucesso”. Se significar dar lucro, provavelmente não. Jogos que se afastam muito dos fluxos suportados por engines otimizadas para o que o mercado quer provavelmente fracassam com mais frequência do que jogos dentro deles
      Se significar “virar um sucesso inesperado que rompe padrões e muda a direção dos jogos”, a probabilidade é extremamente baixa de qualquer jeito, mas um jogo fora da caixa pode ter uma chance maior disso
      A chance de home run é maior, mas a chance de ser eliminado também é maior, e a chance de conseguir uma rebatida simples é menor
    • Não entendi muito bem do que você está falando. Jogos nerds sempre existiram e, por serem nerds demais, geralmente não fazem grande sucesso
      Nos últimos anos também houve vários jogos para nerds de tecnologia, mas nenhum que eu chamaria de hit. Talvez você consiga fazer seu próprio jogo, mas o público é inerentemente pequeno, então o teto de sucesso também é limitado. Não acho que isso vá mudar daqui para frente
      Na verdade, é mais provável o contrário. As gerações mais novas parecem estar ficando menos nerds e mais distantes de temas e tecnologias de baixo nível
  • Conforme o jogo fica mais difícil com alta utilização, deveria ser possível “comprar” upgrades que automatizam pequenas tarefas repetitivas usando tokens obtidos ao atingir marcos ou metas de desempenho. Algo na linha de Universal Paperclips
    Depois, o jogo lançaria cargas de trabalho patológicas que atrapalham a automação simples e obrigam o usuário a resolver manualmente. Então o usuário compra uma automação um pouco melhor, mas esbarra de novo em uma carga de trabalho um pouco mais patológica. Assim se fecha o loop de progressão do jogo

    • Seria bom poder comprar um alocador de memória. E também ter a opção de escrever um você mesmo
  • Em breve o sistema operacional vai oferecer uma linguagem de script para automatizar tarefas, certo?
    Ah, entendi...

    • Vamos usar um interpretador de C e simplesmente copiar o código do Linux... ou fazer o contrário
  • Muito legal. Lembrou um jogo que apareceu na semana passada. Era algo relacionado à Defcon? Era um jogo em que quadrados parecidos com blocos de Tetris, contendo códigos de operação, caíam, e o usuário tinha que organizar uma sequência estilo Rube Goldberg que misturasse o maior número no registrador de memória de “pontuação”