Подтвердить что ты не робот

Какие концепции операционной системы должны знать каждый программист?

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

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

У меня есть несколько конкретных вопросов:

  • Какие ключевые понятия для операционных систем важны для программиста, которому требуется самообучение, чтобы понимать, что они могут быть лучшими разработчиками программного обеспечения (хотя и работают над обычной разработкой приложений)?
  • Возможно ли даже дистанционно изучить такой предмет в практических произведениях размером в байт? (Даже такой объект, как построение компилятора, может быть изучен руками, на довольно низком уровне сложности).
4b9b3361

Ответ 1

Я бы предложил прочитать Andrew S. Tanenbaum (http://en.wikipedia.org/wiki/Andrew_S._Tanenbaum) книгу на Современная операционная Системы (ISBN 978-0-13-600663-3), поскольку все есть.

Однако из книжного индекса мы можем определить минимальные ключевые темы:

  • Процессы
  • Управление памятью
  • Файловые системы
  • Вход/выход

И самым простым способом начать играть с этими темами будет загрузка MINIX:

http://www.minix3.org/

и изучите код. Старые версии этой операционной системы могут быть проще понять.

Другим полезным ресурсом является Майк Сондерс. Как написать простую операционную систему, в которой показано, как писать и создавать свою первую операционную систему на языке ассемблера x86:

http://mikeos.sourceforge.net/write-your-own-os.html

Ответ 2

Каждый разработчик ОС должен понимать концепции Multics. Одной из самых ярких идей является понятие обширной виртуальной памяти, разделенной на непосредственно читаемые и записываемые сегменты с полной защитой и многопроцессорной поддержкой для загрузки; с 64-битными указателями, у нас достаточно бит, чтобы напрямую обращаться ко всему на планете. Эти идеи относятся к 1960-м годам, но вневременным ИМХО.

Очевидная потеря таких знаний заставила нас "Eunuchs" теперь создаваться как Unix, затем Linux и столь же плохой дизайн от Microsoft, оба из которых организуют мир как плоское пространство процесса и файлы. Те, кто не знает историю, обречены на то, чтобы делать что-то нелепое.

Сделайте все возможное, чтобы получить копию книги Organick в Multics, и прочитайте ее, накройте обложку. (Elliott I. Organick, The Multics System: исследование его структуры).

На сайте wikipedia есть хорошая информация; Бумаги Корбато великолепны.

Ответ 3

Я считаю, что это зависит от типа приложения, которое вы разрабатываете, и от платформы ОС, для которой вы разрабатываете. Например, если вы разрабатываете веб-сайт, вам не нужно слишком много знать об ОС. В этом примере вам нужно узнать больше о вашем веб-сервере. Вы должны знать, когда работаете в Windows, Linux или Android или какой-либо встроенной системе, или вам не нужно ничего знать, кроме того, что предоставляет ваш API. В общем, для разработчика или специалиста CS всегда полезно знать следующее.

  • В чем заключается ответственность приложения, инструментальной цепочки, а затем ОС.
  • Взаимодействие между процессами и другой механизм IPC, который предоставляет системные вызовы ОС.

ОС - довольно интересный предмет, но в основном состоит из теории, но эта теория начинает действовать, когда вы работаете над встроенными системами. В среднем для настольных приложений вы не видите, куда вписывается вся эта теория.

Ответ 4

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

Если вы заботитесь о производительности.

  • Стоимость пользовательских/системных переходов
  • Как os обрабатывает блокировку/потоки/взаимоблокировки и как их наилучшим образом использовать.
  • Виртуальная память/пейджинг/перехват и стоимость.
  • Распределение памяти, как это делает os, и как вы должны использовать это, когда A, использовать распределитель ОС (см. 1) и когда выделять из os и sub allocate.
  • Как ранее было сказано, процесс создания/взаимодействия между процессами.
  • Как os пишет/читает на диск по умолчанию для оптимального чтения/записи (см., почему базы данных используют B-деревья)
  • Бонус, sub-os, размер кеша и строки кеша могут означать для вас с точки зрения производительности.

но, как правило, это сводится к тому, что ОС предоставляет вам то, что не является общим, и что и почему оно стоит, и что будет стоить слишком много (слишком много CPU, слишком много дискового пространства, слишком много io, слишком много сетевого ect).

Ответ 5

Ну, это зависит от необходимости разработчика: -

Точка.

Приложения, такие как веб-браузеры и средства электронной почты, выполнение все более важной роли в современном настольном компьютере системы. Чтобы выполнить эту роль, они должны быть включены как часть операционная система. Таким образом, они могут обеспечить лучшую производительность и лучшей интеграции с остальной частью системы. Кроме того, эти важные приложения могут иметь одинаковую внешность и системного программного обеспечения.

Counterpoint.

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

enter image description here

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

Ответ 6

Я бы начал с Что каждый программист должен знать о памяти. (Не полностью ОС, но все это полезная информация. В главе 4 рассматривается виртуальная память, что является первым, что пришло мне в голову при чтении вашего вопроса.)

Чтобы узнать остальное по частям, выберите любой системный вызов и узнайте, что он делает. Это часто подразумевает изучение объектов ядра, с которыми он манипулирует.

Конечно, детали будут отличаться от ОС к ОС... Но так же и ответ на ваш вопрос.

Ответ 7

Проще говоря:

Темы и процессы.

Ядро/потоки vs пространство пользователя/потоки (возможно, некоторое программирование на уровне ядра)

Далее следуют самые фундаментальные концепции взаимоблокировок процесса.

И после этого мониторы против семафоров против mutex

Как работает память и разговаривает с процессом и устройствами.

Ответ 8

Каждый программист-самоучка и компьютерный ученый должны знать модель OSI и хорошо ее знать. Это помогает определить, где может быть проблема, и с кем связаться, если есть проблемы. Область определения определена здесь, и многие проблемы могут быть отфильтрованы здесь. Это связано с тем, что в операционной системе слишком много всего, чтобы просто изучить все это. Как веб-разработчик, я обычно работаю на уровне приложений, когда проблема выходит из этой области. Я знаю, когда мне нужна помощь. Также многие люди просто не заботятся о некоторых компонентах, которые они хотят создать как можно быстрее. Модель OSI - это место, где кто-то может найти свою горячую точку компьютера. http://en.wikipedia.org/wiki/OSI_model