Was ist mit „Systemprogrammierung“ gemeint?

33

Ich bereite mich auf ein Praktikum als Spieleprogrammierer bei einer weltbekannten Spieleentwicklungsfirma vor. Als ich auf der Website nach den erforderlichen Voraussetzungen suchte, wurde mir Folgendes angezeigt:

Zusätzlicher Vorteil

  • Kenntnisse in DirectX / OpenGL.
  • Starke Kenntnisse in 3D-Mathematik und -Physik.
  • Visual Studio IDE für die C ++ - Entwicklung.
  • Systemprogrammierung und Betriebssystemkonzepte.

Was genau verstehen sie unter Systemprogrammierung und Betriebssystemkonzepten?

Sollte ich Windows-Programmierung lernen? Oder sollte ich mit Linux-Programmierung arbeiten (dh sie möchten, dass ich die wichtigen Konzepte kenne)? Oder ist es etwas ganz anderes?

Dhannanjai
quelle
Kommentare sind nicht für längere Diskussionen gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Josh
"Soll ich Windows-Programmierung studieren? Oder soll ich Linux-Programmierung einführen" Beides, wo immer möglich. Lesen Sie sich zumindest die APIs durch, und versuchen Sie vielleicht, ein einfaches Fenster mit den entsprechenden OS-APIs zu öffnen, um zu erfahren, wie unterschiedlich sie sind und wie aufwändig sie sein können.
Pharap
@Pharap Technisch gibt es keine Linux "OS API", die ein Fenster öffnen kann, und es ist besser, glut, glfw oder ähnliches zu verwenden, um ein Fenster zu öffnen, damit es sowohl mit X als auch mit Wayland (und Windows und macOS) funktioniert.
Majora320
@ Majora320 Nein, aber es gibt eine Shell-API, die das behandelt, und sie sind in der Regel für Linux-Distributionen spezifisch (dh X wird in einigen Linux-Distributionen verwendet, in der Regel jedoch nicht für Windows und Mac). Sie können auch glut / glfw / SDL / whatever verwenden. Wichtig ist, dass Sie einen einfachen Ansatz verwenden, damit das OP anhand der Implementierungen mehr über die zugrunde liegenden Konzepte (Ereignismeldungen, Benutzerland vs. Betriebssystemland usw.) erfahren kann. Die portablen / übergeordneten APIs neigen dazu, eine Menge Dinge zu abstrahieren, die den Lernprozess behindern könnten.
Pharap
@Dhannanjai Wenn ich so kühn bin, würde ich gerne ein Buch mit dem Titel Operating Systems DeMYSTiFieD empfehlen . Es hat mir in meinen College-Jahren während der Hardware-Einheit sehr geholfen. Es werden viele wichtige Konzepte von Betriebssystemen wie POST, Thread-Scheduling-Techniken (Round-Robin, geordnete Warteschlangen usw.) und Treibern erläutert.
Pharap

Antworten:

54

"Systemprogrammierung" (oder "Systemprogrammierung") bedeutet in der Regel, dass die Programmierung auf einer niedrigeren Abstraktionsebene als beispielsweise die Gameplay-Programmierung erfolgt. Bei der Gameplay-Programmierung geht es in der Regel darum, die eigentlichen Spielmechanismen und Features zu erstellen, die ein Benutzer möglicherweise sieht, während bei der Systemprogrammierung eher die Frameworks erstellt werden, auf denen Gameplay-Programmierer arbeiten.

Dies kann Grafiken, Laden und Streamen von Ressourcen, Audio, Speicherverwaltung, Datei-E / A, Plattformabstraktions-APIs usw. bedeuten. Die Details sind sehr unterschiedlich und da es in der Spielebranche keine Standards für Jobtitel gibt, gibt es auch keine Standards für die Namen von Programmierdomänen. In einem Studio können Sie feststellen, dass "Systemprogrammierung" alles bedeutet, was ich oben aufgeführt habe. Zum anderen stellen Sie möglicherweise fest, dass sie "Grafikprogrammierung" als separate Domäne unterscheiden und jede andere Nicht-Gameplay-Programmieraufgabe als "Systemprogrammierung" bezeichnen. In einem anderen Fall verwenden sie den Begriff möglicherweise überhaupt nicht und nennen ihn einfach "Motorprogrammierung".

Da es sich um eine Domäne niedrigerer Ebene handelt und in der Regel eine direktere Verbindung mit den plattformspezifischen APIs für die Plattformen besteht, für die das Spiel entwickelt wurde, sind Kenntnisse über diese Plattformen ebenso hilfreich wie Kenntnisse über die allgemeinere Domäne (z. B. von Betriebssystemkonzepten, ohne Rücksicht darauf, wie bestimmte Betriebssysteme funktionieren, wie etwa der virtuelle Speicher oder wie Threads funktionieren, wie die E / A-Pufferung funktioniert, und so weiter.

Josh
quelle
2
Kurz gesagt würde ich sagen, dass die Nicht-Systemprogrammierung (das eigentliche Spiel) größtenteils plattformunabhängig ist (egal, ob es sich um Mac / PC / Xbox handelt), wohingegen die Systemprogrammierung viel plattformspezifischer sein wird (in der richtigen Reihenfolge) die plattformunabhängige Schicht für Nicht-Systemprogrammierer bereitzustellen).
TripeHound
22

Joshs Antwort ist wirklich gut, aber ich dachte, ich würde ein paar Stichpunkte über das Systemteam, in dem ich arbeite, fallen lassen. Ich arbeite nicht an Systemen, aber ich arbeite viel mit ihnen. Die Aufgaben eines Systems-Teams sind von Unternehmen zu Unternehmen sehr unterschiedlich.

