Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

«ФУНКЦИИ ОПЕРАЦИОННЫХ СИСТЕМ ПЕРСОНАЛЬНЫХ КОМПЬЮТЕРОВ»

Содержание:

Введение

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

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

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

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

В данной работе делается обзор функций, предоставляемых современными операционными системами, и приводятся примеры реализации данных функций применительно к двум распространенным в настоящее время ОС – Microsoft Windows и Linux. Так как каждая из данных операционных систем имеет множество версий, то возьмем в качестве эталона сравнения версии Microsoft Windows 10 и Gentoo Linux на июнь 2019 года.

1 Функции операционной системы

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

Когда включается современный (IBM PC-совместимый) компьютер, то, как правило, первым начинает исполняться программа, записанная в специальной микросхеме на его материнской плате. Ранее, данная программа называлась BIOS, а сейчас все чаще используется более новая версия данной программы под названием UEFI. Самая важная задача BIOS или UEFI состоит в инициализации оборудования материнской платы. Так как ни одна программа не может работать с абсолютно любым оборудованием, которое только существует на свете, то для конкретной материнской платы применяется конкретный код UEFI. Он знает, что нужно делать с тем оборудованием, которое установлено именно на данной плате.

Как правило, UEFI имеет довольно небольшой объем (в современных версиях – несколько мегабайт или десятков мегабайт), следовательно, он не может (сам) предоставить пользователю весь тот богатый набор функций, который для него необходим. Именно поэтому, в конце своей работы UEFI загружает из определенного пользователем места специальную программу, которая и называется операционной системой.

Таким образом, операционная система начинает работу в некоей «инициализированной» системе, то есть, системе, в которой еще нет ни одной программы, однако все имеющееся на материнской плате оборудование уже готово к работе. Важно понимать, что это не относится к оборудованию, которое к компьютеру добавил пользователь. Например, если пользователь вставил в слот расширения материнской платы видеокарту Radeon, то UEFI не сможет ее инициализировать, так как не знает, что это за видеокарта (хотя он может вызвать программу инициализации данной видеокарты, если она находится внутри еще одной микросхемы, уже на самой видеокарте).

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

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

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

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

Наконец, еще одной задачей операционной системы является обеспечение взаимодействия между различными программами. Например, пользователь может с помощью программы FineReader отсканировать фотографию, потом обработать ее в программе Adobe Photoshop, вставить картинку в свой реферат, написанный в Microsoft Word, а затем отправить его по почте преподавателю в программе Mozilla Thunderbird. Все эти программы должны понимать друг друга. Например, программа FineReader должна уметь сохранять отсканированный файл так, чтобы программа Adobe Photoshop смогла его найти, и открыть. Программа Mozilla Thunderbird должна отправлять письмо в таком формате, чтобы его смогла открыть другая почтовая программа на сервере университета.

Для обеспечения этой задачи (обеспечение взаимодействия между программами), в любой многозадачной информационной системе есть некие соглашения (интерфейсы), которыми каждая из программ должна пользоваться. Например, программа Finereader не может напрямую обратиться к секторам жесткого диска, и записать туда файл с отсканированным изображением. Она должна попросить ОС записать ей файл, и, скорее всего, потом этот запрос будет передан драйверу файловой системы и (далее) жесткого диска. Таким образом, файлы на жестком диске оказываются записанными в определенном формате, который затем могут прочитать любые другие программы. Программа Mozilla Thunderbird не может сама формировать сетевые пакеты, и отдавать их для передачи сетевой карте. Она должна попросить операционную систему, чтобы та передала данные на конкретный компьютер в Интернете, предоставив на них ссылку. Сами данные будут переданы единообразным, принятым в данной ОС способом, причем так, чтобы это не помешало в этот же момент передавать данные другим программам.

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

  1. Обеспечение интерфейса между пользователем, и аппаратным обеспечением компьютера;
  2. Обеспечение интерфейса между пользователем и программным обеспечением;
  3. Обеспечение интерфейса между программами, и аппаратными ресурсами компьютера;
  4. Обеспечение взаимодействия между различными программами.

В дальнейших разделах курсовой работы мы рассмотрим каждую из данных функций более подробно.

2 Интерфейс между пользователем и аппаратным обеспечением

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

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

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

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

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

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

