¿Qué se entiende por "programación del sistema"?

33

Me estoy preparando para una pasantía como programador de juegos en una empresa de desarrollo de juegos de renombre mundial. Cuando busqué en su sitio web los requisitos previos necesarios, me mostró esto:

Ventaja añadida

  • Conocimiento de DirectX / OpenGL.
  • Fuerte dominio de las matemáticas y la física en 3D.
  • Visual Studio IDE para el desarrollo de C ++.
  • Programación del sistema y conceptos del sistema operativo.

¿Qué quieren decir exactamente con programación del sistema y conceptos del sistema operativo?

¿Debería estar estudiando la programación de Windows? O debería ir con la programación de Linux (lo que significa que quieren que conozca los conceptos importantes). ¿O es algo totalmente diferente?

Dhannanjai
fuente
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
Josh
"¿Debería estar estudiando la programación de Windows? O debería ir con la programación de Linux" Ambos, siempre que sea posible. Al menos tenga una lectura de sus API, quizás intente hacer una simple "abrir una ventana" con las respectivas API del sistema operativo para que sepa qué tan diferentes son y qué esfuerzo puede ser.
Pharap
@Pharap Técnicamente, no hay una "API de sistema operativo" de Linux que pueda abrir una ventana, y es mejor usar glut, glfw o similar para abrir una ventana para que funcione tanto con X como con Wayland (y Windows y macOS).
Majora320
@ Majora320 No, pero hay una API de shell que lo maneja, y tienden a ser específicos de las distribuciones de Linux (es decir, X se usa en algunas distribuciones de Linux, pero generalmente no en Windows y Mac). También podría usar glut / glfw / SDL / lo que sea, el punto importante es adoptar un enfoque de bajo nivel para que el OP pueda usar las implementaciones para aprender sobre los conceptos subyacentes (mensajes de evento, usuario-tierra vs os-tierra, etc.). Las API portátiles / de nivel superior tienden a abstraer muchas cosas que podrían dificultar el proceso de aprendizaje.
Pharap
@Dhannanjai Si puedo ser tan audaz, me gustaría recomendar un libro llamado Operating Systems DeMYSTiFieD . Me ayudó mucho en mis años universitarios durante la unidad de hardware. Explica muchos de los conceptos importantes de los sistemas operativos como POST, técnicas de programación de subprocesos (round-robin, colas ordenadas, etc.) y controladores.
Pharap

Respuestas:

54

"Programación del sistema" (o "programación de sistemas") significa la programación realizada en un nivel de abstracción más bajo que (por ejemplo) la programación del juego. La programación del juego generalmente se trata de construir la mecánica real del juego y las características frontales que un usuario puede ver, mientras que la programación de sistemas se trata más de construir los marcos sobre los que trabajan los programadores de juegos.

Esto podría significar gráficos, carga y transmisión de recursos, audio, administración de memoria, E / S de archivos, API de abstracción de plataforma, etc. Los detalles varían bastante, y debido a que no hay estándares para los títulos de trabajo en la industria de los juegos, tampoco hay estándares para los nombres de los dominios de programación. En un estudio, puede encontrar que "programación de sistemas" significa todo lo que enumeré anteriormente. En otro, puede encontrar que distinguen la "programación de gráficos" como un dominio separado y llaman a todas las demás tareas que no son de programación de juegos "programación de sistemas". En otro más, es posible que no usen el término en absoluto y simplemente lo llamen "programación del motor".

