Что подразумевается под «системным программированием»?

33

Я готовлюсь к стажировке в качестве программиста игры во всемирно известной компании по разработке игр. Когда я искал на их сайте необходимые предпосылки, он показал мне это:

Добавленное преимущество

  • Знание DirectX / OpenGL.
  • Сильная команда по 3D математике и физике.
  • Visual Studio IDE для разработки на C ++.
  • Системное программирование и концепции ОС.

Что именно они подразумевают под системным программированием и концепциями ОС?

Должен ли я изучать программирование Windows? Или я должен заняться программированием в Linux (то есть они хотят, чтобы я знал важные понятия). Или это что-то совершенно другое?

Dhannanjai
источник
Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Джош
«Должен ли я изучать программирование для Windows? Или я должен заниматься программированием для Linux» И то, и другое возможно. По крайней мере, ознакомьтесь с их API, возможно, попробуйте сделать простое «открытие окна» с соответствующими API-интерфейсами ОС, чтобы узнать, насколько они различны и какими усилиями это может быть.
Pharap
@Pharap Технически, нет Linux "OS API", который может открыть окно, и лучше использовать glut, glfw или подобное, чтобы открыть окно, чтобы оно работало как с X, так и с Wayland (а также с Windows и macOS).
Majora320
@ Majora320 Нет, но есть API оболочки, который его обрабатывает, и они, как правило, специфичны для дистрибутивов Linux (то есть X используется в некоторых дистрибутивах Linux, но обычно не в Windows и Mac). Вы также можете использовать glut / glfw / SDL / что угодно, важным моментом является использование низкоуровневого подхода, чтобы OP мог использовать реализации для изучения базовых концепций (сообщения о событиях, пользовательская земля против os-земля и т. Д.). Переносимые / высокоуровневые API имеют тенденцию абстрагироваться от множества вещей, которые могут помешать процессу обучения.
Pharap
@Dhannanjai Если я буду настолько смелым, я бы порекомендовал книгу под названием « Операционные системы DeMYSTiFieD» . Это очень помогло мне в студенческие годы во время обучения аппаратному обеспечению. В нем объясняются многие важные концепции операционных систем, таких как POST, методы планирования потоков (циклический перебор, упорядоченные очереди и т. Д.) И драйверы.
Pharap

Ответы:

54

«Системное программирование» (или «системное программирование») означает программирование, выполненное на более низком уровне абстракции, чем (например) программирование геймплея. Программирование геймплея обычно связано с созданием реальной игровой механики и фронтальных возможностей, которые может видеть пользователь, в то время как системное программирование - это скорее создание каркасов, на которых работают программисты геймплея.

Это может означать графику, загрузку и потоковую передачу ресурсов, аудио, управление памятью, ввод-вывод файлов, API-интерфейсы абстракции платформы и так далее. Детали довольно сильно различаются, и, поскольку в игровой индустрии не существует стандартов для названий должностей, также не существует стандартов для названий областей программирования. В одной студии вы можете обнаружить, что «системное программирование» означает все, что я перечислил выше. С другой стороны, вы можете обнаружить, что они различают «графическое программирование» как отдельный домен и называют любую другую задачу, не связанную с программированием геймплея, «системным программированием». В еще одном случае они могут вообще не использовать этот термин и просто назвать его «программирование двигателя».

Поскольку это домен более низкого уровня, и обычно он предполагает более непосредственное взаимодействие с API-интерфейсами для каждой платформы для платформ, для которых будет полезно знание этих платформ, равно как и знание более общего домена (например, концепций ОС без учета того, как работает конкретная ОС, например, что такое виртуальная память или как работают потоки, как работает буферизация ввода-вывода и так далее).

мистифицировать
источник
2
Короче говоря, я бы сказал, что несистемное программирование (настоящая игра) будет в основном независимым от платформы (на самом деле все равно, Mac это / PC / Xbox), тогда как системное программирование будет гораздо более специфичным для платформы (по порядку). обеспечить независимый от платформы уровень для несистемных программистов).
TripeHound
22

Ответ Джоша действительно хорош, но я подумал, что я бы хотел сказать несколько слов о команде систем, где я работаю. Я не работаю над системами, но я много с ними работаю. Обязанности системной команды сильно различаются от компании к компании.