Так как каждая операционная система предъявляет свои требования к формату драйверов, и предоставляет свой унифицированный интерфейс для работы с оборудованием, то драйвера, как правило, выпускаются в нескольких вариантах, в зависимости от используемой ОС. Чаще всего, драйвера на сайте производителя выпускаются под три самых популярных ОС – Windows, Linux и Mac OS. Например, на рисунке ниже представлен сайт производителя материнских плат Gigabyte, где можно скачать драйвера на модуль Wi-Fi, расположенный на материнской плате модели X570 AORUS MASTER.

Рис. 1 – Драйвера для модуля Wi-Fi для материнской платы X570 AORUS MASTER с сайта производителя, фирмы Gigabyte

Как можно видеть из рисунка, данная фирма предлагает драйвера для своего модуля Wi-Fi лишь для операционных систем семейства Microsoft Windows. Однако это не означает, что в ОС Linux нельзя пользоваться данным модулем. Как указано на рисунке, данный модуль выпущен фирмой Intel, и, скорее всего, на сайте фирмы Intel можно найти драйвер под ОС Linux (либо он просто встроен в систему изначально).

После того, как мы загрузим и установим данный драйвер в операционную систему, она (и все программы в ней) смогут работать с нашим модулем Wi-Fi и передавать данные по сети.

3 Интерфейс между пользователем и программным обеспечением

Любая операционная система должна позволять пользователю взаимодействовать с собой (а иначе компьютер превращается в никому не нужный черный ящик).

Более старые операционные системы для обеспечения данной цели имели специальную оболочку, позволявшую пользователю на специальном языке писать команды, которые ОС могла исполнять. Ниже представлен пример такого «диалога» между пользователем и операционной системой:

Рис. 2 – Диалог пользователя с операционной системой IBM PC-DOS 1.0. Пользователь ввел команду, чтобы получить список файлов на диске

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

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

Рис. 3 – Пример графического интерфейса пользователя в ОС Linux, с применением рабочего стола KDE

Как видно на рисунке, данный способ является гораздо более наглядным. Если мы не знаем, что делает команда DIR в операционной системе MS-DOS, мы никогда бы не узнали, что происходит на рисунке 2. Однако когда мы смотрим на рисунок 3, мы сразу же понимаем, что в правом верхнем углу находятся часы, а в центре – какой-то диалог, в котором можно выбрать один из девяти вариантов.

Практически все современные операционные системы предоставляют пользователю графический интерфейс. Однако не следует думать, что этот интерфейс является панацеей, и текстовые команды больше не нужны. На самом деле, даже самый тщательно продуманный графический интерфейс пользователя не может перекрыть все возможные варианты использования компьютера, поэтому даже в самой современной операционной системе всегда существуют специальные программы, имитирующие старый механизм взаимодействия – с помощью команд. В операционной системе Microsoft Windows это программы CMD и PowerShell, а в ОС Linux – например, Bash или Tcsh. Естественно, сегодня умение работать в таких программах больше не является необходимостью, однако они могут быть весьма полезны, так как иногда позволяют сделать работу быстрее и качественнее.

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

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

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

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

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

Однако в современных ОС все значительно сложнее по нескольким причинам.

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

Поэтому в современных ОС применяются библиотеки на уровне системы. Часто используемые библиотеки, такие как .NET Framework в ОС Windows, или, например, libpng в ОС Linux устанавливаются в каталог с библиотеками операционной системы, и ими может пользоваться любая программа. Естественно, если программа пользуется такими библиотеками, ее уже нельзя просто передавать в виде каталога с файлами. Нужно проверить, есть ли в системе такая библиотека, а если ее нет, то скачать ее из Интернета, или хотя бы вывести ошибку пользователю.

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

В данной области ответственности операционных систем наиболее ярко проявляются различия ОС Windows и ОС Linux.

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

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

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

Например, в дистрибутиве Gentoo Linux существует пакетный менеджер Portage. С помощью данной программы можно установить любое приложение, входящее в состав репозитория, который в данном дистрибутиве называется «коллекция портов». Чтобы установить приложение, нужно отдать всего одну команду. После этого будут скачаны исходные коды данного приложения (как правило, с сайта GITHUB), оно будет скомпилировано, и установлено в систему. В процессе установки, данное приложение запомнит, какие файлы и куда были установлены, и запишет данную информацию в базу данных. Затем, при возможном удалении приложения, весь список файлов приложения будет удален. Пример начала установки приложения Midnight Commander (mc) показан на рисунке:

Рис. 4 – Обновление Midnight Commander в ОС Gentoo Linux с помощью пакетного менеджера Portage

Использование данного подхода имеет множество преимуществ. Перечислим лишь некоторые из них:

  1. При удалении, все файлы приложения удаляются полностью, причем это не зависит от создателя приложения;
  2. Приложение компилируется из исходных кодов, следовательно, перед установкой можно убедиться, что в нем не содержится никаких уязвимостей (хотя, конечно, редко кто будет просматривать исходный код, но в принципе это возможно). Кроме этого, приложение будет скомпилировано именно под нужную архитектуру и с нужным набором опций;
  3. В отличие от ОС Windows, здесь нельзя поймать вирус, пока ты ищешь сайт программы, и скачиваешь дистрибутив. Все они уже добавлены разработчиками, а у каждого пакета прописана контрольная сумма.

Из-за преимуществ данного подхода, разработчики ОС Windows также добавили некоторые возможности такого «пакетного менеджера» в последнюю версию операционной системы (хотя пока он лишь скачивает готовые приложения, а не компилирует их). Этот пакетный менеджер называется Chocolatey, но пока о нем мало кто знает.

Ниже, на изображении показано обновление установленных ранее при помощи данного пакетного менеджера приложений, используя PowerShell:

Рис. 5 – Обновление Adobe Reader с помощью пакетного менеджера Chocolatey

Логично, что в многозадачных операционных системах нельзя предоставлять программам монопольный доступ к оборудованию. Оборудование может быть нужно одновременно нескольким программам, и нужно уметь «делить его на части» - например, в случае сетевой карты, сетевые пакеты от различных программ должны уметь перемешиваться, а не ждать друг друга. Это приводит к следующей функции, которой должны обладать все операционные системы – обеспечение интерфейса между программами и аппаратными ресурсами компьютера.

4 Интерфейс между программами и аппаратным обеспечением

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

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

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

Кроме монитора, программы могут конкурировать и за другие ресурсы – клавиатуру, мышь, оперативную память, место на жестком диске, и так далее. Ниже мы рассмотрим несколько примеров того, как операционная система не позволяет программам конфликтовать из-за доступа к отдельным физическим ресурсам, предоставляя специальные абстракции.

4.1 Абстракция файловой системы

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

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

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

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

Так как файловых систем (ФС) существует достаточно много, а операционная система должна уметь работать с любой из них, то для каждой конкретной ФС также применяются драйвера. Хотя файловые системы не являются физическим устройством (в данном случае, устройством является жесткий диск), однако программы для работы с ними также называют драйверами. Например, в операционной системе Windows есть файл ntfs.sys, являющийся драйвером файловой системы NTFS, и говорящий ОС, как именно необходимо организовывать файлы на диске, с точки зрения данной ФС.

Самые распространенные файловые системы разнятся в зависимости от используемой ОС. Как правило, в операционной системе Windows применяются файловые системы NTFS или ReFS, а в семействе операционных систем Linux – ext2/3/4, BtrFS или ZFS.

Существуют особые файловые системы для конкретных случаев применения. Например, существуют следующие ФС:

    • Специальные файловые системы для хранения настроек или взаимодействия с ядром ОС. Примерами могут являться файловые системы /sys и /proc в ОС Linux, либо файл реестра в Windows;
    • Специальные файловые системы для флеш-устройств, обеспечивающие небольшое число операций чтения-записи (так как каждая флешка рассчитана хоть и на большое, но на конечное число таких циклов). Здесь применяются такие ФС как FAT32 или exFAT;
    • Специальные файловые системы для оптических дисков, которые, как правило, поддерживают лишь однократную запись, например, ISO9660;
    • Специальные файловые системы, не относящиеся к одной операционной системе, а допускающие работу сразу с несколькими физическими компьютерами. Сюда можно отнести такие ФС, как Lustre или Ceph. С их помощью можно создать некий «кластер», в котором файлы будут доступны даже при выходе нескольких компьютеров кластера из строя.

Файловые системы не обязательно должны привязываться к конкретным устройствам, жестким дискам. Например, можно взять обычный файл размером в несколько гигабайт, и создать «псевдо-ФС любого типа» внутри него. С точки зрения операционной системы Linux вообще нет никакой разницы, с какими данными работать – образом ФС, хранящейся внутри большого файла, или с обычной ФС, занимающей весь жесткий диск.

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

