Какие концепции операционной системы должны знать каждый программист?
Я собираю различные списки компетенций, которые должны быть у программистов, которым нужно заниматься самостоятельно.
Среди всех тем операционные системы являются самыми сложными, потому что создание даже игрушечной операционной системы - довольно нетривиальная задача. Однако в то же время разработчик приложений (который, возможно, не формально изучил CS), по крайней мере, должен знать и, надеюсь, должен был реализовать некоторые ключевые концепции, чтобы оценить, как работает ОС, и быть лучшим разработчиком.
У меня есть несколько конкретных вопросов:
- Какие ключевые понятия для операционных систем важны для программиста, которому требуется самообучение, чтобы понимать, что они могут быть лучшими разработчиками программного обеспечения (хотя и работают над обычной разработкой приложений)?
- Возможно ли даже дистанционно изучить такой предмет в практических произведениях размером в байт? (Даже такой объект, как построение компилятора, может быть изучен руками, на довольно низком уровне сложности).
Ответы
Ответ 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