Dado que es un dominio de nivel inferior, y generalmente implica una interfaz más directa con las API específicas de la plataforma para las plataformas para las que se está construyendo el juego, será útil tener conocimiento de esas plataformas, así como tener conocimiento del dominio más general (p. Ej. , de los conceptos del sistema operativo sin tener en cuenta cómo funcionan los sistemas operativos específicos, como qué es la memoria virtual o cómo funcionan los subprocesos, cómo funciona el almacenamiento en búfer de E / S, etc.

Josh
fuente
2
En pocas palabras, diría que la programación que no es de sistemas (el juego real) será en su mayoría independiente de la plataforma (realmente no me importa si es Mac / PC / Xbox), mientras que la programación de sistemas será mucho más específica de la plataforma (en orden para proporcionar la capa independiente de la plataforma para los programadores que no son sistemas).
TripeHound
22

La respuesta de Josh es realmente buena, pero pensé que arrojaría algunas viñetas sobre el equipo de Sistemas donde trabajo. No trabajo en sistemas pero trabajo mucho con ellos. Las responsabilidades de un equipo de sistemas varían mucho de una compañía a otra.

Nuestro equipo de sistemas está a cargo de muchas cosas:

  • Biblioteca de matemáticas
  • Biblioteca de reemplazo de ETS
  • Marco de juego principal
  • Marco de aplicación principal
  • Entrada
  • Mensajería de eventos
  • Sistemas de entidad componente
  • Guión vinculante
  • (y más)

Aquí hay muchos conocimientos de dominio de Windows y Linux, así como muchos conocimientos de Física, lógica de juegos básicos y gestión de memoria de bajo nivel. Los equipos de sistemas generalmente estarán involucrados al menos en alguna parte en cada sistema operativo compatible, ya que la mayoría de sus proyectos se encuentran en cada sistema operativo en un nivel bastante bajo.

Algunas cosas que podrían caer dentro de un equipo de "Sistemas" que dividimos en equipos separados (pero nuestro equipo de Sistemas aún interactúa bastante):

  • Física
  • Linux (servidor dedicado)
  • Soporte directo para otros sistemas operativos (iOS / Mac / Consolas / etc.)
  • Sistemas de construcción
  • Audio
Manojo miel
fuente
0

La programación de sistemas está muy bien definida, pero las empresas intentan extenderla a sus necesidades. Si está utilizando o escribiendo llamadas de sistema, está haciendo programación de sistemas. Las llamadas al sistema son las funciones que proporciona el núcleo o los controladores de espacio de usuario. Esto incluye OpenGL, ya que es básicamente un controlador.

Cem Kalyoncu
fuente
No creo que los programadores gráficos (expertos de OpenGL) se postulen para un trabajo de programador de sistemas ...
Vaillancourt
La programación de gráficos y la programación de OpenGL son dos cosas diferentes. Uno trata con algoritmos de gráficos de computadora, el otro trata con los detalles de la API.
Cem Kalyoncu
0

Las ventajas adicionales enumeradas anteriormente son principalmente para la programación del motor del juego cuando es necesario, por lo que implica la utilización de API de bajo nivel. La programación de sistemas aquí espera que sepa cómo hacer llamadas al audio del sistema operativo, la gestión de procesos, la manipulación de archivos, las llamadas de red, etc.

morevitaminas
fuente
-6

Dado que hacen referencia a Visual Studio, la programación del sistema se refiere a escribir programas específicamente para los sistemas operativos de Windows, lo que significa: llamadas al sistema de Windows (por ejemplo, no hay una cadena fork-exec), cuentas de usuario, dónde colocar sus datos específicos de usuario, modelos de intercambio de datos en Windows Busque, por ejemplo, cómo puede comprobar el usuario actual en Visual C ++ o cómo iniciar un nuevo proceso

Conceptos del sistema operativo, consulte programación, abstracción de archivos, hilos, espacio de usuario, etc. El wiki y los foros de os dev pueden ser una buena lectura

La autenticación de usuario se encuentra, por ejemplo, en ambas secciones, ya que Windows es un sistema operativo de un solo usuario, que tiene una integración mucho más profunda del núcleo de la administración de usuarios y la interfaz de usuario.

El msdn es la base de conocimiento para todas las cosas de programación de Windows apis, bibliotecas, etc. https://msdn.microsoft.com/

Stackoverflow para la codificación real si está atascado.

Git
fuente
Windows no es un sistema operativo de usuario único.
Maximus Minimus
Y la programación del sistema no significa escribir programas específicamente para un sistema operativo determinado. Los controladores, por ejemplo, pueden ser fácilmente multiplataforma. Dado que las llamadas al sistema de Windows reales difieren de una versión a otra, por lo general se maneja a través de kernel32.dll y user32.dll en lugar de hablar directamente con el núcleo.
Maciej Piechotka
@MaciejPiechotka Systemsprogramming está programando en un nivel cercano al hardware // sistema operativo. La parte de un controlador que es multiplataforma es la API, no el contenedor syscall. En Linux, las llamadas al sistema también están incluidas en las bibliotecas, de lo contrario no podría cambiar la implementación a continuación. Por ejemplo, obtener la temperatura de la CPU a través de los registros es muy diferente entre los oses.
Git
@ LeComteduMerde-fou si solo miras cómo se manejan los usuarios, es así. -> Claves de seguridad (ctrl + alt + eliminar), la GUI, etc. Unix // BSD maneja a los usuarios completamente diferentes
Git
@gismo Escribo controladores para vivir: hay mucho más para el controlador, que no es una parte específica del sistema operativo que la API;) Mi punto sobre las llamadas al sistema era diferente que sobre los controladores. Por supuesto, en Linux tiene bibliotecas, pero mi punto es que Linux tiene un ABI para las llamadas al sistema, es decir, las llamadas al sistema, al menos en teoría, son estables y documentadas (y modeladas de manera similar a POSIX). Para Windows, la interfaz del kernel del espacio de usuario <-> no se considera estable en todas las versiones.
Maciej Piechotka