Любой файл текстового процессора Microsoft Word старого формата (с расширением .DOC), хотя и представляет собой один-единственный документ, внутри представлен как своя файловая система с файлами и каталогами. В этих каталогах, в частности, сохраняются вставленные в документ картинки и формулы, а также много другой информации.

4.2 Абстракция виртуальной памяти

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

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

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

Например, если программист написал программу, которой нужно 4 гигабайта памяти, то она либо откажется работать на системе, где памяти меньше (либо ее больше, но она занята другими программами), либо ему придется существенно ее переделывать, добиваясь снижения потребления памяти, возможно в ущерб быстродействию.

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

Для того же, чтобы решить вторую проблему, любая современная ОС предоставляет каждой программе максимально доступный объем памяти. В случае 32-разрядной операционной системы это байт памяти, или 4 Гигабайта (на самом деле, конечно меньше, так как сама ОС также занимает ее часть). Если система 64-разрядная, то теоретически, каждая программа может адресовать байт памяти, однако это настолько огромное число, что, как правило, истинный объем существенно меньше этого числа (но тем не менее, гораздо больше чем байта).

Однако как операционная система может гарантировать каждой программе хотя бы 4 Гигабайта оперативной памяти, если физически в системе ее может быть гораздо меньше?

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

Для решения и этой проблемы существует такое понятие как «файл подкачки» (в Windows) или «своп-файл» (в Linux). Как только программы начинают требовать память в объеме большем, чем физически доступно на компьютере, ОС начинает переписывать самые редко используемые ее области на жесткий диск (Windows – в специальный файл pagefile.sys, а Linux – в раздел особого типа). Как только достаточный объем памяти оказывается на жестком диске, операционная система может повторно выделить данные области памяти другим процессам.

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

Конечно, процесс выгрузки памяти на жесткий диск, и ее обратной загрузки – это довольно небыстрый процесс (особенно по сравнению со скоростью работы самой оперативной памяти), следовательно, когда начинает использоваться файл подкачки, пользователь может заметить, что система начала «тормозить». Однако это гораздо лучше, чем если бы программы начали выдавать ошибки о недостаточном объеме памяти, и просто завершаться. Если же пользователю критична высокая скорость работы его системы, он может примерно рассчитать необходимый конкретно ему объем памяти, и докупить недостающее количество.

5 Интерфейс между различными программами

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

Однако понятно, что иногда процессы должны взаимодействовать друг с другом. Было бы странно, если бы запустив программу FineReader, и отсканировав изображение, пользователь не смог бы открыть его в программе Adobe Photoshop, потому что это другая программа, и ей нельзя получить доступ к данным другой программы. Иногда необходимо обеспечить взаимодействие программ друг с другом, и это тоже одна из функций любой современной ОС.

Конечно, так как любая операционная система предоставляет абстракцию файловой системы, то теоретически, любое приложение может записать какой-либо файл, и позволить другому приложению его прочитать и обработать. Например, именно таким способом взаимодействия пользуются сайты в Интернете. Каждая страница сайта написана на специальном языке разметки страниц HTML, и если она хочет вставить на эту страницу что-нибудь отличное от текста, то она просто делает отсылку к другому файлу, расположенному где-то на файловой системе. Программа-браузер при отображении сайта скачивает все необходимые для Web-страницы файлы, и объединив их вместе, получает результат.

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

Операционная система Microsoft Windows позволяет организовать такое взаимодействие между программами с помощью еще одной абстракции под названием «Object Linking and Embedding», или, сокращенно, OLE.

Данная технология описывает, что должна уметь каждая программа, если она хочет, чтобы в нее можно было вставлять данные других программ (быть клиентом OLE, в данном случае Microsoft Word), либо чтобы ее собственные данные можно было внедрить куда-то еще (быть сервером OLE, в данном случае, какой-нибудь редактор изображений, например Paint).

Как правило, если не касаться деталей программной реализации, программа, желающая воспользоваться данным механизмом, должна уметь преобразовывать свой вывод в специальный формат Windows Metafile, по сути, являющийся векторным изображением.

Например, если мы работаем в программе Microsoft Word, и вставляем в него диаграмму. Если бы программа Word не понимала технологии OLE, то она либо должна была бы самостоятельно реализовывать работу с диаграммами, либо настраиваться на работу с конкретной программой, и работать с ней в связке. Но так как Word понимает технологию OLE, то он может посмотреть, какая программа отвечает за редактирование диаграмм (например, Microsoft Visio), и просто особым образом вызвать ее.