Unser System-Team kümmert sich um viele Dinge:

  • Mathematische Bibliothek
  • STD-Ersatzbibliothek
  • Core Game Framework
  • Core Application Framework
  • Eingang
  • Ereignismeldung
  • Komponenten-Entity-Systeme
  • Skriptbindung
  • (und mehr)

Hier gibt es viel Windows- und Linux-Domänenwissen sowie viel Wissen über Physik, Hauptspiellogik und Low-Level-Speichermanagement. Systemteams werden in der Regel zumindest teilweise in jedes unterstützte Betriebssystem einbezogen, da die meisten ihrer Projekte auf jedem Betriebssystem auf einer relativ niedrigen Ebene ausgeführt werden.

Einige Dinge, die unter ein "Systems" -Team fallen könnten, das wir in separate Teams aufteilen (mit dem unser Systems-Team jedoch noch immer ziemlich stark interagiert):

  • Physik
  • Linux (dedizierter Server)
  • Direkte Unterstützung für andere Betriebssysteme (iOS / Mac / Konsolen / etc)
  • Systeme erstellen
  • Audio
Honigbündel
quelle
0

Die Systemprogrammierung ist sehr gut definiert, aber Unternehmen versuchen, sie an ihre Bedürfnisse anzupassen. Wenn Sie Systemaufrufe verwenden oder schreiben, führen Sie die Systemprogrammierung durch. Systemaufrufe sind die Funktionen, die vom Kernel oder von den Userspace-Treibern bereitgestellt werden. Dies schließt OpenGL ein, da es im Grunde genommen ein Treiber ist.

Cem Kalyoncu
quelle
Ich glaube nicht, dass sich Grafikprogrammierer (OpenGL-Experten) für einen Job als Systemprogrammierer bewerben würden ...
Vaillancourt
Grafikprogrammierung und OpenGL-Programmierung sind zwei verschiedene Dinge. Einer befasst sich mit Computergrafikalgorithmen, der andere befasst sich mit den Einzelheiten der API.
Cem Kalyoncu
0

Die oben aufgeführten zusätzlichen Vorteile beziehen sich hauptsächlich auf die Programmierung der Game-Engine, sofern dies erforderlich ist. Daher müssen APIs auf niedriger Ebene verwendet werden. Die Systemprogrammierung hier setzt voraus, dass Sie wissen, wie Sie OS-Audio, Prozessverwaltung, Dateimanipulation, Netzwerkanrufe usw. anrufen können.

Morevitamine
quelle
-6

Da sie auf Visual Studio verweisen, bezieht sich die Systemprogrammierung auf das Schreiben von Programmen speziell für Windows-Betriebssysteme, dh Windows-Systemaufrufe (zum Beispiel gibt es keine Fork-Exec-Kette), Benutzerkonten, wo Ihre benutzerspezifischen Daten abgelegt werden sollen, Modelle für die gemeinsame Datennutzung Windows Nachschlagen, z. B. wie Sie den aktuellen Benutzer in Visual C ++ überprüfen oder einen neuen Prozess starten können

Betriebssystemkonzepte, siehe Scheduling, Dateiabstraktion, Threads, Userspace usw. In DevWiki und Foren kann eine gute Lektüre erfolgen

Die Benutzerauthentifizierung erfolgt beispielsweise in beiden Abschnitten, da Windows ein einzelnes Benutzer-Betriebssystem ist, das eine viel tiefere Integration von Benutzerverwaltung und Benutzeroberfläche im Kernel aufweist.

Der MSDN ist die Wissensdatenbank für alle Windows-Programmieraufgaben, Bibliotheken usw. https://msdn.microsoft.com/

Stackoverflow für die eigentliche Codierung, wenn Sie nicht weiterkommen.

Git
quelle
Windows ist kein Einzelbenutzer-Betriebssystem.
Maximus Minimus
Und Systemprogrammierung bedeutet nicht, Programme speziell für ein bestimmtes Betriebssystem zu schreiben. Treiber können beispielsweise problemlos plattformübergreifend sein. Da die tatsächlichen Windows-Systemaufrufe von Release zu Release unterschiedlich sind, werden sie in der Regel über kernel32.dll und user32.dll abgewickelt, anstatt direkt mit dem Kernel zu kommunizieren.
Maciej Piechotka
@MaciejPiechotka Systemsprogramming programmiert auf einer Ebene in der Nähe des Hardware- // Betriebssystems. Der plattformübergreifende Teil eines Treibers ist die API, nicht der Syscall-Wrapper. Unter Linux werden die Syscalls auch in Bibliotheken verpackt, andernfalls können Sie die unten stehende Implementierung nicht ändern. Das Abrufen der CPU-Temperatur über Register ist beispielsweise zwischen den einzelnen Soses sehr unterschiedlich.
Git
@ LeComteduMerde-fou wenn du nur schaust, wie die Benutzer behandelt werden, ist es. -> Sicherheitsschlüssel (Strg + Alt + Löschen), die GUI usw. Unix // BSD behandelt die Benutzer völlig anders
Git
@gismo Ich schreibe Treiber fürs Leben - es gibt viel mehr für Treiber, die nicht für das Betriebssystem spezifisch sind als API;) Mein Punkt zu Syscalls war getrennt von dem zu Treibern. Natürlich gibt es in Linux Bibliotheken, aber mein Punkt ist, dass Linux ein ABI für Systemaufrufe hat - dh, Systemaufrufe sind zumindest theoretisch stabil und dokumentiert (und eng nach POSIX modelliert). Unter Windows wird die Kernel-Oberfläche des Userspace <-> über Releases hinweg nicht als stabil angesehen.
Maciej Piechotka