Um videogame em que você é o sistema operacional
(plbrault.com)- 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
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
É 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://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
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
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?”
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
[0] https://algorithmstoliveby.com/
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
https://en.m.wikipedia.org/wiki/Autonomic_nervous_system
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
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
E acho que este jogo também poderia ser feito em Unity
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
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
Em breve o sistema operacional vai oferecer uma linguagem de script para automatizar tarefas, certo?
Ah, entendi...
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”
https://news.ycombinator.com/item?id=37083309