Когда мы построим какую-нибудь диаграмму в данной вызванной программе, мы закрываем ее, однако так как ее запустили в режиме OLE, программа не просто закрывается, а преобразует свои данные в формат векторного изображения Windows Metafile, и вместе со своими исходными данными, передает клиенту (которым в данном случае является программа Microsoft Word).

Этот текстовый процессор, получив данные программы (которые он не понимает, так как предназначен для редактирования текста, а не диаграмм), сохраняет их нетронутыми внутри своего документа .DOC или .DOCX, а вот возвращаемый программой векторный рисунок он отображает на месте внедренного объекта «Диаграмма». Пользователь не заметит разницы, так как этот векторный рисунок в точности повторяет то, что он видел, когда редактировал эту диаграмму в Microsoft Visio. А если он снова захочет изменить эту диаграмму, то Visio будет запущен снова, только в этот раз он получит свои данные, заранее сохраненные вместе с документом. Хотя сам текстовый процессор Microsoft Word не понимает их смысла, тем не менее, он знает, что программа Microsoft Visio умеет с ними работать, и для нее (и для пользователя) они что-то значат. Когда пользователь отредактирует диаграмму, ее измененные данные, и новое векторное изображение снова попадет в файл .DOC.

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

Заключение

В данной работе были рассмотрены основные функции операционных систем на примере современных их представителей – Microsoft Windows 10 и Gentoo Linux. Несмотря на то, что эти ОС довольно сильно отличаются друг от друга, по своим функциям они довольно схожи.

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

Если не учитывать личные предпочтения, то операционную систему можно выбирать по следующим объективным критериям:

- Поддержка имеющегося оборудования;

- Присутствие (или отсутствие) необходимых программ для данной ОС;

- Возможность купить лицензию в случае ОС Windows.

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

Список использованных источников

Бумажные источники

1. Дейтел, Х., М. Операционные системы. Основы и принципы. Т. 1 /
Х. М. Дейтел, Д.Р. Чофнес. - М.: Бином, 2016. - 1024 c.

2. Иртегов, Д. Введение в операционные системы / Д. Иртегов. - СПб.: BHV, 2012. - 1040 c.

3. Карасева, М.В. Операционные системы. Практикум для бакалавров / М.В. Карасева. - М.: КноРус, 2012. - 376 c.

4. Коньков, К.А. Устройство и функционирование ОС Windows. Практикум к курсу "Операционные системы": Учебное пособие / К.А. Коньков. - М.: Бином, 2012. - 207 c.

5. Ляхов Linux для начинающих / Ляхов, Дмитрий. - М.: Бестселлер; Издание 2-е, 2005. - 256 c.

6. Назаров, С.В. Современные операционные системы: Учебное пособие / С.В. Назаров. - М.: Бином. Лаборатория знаний, 2013. - 367 c.

7. Партыка, Т.Л. Операционные системы, среды и оболочки: Учебное пособие/Т.Л. Партыка, И.И. Попов. - М.: Форум, НИЦ ИНФРА-М, 2013. - 560 c.

8. Синицын, С.В. Операционные системы: Учебник для студентов учреждений высш. проф. образования / С.В. Синицын, А.В. Батаев, Н.Ю. Налютин. - М.: ИЦ Академия, 2012. - 304 c.

9. Скловская, С.Л. Команды Linux. Справочник / С.Л. Скловская. - М.: СПб: ДиаСофт; Издание 2-е, перераб. и доп., 2002. - 720 c.

10. Спиридонов, Э.С. Операционные системы / Э.С. Спиридонов, М.С. Клыков, М.Д. Рукин. - М.: КД Либроком, 2015. - 350 c.

11. Старовойтов Настройка аппаратных средств в Linux / Старовойтов, Алексей. - М.: СПб: БХВ, 2006. - 304 c.

12. Таненбаум, Э. Современные операционные системы / Э. Таненбаум. - СПб.: Питер, 2013. - 1120 c.

Электронные ресурсы

13. Gentoo Linux Handbook. Главная страница. – [электронный ресурс] - https://wiki.gentoo.org/wiki/Handbook:Main_Page/ru

14. Manpage of PORTAGE – [электронный ресурс] - https://dev.gentoo.org/~zmedico/portage/doc/man/portage.5.html

15. Разрушители легенд – Gentoo Linux – [электронный ресурс] - https://habr.com/ru/post/335022/