O que se entende por "Programação do Sistema"?

33

Estou me preparando para um estágio como programador de jogos em uma empresa de desenvolvimento de jogos de renome mundial. Quando procurei no site deles os pré-requisitos necessários, ele me mostrou o seguinte:

Vantagem adicionada

  • Conhecimento de DirectX / OpenGL.
  • Forte comando em Matemática e Física 3D.
  • Visual Studio IDE para desenvolvimento em C ++.
  • Programação de sistemas e conceitos de SO.

O que exatamente eles querem dizer com programação do sistema e conceitos de SO?

Devo estudar a programação do Windows? Ou devo ir com a programação Linux (o que significa que eles querem que eu conheça os conceitos importantes). Ou é algo totalmente diferente?

Dhannanjai
fonte
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Josh
"Devo estudar a programação do Windows? Ou devo seguir a programação do Linux?" Ambos sempre que possível. Pelo menos, leia suas APIs, talvez tente fazer uma simples "abrir uma janela" com as respectivas APIs do SO, para que você aprenda o quão diferentes elas são e que esforço pode ser.
Pharap
@Pharap Tecnicamente, não existe uma "API do SO" do Linux que possa abrir uma janela, e é melhor usar glut, glfw ou similar para abrir uma janela, para que ele funcione tanto com o X quanto com o Wayland (e Windows e macOS).
Majora320
@ Majora320 Não, mas existe uma API de shell que lida com isso, e eles tendem a ser específicos para as distribuições Linux (ou seja, o X é usado em algumas distribuições Linux, mas normalmente não no Windows e Mac). Você também pode usar glut / glfw / SDL / qualquer que seja, o ponto importante é adotar uma abordagem de baixo nível para que o OP possa usar as implementações para aprender sobre os conceitos subjacentes (mensagens de evento, user-land vs os-land etc.). As APIs portáteis / de nível superior tendem a abstrair muitas coisas que podem dificultar o processo de aprendizado.
Pharap
@Dhannanjai Se eu puder ser tão ousado, gostaria de recomendar um livro chamado Operating Systems DeMYSTiFieD . Isso me ajudou muito nos meus anos de faculdade durante a unidade de hardware. Ele explica muitos dos conceitos importantes de sistemas operacionais, como POST, técnicas de agendamento de threads (round-robin, filas ordenadas etc.) e drivers.
Pharap

Respostas:

54

"Programação de sistema" (ou "programação de sistemas") tende a significar programação feita em um nível mais baixo de abstração do que (por exemplo) programação de jogo. A programação de jogabilidade geralmente consiste em criar a mecânica de jogo e os recursos de frente que o usuário pode ver, enquanto a programação de sistemas é mais sobre a construção de estruturas nas quais os programadores de jogabilidade trabalham.

Isso pode significar gráficos, carregamento e streaming de recursos, áudio, gerenciamento de memória, E / S de arquivo, APIs de abstração de plataforma etc. Os detalhes variam um pouco e, como não existem padrões para os cargos na indústria de jogos, também não existem padrões para os nomes de domínios de programação. Em um estúdio, você pode achar que "programação de sistemas" significa tudo o que listei acima. Em outro, você pode achar que eles distinguem "programação gráfica" como um domínio separado e chamam todas as outras tarefas de programação que não são de gameplay de "programação de sistemas". Em outro caso, eles podem não usar o termo e simplesmente o chamam de "programação do mecanismo".

Como é um domínio de nível inferior e normalmente envolve uma interface mais direta com as APIs específicas da plataforma para qualquer plataforma para a qual o jogo está sendo construído, ter conhecimento dessas plataformas será útil, assim como ter conhecimento do domínio mais geral (por exemplo, , dos conceitos de sistema operacional, independentemente de como o sistema operacional funciona, como o que é a memória virtual ou como os threads funcionam, como funciona o buffer de E / S, etc.).

Josh
fonte
2
Em poucas palavras, eu diria que a programação que não é de sistemas (o jogo real) será basicamente independente de plataforma (não se importa se é Mac / PC / Xbox), enquanto a programação de sistemas será muito mais específica da plataforma (para para fornecer a camada independente de plataforma para os programadores que não são de sistemas).
TripeHound 25/08
22

A resposta de Josh é realmente boa, mas eu pensei em descartar alguns pontos sobre a equipe de Sistemas onde trabalho. Não trabalho em sistemas, mas trabalho muito com eles. As responsabilidades de uma equipe de sistemas variam muito de empresa para empresa.