Наша команда по системам отвечает за множество вещей:

  • Математическая библиотека
  • STD Замена библиотеки
  • Основные игровые рамки
  • Базовая платформа приложений
  • вход
  • Обмен сообщениями о событиях
  • Компонент-сущность системы
  • Привязка скрипта
  • (и больше)

Здесь много знаний о Windows и Linux, а также много знаний о физике, основной игровой логике и низкоуровневом управлении памятью. Системные команды обычно участвуют, по крайней мере, в какой-то части в каждой поддерживаемой ОС, поскольку большинство их проектов находятся на каждой ОС на довольно низком уровне.

Некоторые вещи, которые могут попадать в группу «Системы», которую мы разделяем на отдельные группы (но наша группа по Системам все еще взаимодействует довольно активно):

  • физика
  • Linux (выделенный сервер)
  • Прямая поддержка других ОС (iOS / Mac / Консоли / и т. Д.)
  • Системы сборки
  • аудио
Honeybunch
источник
0

Системное программирование очень хорошо определено, но компании пытаются расширить его до своих потребностей. Если вы используете или пишете системные вызовы, вы занимаетесь системным программированием. Системные вызовы - это функции, предоставляемые ядром или драйверами пространства пользователя. Это включает в себя OpenGL, поскольку это в основном драйвер.

Джем Калионку
источник
Я не думаю, что графические программисты (эксперты OpenGL)
Vaillancourt
Графическое программирование и программирование OpenGL - это две разные вещи. Один имеет дело с алгоритмами компьютерной графики, другой имеет дело с особенностями API.
Джем Калионку
0

Перечисленные выше дополнительные преимущества в основном предназначены для программирования игрового движка, когда это необходимо, и, следовательно, включает использование API низкого уровня. Системное программирование предполагает, что вы знаете, как совершать звонки на аудио ОС, управлять процессами, манипулировать файлами, сетевыми вызовами и так далее ...

morevitamins
источник
-6

Поскольку они ссылаются на Visual Studio, системное программирование относится к написанию программ специально для операционных систем Windows, что означает: системные вызовы Windows (например, нет цепочки fork-exec), учетные записи пользователей, куда помещать пользовательские данные, модели совместного использования данных в Windows Посмотрите, например, как вы можете проверить текущего пользователя в Visual C ++ или Как начать новый процесс

Концепции ОС, относящиеся к планированию, абстракции файлов, потокам, пользовательскому пространству и т. Д. Os dev wiki и форумы могут быть хорошо прочитаны

Аутентификация пользователя проводится, например, в обоих разделах, поскольку windows - это однопользовательская операционная система, которая имеет более глубокую интеграцию ядра управления пользователями и пользовательским интерфейсом.

MSDN является базой знаний для всего, что касается программирования Windows, API, библиотек и т. Д. Https://msdn.microsoft.com/

Stackoverflow для фактического кодирования, если вы застряли.

Гит
источник
Windows не является однопользовательской ОС.
Максимус
И системное программирование не означает написание программ специально для данной ОС. Драйверы, например, могут быть легко кроссплатформенными. Поскольку фактические системные вызовы Windows отличаются от выпуска к выпуску, поэтому обычно они обрабатываются с помощью kernel32.dll и user32.dll, а не напрямую обращаются к ядру.
Мацей Пехотка
@MaciejPiechotka Системное программирование - это программирование на уровне, близком к оборудованию // Операционная система. Кроссплатформенная часть драйвера - это API, а не оболочка системного вызова. В Linux системные вызовы также обернуты в библиотеках, в противном случае вы не сможете изменить реализацию ниже. Например, получение температуры процессора через регистры очень различно между oses.
Git
@ LeComteduMerde-fou, если вы только посмотрите, как обрабатываются пользователи, это так. -> Ключи безопасности (ctrl + alt + delete), графический интерфейс и т. Д. Unix // BSD полностью
Git
@gismo Я пишу драйверы для жизни - это гораздо больше для драйвера, который не является частью ОС, а не API;) Моя точка зрения на системные вызовы была отдельной, а не на драйверы. Конечно, в Linux у вас есть библиотеки, но я хочу сказать, что в Linux есть ABI для системных вызовов - то есть системные вызовы, по крайней мере теоретически, стабильны и документированы (и полностью смоделированы после POSIX). Для Windows пользовательский интерфейс <-> ядра не считается стабильным во всех выпусках.
Мацей Печотка