Nossa equipe de sistemas é responsável por muitas coisas:

  • Biblioteca de Matemática
  • Biblioteca de substituição STD
  • Estrutura básica do jogo
  • Estrutura de aplicativo principal
  • Entrada
  • Mensagens de evento
  • Sistemas de entidades componentes
  • Ligação de script
  • (e mais)

Há muito conhecimento de domínio do Windows e Linux aqui, além de muito conhecimento de física, lógica de jogo principal e gerenciamento de memória de baixo nível. As equipes de sistemas geralmente estarão envolvidas, pelo menos em parte, em cada SO suportado, pois a maioria de seus projetos fica em cada SO em um nível bastante baixo.

Algumas coisas que podem pertencer a uma equipe de "Sistemas" que dividimos em equipes separadas (mas nossa equipe de sistemas ainda interage bastante):

  • Física
  • Linux (servidor dedicado)
  • Suporte direto para outros sistemas operacionais (iOS / Mac / Consoles / etc)
  • Build Systems
  • Áudio
Honeybunch
fonte
0

A programação de sistemas é muito bem definida, mas as empresas tentam estendê-la às suas necessidades. Se você estiver usando ou gravando chamadas do sistema, estará fazendo a programação do sistema. As chamadas do sistema são as funções fornecidas pelo kernel ou pelos drivers do espaço do usuário. Isso inclui o OpenGL, pois é basicamente um driver.

Cem Kalyoncu
fonte
Eu não acho que os programadores gráficos (peritos OpenGL) seria aplicável a um trabalho programador do sistema ...
Vaillancourt
A programação gráfica e a programação OpenGL são duas coisas diferentes. Um lida com algoritmos de computação gráfica, o outro lida com os detalhes da API.
Cem Kalyoncu 27/08/17
0

As vantagens adicionadas listadas acima são principalmente para a programação de mecanismos de jogos, quando necessário, o que envolve a utilização de APIs de baixo nível. A programação de sistemas aqui espera que você saiba como fazer chamadas para o áudio do SO, gerenciamento de processos, manipulação de arquivos, chamadas de rede e assim por diante ...

morevitaminas
fonte
-6

Como eles fazem referência ao Visual Studio, a programação do sistema se refere à gravação de programas especificamente para os sistemas operacionais Windows, o que significa: syscalls do Windows (por exemplo, não existe uma cadeia de garfos), contas de usuário, onde colocar dados específicos do usuário, modelos de compartilhamento de dados em windows Procure, por exemplo, como você pode verificar o usuário atual no visual c ++ ou como iniciar um novo processo

Conceitos de SO, consulte agendamento, abstração de arquivo, threads, espaço de usuário etc. os wiki e fóruns do dev podem ser uma boa leitura

A autenticação do usuário é, por exemplo, nas duas seções, já que o Windows é um sistema operacional de usuário único, que possui uma integração do kernel muito mais profunda do gerenciamento e da interface do usuário.

O msdn é a base de conhecimento de todas as coisas que programam APIs, bibliotecas, etc. https://msdn.microsoft.com/

Fluxo de pilha para a codificação real, se você estiver preso.

Git
fonte
O Windows não é um sistema operacional de usuário único.
Maximus Minimus
E a programação do sistema não significa escrever programas especificamente para um determinado sistema operacional. Drivers, por exemplo, podem ser facilmente multiplataforma. Como os syscalls reais do Windows diferem de release para release, geralmente é tratado com o kernel32.dll e o user32.dll em vez de falar diretamente com o kernel.
Maciej Piechotka
@MaciejPiechotka Systemsprogramming está programando em um nível próximo ao hardware / sistema operacional. A parte de um driver que é multiplataforma é a API, não o wrapper syscall. No Linux, os syscalls também são agrupados em bibliotecas, caso contrário, você não pode alterar a implementação abaixo. Por exemplo, obter a temperatura da CPU via registradores é muito diferente entre oses.
Git
@ LeComteduMerde-fou se você olhar apenas como os usuários são tratados, é isso. -> Chaves de Segurança (ctrl + alt + delete), a GUI, etc. Unix // BSD lida com os usuários completamente diferente e foi decorado
Git
@gismo Eu escrevo drivers para viver - há muito mais no driver que não é parte específica do SO, e API;) Meu ponto de vista sobre syscalls era separado, então o sobre drivers. Claro que no Linux você tem bibliotecas, mas o que quero dizer é que o Linux tem uma ABI para syscalls - ou seja, syscalls, pelo menos em teoria, são estáveis ​​e documentados (e modelados de perto após o POSIX). Para Windows, a interface do kernel do espaço do usuário <-> não é considerada estável entre as versões.
Maciej Piechotka