Ядро Linux и его функции — /dev/mem

Примечания

  1. ^ аб«Ядро». Linfo. Группа пользователей Bellevue Linux. Получено 15 сентября 2022.
  2. ^Рэндал Э. Брайант; Дэвид Р. О’Халларон (2022). Компьютерные системы: взгляд программиста (Третье изд.). Пирсон. п. 17. ISBN  978-0134092669.
  3. ^ср. Демон (вычисления)
  4. ^ абРох 2004
  5. ^ абcdежграммВульф, 1974, стр. 337–345
  6. ^ абЗильбершатц 1991
  7. ^Таненбаум, Эндрю С. (2008). Современные операционные системы (3-е изд.). Прентис Холл. С. 50–51. ISBN  978-0-13-600663-3. . . . почти все системные вызовы [вызываются] из программ C путем вызова библиотечной процедуры. . . Библиотечная процедура. . . выполняет инструкцию TRAP для переключения из пользовательского режима в режим ядра и начала выполнения. . .
  8. ^Деннинг 1976
  9. ^Swift 2005, стр.29 цитата: «изоляция, управление ресурсами, проверка решений (проверка) и устранение ошибок».
  10. ^Шредер 72
  11. ^ абЛипа 76
  12. ^Стефан Эраниан и Дэвид Мосбергер, Виртуальная память в ядре Linux IA-64, Prentice Hall PTR, 2002 г.
  13. ^Зильбершатц и Гальвин, Концепции операционных систем, 4-е изд., Стр. 445 и 446
  14. ^Хох, Чарльз; Дж. К. Браун (июль 1980 г.). «Реализация возможностей PDP-11/45». Обзор операционных систем ACM SIGOPS. 14 (3): 22–32. Дои:10.1145/850697.850701. S2CID  17487360.
  15. ^ абЯзыковой подход к безопасности, Шнайдер Ф., Морриссетт Г. (Корнельский университет) и Харпер Р. (Университет Карнеги-Меллона)
  16. ^ абcП. А. Лоскокко, С. Д. Смолли, П. А. Макельбауэр, Р. К. Тейлор, С. Дж. Тернер и Дж. Ф. Фаррелл. Неизбежность отказа: ошибочное предположение о безопасности в современных вычислительных средахВ архиве 2007-06-21 на Wayback Machine. В материалах 21-й Национальной конференции по безопасности информационных систем, страницы 303–314, октябрь 1998 г. [1].
  17. ^Лепро, Джей; Форд, Брайан; Хиблер, Майк (1996). «Постоянная актуальность локальной операционной системы для глобальных приложений». Труды 7-го семинара по европейскому семинару ACM SIGOPS Поддержка систем для всемирных приложений – EW 7. п. 133. Дои:10.1145/504450.504477. S2CID  10027108.
  18. ^Дж. Андерсон, Исследование планирования технологий компьютерной безопасностиВ архиве 2022-07-21 на Wayback Machine, Air Force Elect. Системное отделение, ESD-TR-73-51, октябрь 1972 г.
  19. ^* Джерри Х. Зальцер; Майк Д. Шредер (сентябрь 1975 г.). «Защита информации в компьютерных системах». Труды IEEE. 63 (9): 1278–1308. CiteSeerX  10.1.1.126.9257. Дои:10.1109 / PROC.1975.9939. S2CID  269166.
  20. ^Джонатан С. Шапиро; Джонатан М. Смит; Дэвид Дж. Фарбер (1999). «EROS: система быстрых возможностей». Труды семнадцатого симпозиума ACM по принципам операционных систем. 33 (5): 170–185. Дои:10.1145/319344.319163.
  21. ^Дейкстра, Э. В. Взаимодействующие последовательные процессы. Математика. Dep., Technological U., Эйндховен, сентябрь 1965 г.
  22. ^ абcdеБринч Хансен 70 с. 238–241
  23. ^«SHARER, система разделения времени для CDC 6600». Получено 2007-01-07.
  24. ^«Динамические супервайзеры – их конструкция и конструкция». Получено 2007-01-07.
  25. ^Байарди 1988
  26. ^ абЛевина 75
  27. ^Деннинг 1980
  28. ^Юрген Нехмер “Бессмертие операционных систем, или: оправданы ли исследования операционных систем? “, Конспект лекций по информатике; Vol. 563. Труды международного семинара по операционным системам 90-х годов и не только. С. 77–83 (1991) ISBN  3-540-54987-0 [2] цитата: «Последние 25 лет показали, что исследования архитектуры операционной системы оказали незначительное влияние на существующий основной поток [sic ] системы “.
  29. ^Леви 84, стр. 1 цитата: «Хотя сложность компьютерных приложений с каждым годом увеличивается, основная аппаратная архитектура приложений остается неизменной в течение десятилетий».
  30. ^ абcЛеви 84, стр. 1 цитата: «Обычные архитектуры поддерживают один привилегированный режим работы. Эта структура ведет к монолитной конструкции; любой модуль, нуждающийся в защите, должен быть частью единого ядра операционной системы.Если вместо этого любой модуль может выполняться в защищенном домене, системы могут быть построены как набор независимых модулей, расширяемых любым пользователем ».
  31. ^«Открытые источники: голоса революции открытого исходного кода». 1-56592-582-3. 29 марта 1999 г.
  32. ^Виртуальная адресация чаще всего достигается с помощью встроенного блок управления памятью.
  33. ^Записи дебатов между Торвальдсом и Таненбаумом можно найти на dina.dkВ архиве 2022-10-03 на Wayback Machine, groups.google.com, oreilly.com и Сайт Эндрю Таненбаума
  34. ^ абМэтью Рассел. «Что такое Дарвин (и как он работает в Mac OS X)». O’Reilly Media. цитата: «Сильно связанная природа монолитного ядра позволяет ему очень эффективно использовать базовое оборудование […] Микроядра, с другой стороны, запускают гораздо больше основных процессов в пользовательском пространстве. […] К сожалению, эти преимущества достигаются за счет того, что микроядру приходится передавать большой объем информации в пространство ядра и из него посредством процесса, известного как переключение контекста. Переключение контекста приводит к значительным накладным расходам и, следовательно, к снижению производительности ».
  35. ^«Операционные системы / модели ядра – Викиверситет». en.wikiversity.org.
  36. ^ абcdLiedtke 95
  37. ^Härtig 97
  38. ^Хансен 73, раздел 7.3 стр. 233 “взаимодействие между разными уровнями защиты требует передачи сообщений по значению
  39. ^Видео Apple WWDC (19 февраля 2022 г.). «Apple WWDC 2000, сессия 106 – Mac OS X: ядро» – через YouTube.
  40. ^KeyKOS Nanokernel АрхитектураВ архиве 2022-06-21 на Wayback Machine
  41. ^Ball: Конструкции встроенных микропроцессоров, стр. 129
  42. ^Хансен 2001 (OS), стр.17–18
  43. ^“BSTJ-версия документа C.ACM Unix”. bell-labs.com.
  44. ^Введение и обзор системы Multics, Ф. Х. Корбато и В. А. Высоцкий.
  45. ^ аб«Единая спецификация Unix». Открытая группа. Архивировано из оригинал на 2022-10-04. Получено 2022-09-29.
  46. ^Наивысший уровень привилегий имеет разные имена в разных архитектурах, например, режим супервизора, режим ядра, CPL0, DPL0, кольцо 0 и т. Д. Кольцо (компьютерная безопасность) для дополнительной информации.
  47. ^“Месть Unix”. asymco.com. 29 сентября 2022 г.
  48. ^Ядро Linux 2.6: оно того стоит!, Дэвид А. Уиллер, 12 октября 2004 г.
  49. ^Это сообщество в основном собирается в Добросовестная разработка ОС, Доска объявлений Mega-Tokyo и другие веб-сайты энтузиастов операционных систем.
  50. ^XNU: ядроВ архиве 2022-08-12 на Wayback Machine
  51. ^“Windows – официальный сайт ОС Microsoft Windows 10 Home и Pro, ноутбуков, ПК, планшетов и др.”. windows.com.
  52. ^«Семейство микроядер L4 – Обзор». os.inf.tu-dresden.de.
  53. ^“Микроядро Fiasco – Обзор”. os.inf.tu-dresden.de.
  54. ^Золлер (инактив), Хайнц (7 декабря 2022 г.). «L4Ka – Проект L4Ka». www.l4ka.org.
  55. ^«Операционные системы QNX». blackberry.qnx.com.

Рекомендации

  • Рох, Бенджамин (2004). «Монолитное ядро ​​против микроядра»(PDF). Архивировано из оригинал(PDF) на 2006-11-01. Получено 2006-10-12.
  • Зильбершац, Авраам; Джеймс Л. Петерсон; Питер Б. Гэлвин (1991). Понятия операционной системы. Бостон, Массачусетс: Аддисон-Уэсли. п. 696. ISBN  978-0-201-51379-0.
  • Болл, Стюарт Р. (2002) [2002]. Встроенные микропроцессорные системы: реальные проекты (первое изд.). Elsevier Science. ISBN  978-0-7506-7534-5.
  • Дейтель, Харви М. (1984) [1982]. Введение в операционные системы (пересмотренное первое издание). Эддисон-Уэсли. п.673. ISBN  978-0-201-14502-1.
  • Деннинг, Питер Дж. (Декабрь 1976 г.). «Отказоустойчивые операционные системы». Опросы ACM Computing. 8 (4): 359–389. Дои:10.1145/356678.356680. ISSN  0360-0300. S2CID  207736773.
  • Деннинг, Питер Дж. (Апрель 1980 г.). «Почему не инновации в компьютерной архитектуре?». Новости компьютерной архитектуры ACM SIGARCH. 8 (2): 4–7. Дои:10.1145/859504.859506. ISSN  0163-5964. S2CID  14065743.
  • Хансен, Пер Бринч (Апрель 1970 г.). «Ядро многопрограммной системы». Коммуникации ACM. 13 (4): 238–241. CiteSeerX  10.1.1.105.4204. Дои:10.1145/362258.362278. ISSN  0001-0782. S2CID  9414037.
  • Хансен, Пер Бринч (1973). Принципы операционной системы. Englewood Cliffs: Прентис Холл. п.496. ISBN  978-0-13-637843-3.
  • Хансен, Пер Бринч (2001). «Эволюция операционных систем»(PDF). Получено 2006-10-24.
  • включено в книгу: Пер Бринч Хансен, изд. (2001). “1”(PDF). Классические операционные системы: от пакетной обработки до распределенных систем. Нью-Йорк: Springer-Verlag. С. 1–36. ISBN  978-0-387-95113-3.

  • Герман Хертиг, Майкл Хохмут, Йохен Лидтке, Себастьян Шенберг, Жан Вольтер Производительность систем на основе μ-ядра, Хертиг, Германн; Хохмут, Майкл; Лидтке, Йохен; Шенберг, Себастьян (1997). «Производительность систем на основе μ-ядра». Материалы шестнадцатого симпозиума ACM по принципам операционных систем – SOSP ’97. п. 66. CiteSeerX  10.1.1.56.3314. Дои:10.1145/268998.266660. ISBN  978-0897919166. S2CID  1706253.
  • Обзор операционных систем ACM SIGOPS, версия 31, номер 5, стр. 66–77, декабрь 1997 г.

  • Ходек, М. Э., Солтис, Ф. Г., и Хоффман, Р. Л. 1981. IBM System / 38 поддерживает адресацию на основе возможностей. В материалах 8-го Международного симпозиума ACM по компьютерной архитектуре. ACM / IEEE, стр. 341–348.
  • Корпорация Intel (2002) Руководство разработчика программного обеспечения с архитектурой IA-32, том 1: Базовая архитектура
  • Левин, Р .; Cohen, E .; Corwin, W .; Pollack, F .; Вульф, Уильям (1975). «Разделение политики / механизма в Гидре». Симпозиум ACM по принципам операционных систем / Труды пятого симпозиума ACM по принципам операционных систем. 9 (5): 132–140. Дои:10.1145/1067629.806531.
  • Леви, Генри М. (1984). Компьютерные системы на основе возможностей. Мейнард, Массачусетс: Цифровая пресса. ISBN  978-0-932376-22-0.
  • Лидтке, Йохен. О конструкции µ-ядра, Proc. 15-й симпозиум ACM по принципам операционных систем (SOSP), Декабрь 1995 г.
  • Линден, Теодор А. (декабрь 1976 г.). «Структуры операционной системы для поддержки безопасности и надежного программного обеспечения». Опросы ACM Computing. 8 (4): 409–445. Дои:10.1145/356678.356682. HDL:2027 / mdp.39015086560037. ISSN  0360-0300. S2CID  16720589.
  • , «Структуры операционной системы для поддержки безопасности и надежного программного обеспечения»(PDF). Получено 2022-06-19.

  • Лорин, Гарольд (1981). Операционные системы. Бостон, Массачусетс: Аддисон-Уэсли. стр.161–186. ISBN  978-0-201-14464-2.
  • Шредер, Майкл Д.; Джером Х. Зальцер (март 1972 г.). «Аппаратная архитектура для реализации колец защиты». Коммуникации ACM. 15 (3): 157–170. CiteSeerX  10.1.1.83.8304. Дои:10.1145/361268.361275. ISSN  0001-0782. S2CID  14422402.
  • Шоу, Алан С. (1974). Логический дизайн операционных систем. Прентис-Холл. п.304. ISBN  978-0-13-540112-5.
  • Таненбаум, Эндрю С. (1979). Структурированная компьютерная организация. Энглвуд Клиффс, Нью-Джерси: Прентис-Холл. ISBN  978-0-13-148521-1.
  • Вульф, В.; Э. Коэн; В. Корвин; А. Джонс; Р. Левин; К. Пирсон; Ф. Поллак (июнь 1974 г.). «HYDRA: ядро ​​многопроцессорной операционной системы»(PDF). Коммуникации ACM. 17 (6): 337–345. Дои:10.1145/355616.364017. ISSN  0001-0782. S2CID  8011765. Архивировано из оригинал(PDF) на 2007-09-26. Получено 2007-07-18.
  • Baiardi, F .; А. Томази; М. Ваннески (1988). Architettura dei Sistemi di Elaborazione, том 1 (на итальянском). Франко Анджели. ISBN  978-88-204-2746-7. Архивировано из оригинал на 2022-06-27. Получено 2006-10-10.
  • Свифт, Майкл М .; Брайан Н. Бершад; Генри М. Леви. Повышение надежности серийных операционных систем(PDF).
  • Геттис, Джеймс; Карлтон, Филип Л .; МакГрегор, Скотт (1990). «Повышение надежности товарных операционных систем». Программное обеспечение: практика и опыт. 20: S35 – S67. Дои:10.1002 / spe.4380202204. Получено 2022-06-19.
  • «Транзакции ACM в компьютерных системах (TOCS), v.23 №1, стр. 77–110, февраль 2005».

Системы с монолитным ядром и с микроядром.

Оглавление

Гибкие материалы:  Сварочный кабель КГ, марки и характеристики, 1х16; 1х25; 1х35 и другие

Глава 1. Введение в операционные системы.. 2

1.1   Основные понятия операционных систем.. 2

1.2   Архитектура ОС.. 5

1.2.1.   Структура ОС Windows NT.. 10

1.2.2.   Системы с монолитным ядром и с микроядром. 11

1.2.3.   ОС с множественными интерфейсами прикладных программ на примере ОС Windows NT. 16

1.3   Процессы и потоки в ОС. 18

1.3.1    Понятие процесса. 18

.3.2. Атрибуты процесса. 19

1.3.3.   Создание нового процесса в различных ОС. 20

1.3.4. Жизненный цикл процесса. 21

1.3.5.   Состояние процессов. 23

1.3.6.   Понятие нити (Thread). Основные отличия нити от процесса. 24

1.3.7.   Необходимость синхронизации при работе с общими ресурсами. Способы синхронизации. 25

1.4   Механизмы синхронизации. 29

1.4.1    Понятие семафора. Двоичный семафор. 30

1.4.2     Понятие мьютекса (Mutex) и основные операции с ним. Пример использование мьютекса для синхронизации нитей. 33

1.4.3    Сравнение mutex и двоичного семафора. 40

1.5   Управление оперативной памятью.. 41

1.5.1    Виртуальная память. 45

1.5.2.   Сегментация памяти. 47

1.5.3    Алгоритмы подкачки. 48

Глава 2. Файловая система. 51

2.1   Понятия файловой системы.. 51

2.1.1    Многоуровневая файловая система. 55

2.1.2    Логическая ФС.. 56

2.1.3    Физическая файловая система. 57

2.2   Логические файловые системы.. 58

2.2.1 файловая система ОС UNIX.. 58

2.3   Физическая файловая система. 60

2.3.1     Файловая система FAT. 62

2.3.2    Файловая система EXT2. 65

2.3.3    Файловая система NTFS. 69

2.4   Управление безопасностью.. 73

2.4.1    Пользователь, его атрибуты и права доступа. 75

2.4.2    Аутентификация и авторизация. 79

2.4.3    Задача администрирования вычислительной системы и компьютерной сети. 82

2.5   Управление доступом к файлам в ОС Windows NT. Списки прав доступа. 85

Глава 3. Языки программирования. 87

3.1   Язык программирования Java. 87

3.1.1    Виртуальная машина Java. 88

3.2   Платформа .NET.. 89

3.2.1    Основные идеи и положения. 89

3.2.2    Схема выполнения программы в .NET. 90

3.3   Пользовательский интерфейс. 92

3.4   Управление оперативной памятью.. 94

Глава 4. Компьютерные сети. 95

4.1   Сетевая операционная система. 96

4.2   Протоколы TCP/IP. Интернет. 97

Глава 1. Введение в операционные системы

Основные понятия операционных систем

Понятие «операционные системы»:

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

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

Основные задачи ОС:

Ø поддержка работы программ; обеспечение их взаимодействия с аппаратной частью и друг с другом;

Ø защита ресурсов и информации;

Ø распределение ресурсов (процессорного времени, оперативной памяти, дискового пространства и т.п.); организация файловой системы (системы хранения данных на внешних носителях информации); учет использования ресурсов, управление видеосистемой;

Ø обработка ошибочных ситуаций;

Ø поддержка возможности для пользователя управлять машиной с помощью специальных команд (обработка командного языка в процедурной среде) или при помощи воздействия на определённые объекты (кнопки и др. в объектно-ориентированной среде);

Ø поддержка сети.

Основные функции ОС:

Ø Предоставление пользователю или программисту вместо реальной аппаратуры компьютера расширенной виртуальной машины, с помощью которой удобней работать;

Ø Управление ресурсами компьютера с целью повышения эффективности его использования.

Классификация ОС:

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

Ø Поддержка многозадачности.

По числу одновременно выполняемых задач операционные системы могут быть разделены на два класса:

ü однозадачные (например, MS-DOS, MSX);

ü многозадачные (OC EC, OS/2, UNIX, Windows 95).

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

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

Ø Поддержка многопользовательского режима.

 По числу одновременно работающих пользователей ОС делятся на:

ü однопользовательские (MS-DOS, Windows 3.x, ранние версии OS/2);

ü многопользовательские (UNIX, Windows NT).

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

Ø Вытесняющая и не вытесняющая многозадачность.

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

ü не вытесняющая многозадачность (NetWare, Windows 3.x);

ü вытесняющая многозадачность (Windows NT, OS/2, UNIX).

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

Ø Поддержка многонитевости.

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

Ø Многопроцессорная обработка.

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

Основные современные ОС:

ü Linux

ü Mac OS

ü Microsoft Windows NT

ü OS/2

ü Chrome OS

Архитектура ОС

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

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

ü модульная организация;

ü функциональная избыточность;

ü функциональная избирательность;

ü параметрическая универсальность;

ü концепция многоуровневой иерархической вычислительной системы, по которой ОС представляется многослойной структурой;

ü разделение модулей на две группы по функциям: ядро – модули, выполняющие основные функции ОС, и модули, выполняющие вспомогательные функции ОС;

ü разделение модулей ОС на две группы по размещению в памяти вычислительной системы: резидентные, постоянно находящиеся в оперативной памяти, и транзитные, загружаемые в оперативную память только на время выполнения своих функций;

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

Первые ОС разрабатывались как монолитные системы без четко выраженной структуры (рис. 1).

Для построения монолитной системы необходимо скомпилировать все отдельные процедуры, а затем связать их вместе в единый объектный файл с помощью компоновщика (примерами могут служить ранние версии ядра UNIX или Novell NetWare). Каждая процедура видит любую другую процедуру (в отличие от структуры, содержащей модули, в которой большая часть информации является локальной для модуля, и процедуры модуля можно вызвать только через специально определенные точки входа).

Ядро Linux и его функции — /dev/mem
Рис. 1. Монолитная архитектура

Такая организация ОС предполагает следующую структуру:

ü главная программа, которая вызывает требуемые сервисные процедуры;

ü набор сервисных процедур, реализующих системные вызовы;

ü набор утилит, обслуживающих сервисные процедуры.

В этой модели для каждого системного вызова имеется одна сервисная процедура. Утилиты выполняют функции, которые нужны нескольким сервисным процедурам(рис. 2).

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

 Модули ядра выполняют базовые функции ОС:

ü управление процессами,

ü памятью,

ü устройствами ввода-вывода и т.п.

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

Ядро Linux и его функции — /dev/mem
Рис. 2. Структурированная архитектура

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

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

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

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

Ядро Linux и его функции — /dev/mem
Рис. 3. Многослойная структура ОС

В данной схеме выделены следующие слои:

Ø Средства аппаратной поддержки ОС. Значительная часть функций ОС может выполняться аппаратными средствами.

Ø Машинно-зависимые модули ОС. Этот слой образует модули, в которых отражается специфика аппаратной платформы компьютера. Назначение этого слоя – “экранирование” вышележащих слоев ОС от особенностей аппаратуры.

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

Ø Менеджеры ресурсов. Модули этого слоя выполняют стратегические задачи по управлению ресурсами вычислительной системы.

Ø Интерфейс системных вызовов. Это верхний слой ядра ОС, взаимодействующий с приложениями и системными утилитами, он образует прикладной программный интерфейс ОС.

Повышение устойчивости ОС обеспечивается переходом ядра в привилегированный режим. При этом происходит некоторое замедление выполнения системных вызовов. Системный вызов привилегированного ядра инициирует переключение процессора из пользовательского режима в привилегированный, а при возврате к приложению – обратное переключение. За счет этого возникает дополнительная задержка в обработке системного вызова (рис. 4). Однако такое решение стало классическим и используется во многих ОС (UNIX, VAX, VMS, IBM OS/390, OS/2 и др.).

Ядро Linux и его функции — /dev/mem
Рис. 4. Обработка системного вызова

Различают несколько различных типов ОС:

Ø Монолитные системы. В этом случае вся операционная система представляет собой единую программу. Перед использованием ее необходимо откомпилировать и собрать. Таким образом, установка такой системы на определенный компьютер начинается с получения всех модулей, необходимых для обслуживания оборудования. Далее, необходимо описать все имеющиеся оборудования в соответствующих файлах. После этого запускается процесс компиляции и сборки ядра. В результате,можно начинатьработу. Процедуру необходимо повторить при любом изменении аппаратуры, например, добавлении нового диска. С одной стороны, это очень надежное решение, с другой стороны,оно не подходит для начинающих пользователей. Так были устроены ОС IBM/360, ранние версии UNIX, первые версии NovellNetware.

Ø Модульные операционные системы. Такие системы имеют четко выстроенную многоуровневую структуру, снизу – вверх, от аппаратуры до системных абстракций, таких как файлы и процессы. Впрочем, не всегда такие системы позволяют динамически подгружать дополнительные модули в четко определенных местах, например, драйверы устройств. Такую структуру имеют большинство современных универсальных операционных систем, например,MicrosoftWindowsNT, Linux, большинство версий UNIX.

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

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

Ø Виртуальные машины. Операционная система предоставляет пользователю некоторую виртуальную машину, например, Windows. В принципе, она могла бы представлять виртуальный компьютер, например, ПК, с набором соответствующего оборудования. Зачемэто было бы нужно? Например, чтобы поставить в нее еще одну версию ОС. Такие виртуальные машины часто используются на крупных серверах провайдеров Интернет. При этом пользователи, выставляющие свой сайт в Интернет, получают в свое распоряжение виртуальный компьютер, на который они ставят нужное программное обеспечение. Такой виртуальный компьютер может «упасть»или «зависнуть», может быть даже перезапущен без каких-либо последствий для ОС сервера и других виртуальных компьютеров.

Аналогичная техника используется в современной Java технологии, где приложения исполняются на виртуальной машине (JVM). Фирма Microsoft разработала свою технологию .NET, во многом похожую на Java.

Структура ОС Windows NT

Операционная система WindowsNTявляется системой с множественными интерфейсами прикладных программ. Это означает, что собственный API у нее конечно есть, но он никогда не публиковался и не описывался. Он отличается в различных версиях системы (NT, 2000, XP, Vista, 7).

Прикладные программы Windows работают с APIWin32, который опубликован и хорошо описан. В отличии от APIUNIX, в котором около 200 функций, в APIWin32 их несколько тысяч, многие из которых дублируются, а некоторые и вовсе ничего не делают, а сохранились для совместимости с ранними версиями Windows. Win32реализован в виде набора библиотек динамической загрузки(DLL).

Наряду с APIWin32 ОС WindowsNT поддерживает и другие API. Подсистема OS/2 поддерживает API операционной системы OS/2 версии 1.х, подсистема POSIX позволяет исполнять приложения POSIX, т.е. приложения, написанные для ОС UNIX. Подсистемы OS/2 и POSIX реализованы также в виде набора библиотек динамической загрузки. Список поддерживаемых API, при необходимости, может быть расширен.

Основные особенности архитектуры WindowsNT:

Ø слой HAL (HardwareAbstractionLayer) преобразует оборудование компьютера в некоторую виртуальную машину. Все модули, расположенные выше, аппаратно независимы, что обеспечивает переносимость операционной системы;

Ø Ядро (Kernel). WindowsNT использует микроядро, реализующее только минимальные функции ОС – диспетчеризация нитей и синхронизация процессоров. Все остальные функции делает исполнительная система;

Ø Исполнительная система (Executiveservices) содержит исполнительные подсистемы, число которых зависит от версии ОС. В них входят:

ü Менеджер ввода/вывода (вместе с драйверами устройств);

ü Менеджер объектов;

ü Менеджер безопасности;

ü Подсистема управления процессами;

ü Подсистема локальных вызовов между процессами;

ü Подсистема управления виртуальной памятью.

Системы с монолитным ядром и с микроядром.

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

1. Монолитное ядро ОС.Представляет богатый набор оборудования. Все компоненты монолитного ядра находятся в одном адресном пространстве. Эта схема ОС, когда все части ее ядра – это составные части одной программы. Монолитное ядро – самый старый способ организации ОС.

Достоинства:высокая скорость работы, простая разработка модулей.

Недостатки:Ошибка работы одного из компонентов ядра нарушает работу всей системы.

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

3. Микроядро ОС.Представляет только основные функции управления процессами и минимальный набор для работы с оборудованием. Классические микроядра дают очень небольшой набор системных вызовов.

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

Недостатки:Передача информации требует больших расходов и большого количества времени.

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

5. Гибридное ядро ОС.Модификация микроядер, позволяющая для ускорения работы впускать несущественные части в пространство ядра. На архитектуре гибкого ядра построены последние операционные системы от Windows, в том числе и Windows 7-10.

Как правило, современные операционные системы состоят из множества взаимосвязанных модулей, каждый из которых можно условно отнести к одной из двух групп:

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

Ø модули,выполняющие вспомогательные функции ОС (например, дефрагментация диска, архивация, текстовый редактор и др.).

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

Ядро Linux и его функции — /dev/mem

Рис. 5. Нечеткость границы между ОС и приложениями

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

Некоторая программа может существовать определенное время как пользовательское приложение, а потом стать частью ОС, или наоборот. Ярким примером такого изменения статуса является Microsoft Web-Browser, который сначала поставлялся как отдельное приложение, затем стал частью операционных систем Windows.

 Вспомогательные модули ОС обычно подразделяются на следующие группы:

ü утилиты — программы, решающие отдельные задачи управления и сопровождения компьютерной системы, такие как программы сжатия дисков, архивирования данных на магнитную ленту;

ü системные обрабатывающие программы — текстовые или графические редакторы, компиляторы, компоновщики, отладчики;

ü программы предоставления пользователю дополнительных услуг — специальный вариант пользовательского интерфейса, калькулятор и даже игры;

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

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

Ядро Linux и его функции — /dev/mem

Рис. 6. Взаимодействие между ядром и вспомогательными модулями ОС.

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

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

§

Windows NT является 32-разрядной операционной системой с приоритетной многозадачностью. В качестве фундаментальных ком­понент в состав операционной системы входят средства обеспече­ния безопасности и развитый сетевой сервис. Windows NT обеспечивает совместимость со многими другими операционными и файловыми системами, а также с сетями. Windows NT способна функционировать как на компьютерах, оснащенных CISC — про­цессорами со сложной системой команд (complex instruction set computing), так и на компьютерах сRISC — процессорами, имею­щими сокращенный набор инструкций (reduced instruction set com­puting). Операционная система Windows NT в свою очередь поддерживаетвысокопроизводительные системы с мультипроцессорной конфигу­рацией.

Задачи, поставленные при создании Windows NT.

Систе­ма Windows NT не является дальнейшим развитием ранее существо­вавших продуктов. Ее архитектура создавалась заново с учетом предъявляемых к современной операционной системе требований. Особенности системы, разработанной на основе этих требований, следующие. Стремясь обеспечить совместимостьновой операционной сис­темы, разработчики Windows NT сохранили привычный интерфейс Windows и реализовали поддержку существующих файловых систем (таких, как FAT) и различных приложений (написанных для MS-DOS, OS/2 1.x, Windows 3.x и POSIX). Разработчики также включи­ли в состав Windows NT средства работы с различными сетевыми средствами.

Достигнута переносимость(portability) системы, которая может теперь работать как на CISC, так и на RISC-процессорах. К CISC относятся Intel-совместимые процессоры 80386 и выше. RISC пред­ставлены системами с процессорами MIPS R4000, Digital Alpha AXP и Pentium серии Р54 и выше.

Масштабируемость(scalability) означает, что Windows NT не привязана к однопроцессорной архитектуре компьютеров, а способ­на полностью использовать возможности, предоставляемые симмет­ричными мультипроцессорными системами. В настоящее время Windows NT может функционировать на компьютерах с числом процессоров от 1 до 32. Кроме того, в случае усложнения стоящих перед пользователями задач и расширения предъявляемых к компь­ютерной среде требований, Windows NT позволяет легко добавлять более мощные и производительные серверы и рабочие станции корпоративной сети.

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

Windows NT имеет однородную систему безопасности(security), удовлетворяющую спецификациям правительства США и соответст­вующую стандарту безопасности В2. В корпоративной среде крити­ческим приложениям обеспечивается полностью изолированное окружение.

Распределенная обработка(distributed processing) означает, что Windows NT имеет встроенные в систему сетевые возможности. Windows NT также позволяет обеспечить связь с различными типа­ми хост-компьютеров благодаря поддержке разнообразных транс­портных протоколов и использованию средств «клиент-сервер» вы­сокого уровня, включая именованные каналы, вызовы удаленных процедур (RPC — remote procedure call) и Windows-сокеты.

Надежность и отказоустойчивость(reliability and robustness) обеспечиваются архитектурными особенностями, которые защищают прикладные программы от повреждения друг другом и операционной системой. Windows NT использует отказоустойчивую структурированную обработку особых ситуаций на всех архитектурных уровнях, которая включает восстанавливаемую файловую систему NTFS и обеспечивает защиту с помощью встроенной системы безопасности и усовершенствованных методов управления памятью.

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

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

В пакет входит ряд прикладных программ: Internet Information Server 2.0, Index Server, FrontPage, Internet Explorer, Domain Name System (DNS) Server, Proxy Server и Internet Resource Center, все пакеты Service Pack, Plus! и ряд дополнительных утилит, среди кото­рых имеются как новые, например, Administrative Wizards или Imager, так и усовершенствованные версии старых программ, например, Task Manager.

Administrative Wizard позволяет автоматизировать типичные задачи, возникающие при управлении сетью, а обновленные версии программ Windows NT Diagnostic, Perfomance Monitor служат для оперативного контроля за состоянием системы. Диалоговое окно Task Manager трансформировалось в мощную программу, которая предоставляет массу полезной информации — от степени загружен­ности процессора до имен всех активных системных процессоров.

Сочетание мощной сетевой ОС и графического интерфейса, со­зданного для неквалифицированных пользователей, выглядит до­вольно непривычно. Windows NT 4.0 — это не просто очередная версия популярной операционной системы. Она представляет собой основу для нового поколения программных продуктов, ориентиро­ванных на работу в сети Internet.

Процессы и потоки в ОС.

Понятие процесса

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

Процесс (задача) – программа, находящаяся в режиме выполнения.

С каждым процессом связывается его адресноепространство, из которого он может читать и в которое он может писать данные.

Адресное пространство содержит:

ü саму программу;

ü данные к программе;

ü стек программы;

С каждым процессом связывается набор регистров, например:

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

Ø указатель стека и т. д.

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

Некоторые поля таблицы:

Управление процессом Управление памятью Управление файлами
Регистры
Счетчик команд
Указатель стека
Состояние процесса
Приоритет
Параметры планирования
Идентификатор процесса
Родительский процесс
Группа процесса
Время начала процесса
Использованное процессорное время
Указатель на текстовый сегмент
Указатель на сегмент данных
Указатель на сегмент стека
Корневой каталог
Рабочий каталог
Дескрипторы файла
Идентификатор пользователя
Идентификатор группы

Атрибуты процесса

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

Ø Идентификатор родительского процесса. Идентификатор процесса, породившего данный процесс.

Ø Приоритет процесса.Относительный приоритет процесса, учитываемый планировщиком при определении очередности запуска.

Ø Терминальная линия. Терминал или псевдотерминал, ассоциированный с процессом, если такой существует.

Ø Реальный и эффективный идентификаторы пользователя. Реальным идентификатором пользователя данного процесса является идентификатор пользователя, запустившего процесс. Эффективный идентификатор служит для определения прав доступа процесса к системным ресурсам (в первую очередь к ресурсам файловой системы).

Ø Реальный и эффективный идентификаторы группы. Реальный идентификатор группы равен идентификатору первичной или текущей группы пользователя, запустившего процесс. Эффективный идентификатор служит для определения прав доступа к системным ресурсам по классу доступа группы.

Основные события, приводящие к созданию процессов:

ü Инициализация системы;

ü Выполнение изданного работающим процессом системного запроса на создание процесса;

ü Запрос пользования на создание процесса;

ü Инициирование пакетного задания;

§

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

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

Жизненный цикл процесса

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

Состояния процесса:

Ø Осуществление в пользовательском режиме. При этом процессором выполняются прикладные инструкции данного процесса.

Ø Выполнение в режиме ядра.Тем временем процессом выполняются системные инструкции ядра от имени процесса. Существуют всего три события, при которых выполнение процесса переходит в режим ядра: аппаратные прерывания, особые ситуации и системные вызовы.

Ø Отстаивает очередь на выполнение. Процесс не выполняется, но готов к запуску (обладает всеми необходимыми ему ресурсами, кроме процессора), как только планировщик выберет его (состояние runnable).

Ø Нахождение в состоянии сна (asleep), ожидая недоступного в данный момент ресурса, например, завершения операции ввода-вывода.

Ø Возвращение из режима ядра в режим задачи.Однако ядро прерывает его и производит переключение контекста для запуска более приоритетного процесса.

Ø В данный моментсоздан системным вызовом fork и находится в переходном состоянии: он существует, но не готов к запуску и не находиться в состоянии сна.

Ø Состояние зомби (zombie, defunct). Как такового процесса не существует, но остаются записи, содержащие код возврата и временную статистику его выполнения, доступную для родительского процесса. Это состояние является конечным в жизненном цикле процесса (рис. 8).

Ядро Linux и его функции — /dev/mem

Рис. 8. Жизненный цикл процесса

Процесс начинает свой жизненный путь с состояния 6, когда родительский процесс выполняет системный вызов fork. После того как создание процесса полностью завершено, процесс завершает “дочернюю часть” вызова fork и переходит в состояние 3 (готовность к запуску), ожидая своей очереди на выполнение. Когда планировщик выбирает процесс для выполнения, он переходит в состояние 1, и далеевыполняется в пользовательском режиме.

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

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

Когда ресурс становиться доступным, ядро “пробуждает процесс“, используя вызов wakeup, помещает его в очередь на выполнение, и процесс переходит в состояние 3 (готовность к запуску).

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

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

Состояние процессов

Три состояния процесса (рис. 9):

ü Выполнение (занимает процессор);

ü Готовность (процесс временно приостановлен, чтобы позволить выполняться другому процессу);

ü Ожидание (процесс не может быть запущен по своим внутренним причинам, например, ожидая операции ввода/вывода).

Ядро Linux и его функции — /dev/mem

Рис. 9. Состояние процесса

Возможные переходы между состояниями:

ü Процесс блокируется, ожидая входных данных

ü Планировщик выбирает другой процесс

ü Планировщик выбирает этот процесс

ü Поступили входные данные

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

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

§

Для того чтобы, структурировать свое понимание – что представляют собой threads (в переводе на русский язык – «нити», «потоки») и определить, чем они отличаются от процессов, можно воспользоваться следующими двумя определениями:

Ø Thread – это виртуальный процессор, имеющий свой собственный набор регистров, аналогичных регистрам настоящего центрального процессора. Один из наиважнейших регистров у виртуального процессора, как и у реального – это индивидуальный указатель на текущую инструкцию (например, индивидуальный регистр EIP на процессорах семейства x86);

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

Важно понять следующее: thread – это концептуально виртуальный процессор, и когда мы пишем реализацию threads в ядре ОС или в user-level библиотеке, то мы решаем именно задачу «размножения» центрального процессора во многих виртуальных экземплярах, которые логически или даже физически (на SMP, SMT и multi-core CPU платформах) работают параллельно друг с другом.

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

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

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

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

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

При взгляде на исходный материал, например, ядра Windows, можно заметить, что адресное пространство и прочие структуры процесса конструируются до создания в нем начальной нити (начальной thread для этого процесса). По сути, изначально в процессе не существует threads. В Windows можно создать thread в чужом адресном пространстве через user-level API.

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

§

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

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

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

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

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

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

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

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

Способы синхронизации:

Ø Синхронизация. Семафор

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

       Семафор – это объект операционной системы, состояние которого описывается целой неотрицательной величиной. Над семафором определены две операции:

ü Inc(S) (у Дейкстры – P(S)) – увеличить значение семафора S. v ;

ü Dec(S) (у Дейкстры – V(S)) – уменьшить значение семафора S.v–.

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

Семантика операций:

       Inc(S)

1. Если текущее значение больше нуля – S.v

2. Если текущее значение равно нулю и очередь пуста – S.v

3. Если текущее значение равно нулю и очередь не пуста – разблокируется первый процесс из очереди, значение остается нулевым.

       Dec(S)

1. Если текущее значение больше нуля – S.v–

2. Если текущее значение равно нулю – процесс переводится в состояние ожидания и помещается в очередь, значение остается нулевым.

Очень важное замечание:все операции с семафором –АТОМАРНЫЕ, т.е. всегда выполняются неразрывно.

Ø Мьютекс

Мьютекс (от английского термина Mutex: Mutual Exclusion) – это другой стандартный механизм синхронизации.

Основное назначение мьютекса – экранирование критического участка общего кода. Иногда его сравнивают с двоичным семафором, но механизм работы совершенно другой.

Над мьютексом определены две операции:

1.Lock() – захватить мьютекс;

2.Unlock() – освободить мьютекс.

Однако состояние мьютекса не сводится к занят/свободен, он помнит своего владельца. Т.е. состояние мьютекса:

ü Флаг занят/свободен (1/0);

ü Идентификатор процесса/потока владельца.

Lock():

1. Если мьютекс свободен – захватывается,

2. Если мьютекс занят – процесс переводится в состояние ожидания и ставиться в очередь.

Unlock():

1. Если запрос от текущего владельца и очередь пуста – мьютекс освобождается.

2. Если запрос от текущего владельца и очередь не пуста – мьютекс передается первому в очереди ожидающих

3. Если запрос не от текущего владельца – ошибка, запрос игнорируется.

Ø Рекурсивный мьютекс

Мьютекс называется рекурсивным, если он допускает множественный захват одним владельцем. Т.е. процесс, захвативший мьютекс, может еще раз вызвать операцию Lock(). Для обычного мьютекса – это ошибка, для рекурсивного – это нормально, но для освобождения мьютекса потребуется такое же количество операций Unlock().

Состояние рекурсивного мьютекса:

Ø Кратность занятости;

Ø Идентификатор процесса/потока владельца.

       Событие

       Событие(Event) – это средство синхронизации ОС (в Unix оно называется условной переменной). Его не следует путать с событиями в графическом пользовательском интерфейсе (MouseClick, KeyPressed и т.п.).

       Состояние процесса – on/off, true/false, up/down и т.п., то есть имеет два возможных состояния: включено или выключено.

Операции:

ü Set – установить в включено;

ü Reset – установить в выключено;

ü Wait – ожидать, когда событие будет включено.

Различают два вида событий:

Ручное – все операции делаются явно, включенное событие остается включенным, пока его не выключат. Все, ожидающие включения события процессы немедленно освобождаются при его включении.

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

Ø Критическая секция

Критическая секция – самое простое средство синхронизации. Она создается внутри процесса, однако контролируется операционной системой.

Для контрольной секции определены две операции:

ü Enter – войти в критическую секцию,

ü Leave – покинуть критическую секцию.

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

Механизмы синхронизации

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

Синхронизация процессов — приведение двух или нескольких процессов к такому их протеканию, когда определённые стадии разных процессов совершаются в определённом порядке, либо одновременно.

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

Механизм синхронизации:

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

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

Основные механизмы синхронизации:

ü Семафоры;

ü Мониторы;

ü События,

ü Критическая секция.

§

Дейкстра предложил использовать целочисленную переменную для подсчета количества активизаций, отложенных на будущее. Он предложил учредить новый тип переменной — семафор (semaphore). Значение семафора может быть равно 0, что будет свидетельствовать об отсутствии сохраненных активизаций, или иметь какое-нибудь положительное значение, если ожидается не менее одной активизации. Дейкстра предложил использовать две операции с семафорами, которые сейчас обычно называют down и up (обобщения sleep и wakeup соответственно). Операция down выясняет, отличается ли значение семафора от 0. Если отличается, она уменьшает это значение на 1 (то есть использует одну сохраненную активизацию) и продолжает свою работу. Если значение равно 0, процесс приостанавливается, не завершая в этот раз операцию down. И проверка значения, и его изменение, и, возможно, приостановка процесса осуществляются как единое и неделимое атомарное действие. Тем самым гарантируется, что с началом семафорной операции никакой другой процесс не может получить доступ к семафору до тех пор, пока операция не будет завершена или заблокирована.

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

Операция увеличения значения семафора на 1 и активизации одного из процессов также является неделимой. Ни один из процессов не может быть заблокирован при выполнении операции up, равно как ни один из процессов не может быть заблокирован при выполнении wakeup в предыдущей модели.

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

Объект ядра “семафор” используются для учёта ресурсов и служат для ограничения одновременного доступа к ресурсу нескольких потоков. Используя семафор, можно организовать работу программы таким образом, что к ресурсу одновременно смогут получить доступ несколько потоков, однако количество этих потоков будет ограничено. Создавая семафор, указывается максимальное количество потоков, которые одновременно смогут работать с ресурсом. Каждый раз, когда программа обращается к семафору, значение счетчика ресурсов семафора уменьшается на единицу. Когда значение счетчика ресурсов становится равным нулю, семафор недоступен. создание CreateSemaphore, открытие OpenSemaphore, занять WaitForSingleObject, освобождение ReleaseSemaphore.

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

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

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

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

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

Двоичный семафор (binary semaphore) – переменная S, которая может находиться в двух состояниях: “открыт” и “закрыт”; над S определены две операции:

(“семафорные скобки”): P(S) – закрыть, V(S) – открыть. При попытке закрыть уже закрытый семафор происходит прерывание, и ОС добавляет текущий процесс в очередь к закрытому семафору. Операция V(S) активизирует первый стоящий в очереди к S процесс, который успешно завершает операцию P(S). Если семафор S уже открыт, операция V(S) не имеет никакого эффекта.

§

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

Простойпример. Список: structlist{list *next; list *prev};

Вставляем элемент в список:  

new_el->next = curr_el->next;

new_el->prev = curr_el;

 curr_el->next->prev = new_el;

// 3 curr_el->next = new_el;

Но если этот код будут исполнять две нити параллельно, то вместо связного списка получится не понятно, что. Например, если вторая нить включится в момент, когда первая нить закончила строку 3, то обходя список слева направо мы встретим на одном и том же месте один объект, а справа налево — другой. Применим мьютекс — mutually exclusive lock. Этот замок запрещает параллельное исполнение запертого им кода — если одна нить начала его исполнять, вторая будет ждать на входе до тех пор, пока первая не закончит.

mutex_lock (&list->mutex);

 new_el->next = curr_el->next;

 new_el->prev = curr_el;

 curr_el->next->prev = new_el;

// 3 curr_el->next = new_el;

 mutex_unlock (&list->mutex);

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

Для организации взаимоисключения стандарт POSIX предлагает использовать так называемый mutex /от mutual exclusion/. Mutex можно рассматривать как изначально открытую комнату. Первая нить, которая зашла под mutex, то первый человек вошедший в комнату закрывает ее. Другие нити или другие люди не могут попасть в эту комнату пока эта нить, то есть человек не откроет комнату и не выйдет из нее. То есть мы имеем взаимное исключение при доступе к общему ресурсу в чистом виде. Или модель туалетной кабинки кому, что больше нравится. В программах, написанных для OS Linux mutex представляется переменными типа pthread_mutex_t. Прежде начать использовать объект типа pthread_mutex_t по назначению, то есть для синхронизации, необходимо провести ее инициализацию. При этом возможно будут выделены какие-либо системные ресурсы, например,pthread_mutex_t может представлять собой всего лишь указатель на объект который представляет mutex и тогда при инициализации mutex’а требуется выделение памяти под этот объект. Это можно сделать при помощи функции:

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);

В случае если мы хотим создать mutex с атрибутами по умолчанию, память под который будет выделяться статически, то мы можем воспользоваться макросомPTHREAD_MUTEX_INITIALIZER. Например, если мы имеем переменную этого типа, объявленную вне всяких функций, то есть глобальную в рамках программы /extern/ или рамках модуля /static/ переменную и хотим создать на основе нее mutex с атрибутами по умолчанию то мы можем сделать это следующим образом:

Pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

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

Итак, после того как мы проинициализировали mutex, мы можем захватить его при помощи одной из функций:

Int pthread_mutex_lock (pthread_mutex_t *mutex);

Int pthread_mutex_trylock (pthread_mutex_t *mutex);

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

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

Для освобождения, захваченного mutex’а предназначена функция:

Int pthread_mutex_unlock (pthread_mutex_t *mutex);

Стоит еще раз подчеркнуть, что нить может освобождать mutex только предварительно захваченный этой же нитью. Результат работы функции pthread_mutex_unlock () при попытке освободить захваченный другой нитью или вообще свободный mutex не определен. Другими словами, вызов этой функции корректен если данная нить перед этим успешно выполнила либо pthread_mutex_lock ()или pthread_mutex_trylock ()и не успела выполнить комплементарный им pthread_mutex_unlock(). Если мы инициализировали наш mutex при помощи функции pthread_mutex_init (), а не при помощи PTHREAD_MUTEX_INITIALIZER то мы обязаны рано или поздно /но в любом случае до повторного использования памяти в которой располагается объект типаpthread_mutex_t/ уничтожить его освободив связанные с ним ресурсы. Сделать это можно вызвав функцию:

Int pthread_mutex_destroy (pthread_mutex_t *mutex);

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

Например, если у нас mutex защищает некий элемент списка, то, исключив этот элемент из списка и зная, что ни в одной из нитей не осталось ссылок на этот элемент [это можно проконтролировать, например, имея счетчик ссылок], мы можем спокойно уничтожать mutex. В случае если мы инициализировали mutex при помощи макроса PTHREAD_MUTEX_INITIALIZER, то необходимость в его явном уничтожении отсутствует, то есть для него не нужно вызывать функцию phtread_mutex_destroy (). Рассмотрим еще раз как работает механизм mutex на следующем примере:

Ядро Linux и его функции — /dev/mem

Рассмотрим теперь простой пример использования mutex для организации взаимного исключения при доступе к такому общему ресурсу как стандартный вывод: Пусть у нас есть набор процедур, выводящих некие группы строк на стандартный вывод, эти процедуры буду вызываться из разных нитей. При этом для нас важно чтобы некоторые из этих групп не прерывались выводом других строк. Тогда соответствующий код мог бы выглядеть таким образом [сначала рассмотрим случай с одной группой]:

Pthread_mutex_tprint lock = PTHREAD_MUTEX_INITIALIZER;

Voidprint1() {

pthread_mutex_lock (&print lock);

printf(“Print 1 – line 1n”);

printf(“Print 1 – line 2n”);

pthread_mutex_unlock(&print_lock);

}

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

void print2() { pthread_mutex_lock(&print_lock); printf(“Print 2n”); pthread_mutex_unlock(&print_lock);}

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

При разработке многонитевых программ перед нами может встать вопрос о том, что именно должен защищать mutex. Например, в случае если мы имеем некий массив, доступ к одним и тем же элементам которого осуществляется из различных нитей, то мы можем пойти несколькими путями. Во-первых, мы можем иметь для каждого элемента массива свой персональный mutex, который его защищает. Во-вторых, мы можем завести один mutex, который будет защищать все элементы массива. Кроме, того существует целый ряд промежуточных вариантов, например, иметь k mutex’ов, где каждый m-тый из них защищает элементы массива остаток деления индекса, которых на k равен m, можно иметь защищаемый одним mutex список элементов к которым сейчас осуществляется доступ и т.п. Одним словом, перед нами встает вопрос насколько велик должен быть mutex, то есть, сколько объектов он должен защищать. Чем больше объектов mutex защищает тем больше он считается [стоитподчеркнуть, что речь идет не о физических его размерах скажем в памяти, а скорее о логических размерах]. При принятии подобного решения нам приходится учитывать два противоположных фактора:

Ø Mutex’ы не бесплатны. Операция захвата mutex’а занимает некоторое время, как, впрочем, и операция его освобождения. Таким образом, чем больше mutex’ов мы вынуждены захватывать/освобождать тем больше времени мы расходуем на накладные расходы. Кроме того, каждый mutex занимает некоторый, возможно маленький, объем памяти, соответственно, чем больше абсолютное число mutex’ов в нашей программе тем больше памяти расходуется на них. Соответственно, чем меньше mutex’ов мы вынуждены захватывать тем больше времени мы экономим, а чем меньше абсолютное количество mutex’ов в нашей программе тем больше экономим мы памяти.

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

Обычно, в сложных программах принятие решения о размерах тех или иных mutex’ов происходит на основе ряда экспериментов. Как правило, программу проще писать если в ней больше mutex’ов, то есть, скажем, есть по mutex’у на каждый объект. Следовательно, получает право на жизнь следующая стратегия: изначально программа пишется с большим количеством mutex’ов, а если при этом возникают проблемы с производительностью или нехваткой других ресурсов, то пытаются провести ее оптимизацию, то есть, уменьшить каким-либо образом количество mutex’ов. Основную идею этого подхода можно сформулировать и так: не надо оптимизировать пока нет проблемы. С другой стороны, если ваш опыт подсказывает что в конкретном случае обязательно возникнет проблема с mutex’ами, то имеет смысл сразу принять какое-то более оптимальное решение. Из вышесказанного следует, что иногда в программах появляется необходимость захватывать и удерживать одновременно несколько mutex’ов. При этом возможно возникновение таких типичных для параллельного программирования ситуаций как тупиков. Тупик — это ситуация в которой несколько потоков управления таким образом захватили в монопольное использование ресурсы что исключили возможность дальнейшего выполнения для себя. Типичный пример тупика это ситуация, когда первая нить захватила mutex A, и пытается захватить mutex B, в то время как вторая нить уже захватила mutex B и для дальнейшего выполнения ей необходимо захватить mutex A. Ясно что в такой ситуация дальнейшее выполнение ни одной из нитей невозможно. В общем случае мы имеем несколько нитей, которые захватили mutex’ы неудачным образом.

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

Ядро Linux и его функции — /dev/mem

Рис. 10. Тупик между двумя нитями.

Во-первых, можно использовать подход, основанный на применении иерархии mutex’ов. При этом подходе мы устанавливаем некое отношение старшинства между всеми mutex’ами в нашей программе, и в любой ситуации, когда нам необходимо захватить несколько mutex’ов одновременно, мы захватываем строго по старшинству, то есть сначала самый старший, потом mutex который младше первого, но старше остальных и т.п. Если строго соблюдать это правило, то тупиков не возникнет. Оставляя в стороне формальное доказательство этого факта, рассмотрим, как действует этот подход, на нашем примере с двумя mutex’ами и двумя нитями. Согласно правилу обе нити должны будут захватывать сначала mutex A, и только потом B, ясно, что тогда тупиковой ситуации не возникнет, так как после того как первая нить захватит первый mutex, второй либо будет свободен [если вторая нить нуждается в обоих mutex’ах, то она остановится на захвате первого], либо будет захвачен, но на конечный отрезок времени / в случае если вторая нить хочет работать только со вторым mutex’ом, то ничто не помешает ей его захватить, но тупика не возникнет, так как она не имеет права пытаться захватить первый, и, следовательно, обязана освободить захваченный mutex в течение конечного периода времени /.

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

В этих случаях имеет смысл использовать второй подход к предотвращению тупиков. Он основывается на использовании неблокирующего варианта операции захвата mutex’а, то есть pthread_mutex_trylockи называется “попытка и откат/ try and back-off /. Идея этого подхода очень проста: мы можем захватываем mutex’ы в произвольном порядке, но используем при этом операцию pthread_mutex_trylock, если эта операция в некоторый момент нам возвращает EBUSY / то есть если один из mutex’ов который мы пытаемся захватить уже захвачен /, то мы освобождаем все захваченные mutex’ы, как бы уступая дорогу нашему конкуренту. Ясно, что при таком подходе тупиков не возникает, с другой стороны сразу виден основной недостаток этого метода, а именно дополнительные накладные расходы, которые появляются из-за многократных попыток захвата и многократного освобождения mutex’ов. Кроме того, легко себе представить ситуацию, когда две нити пытаются захватить один и тот же набор mutex’ов A и B, но в разном порядке, и при этом ни одна из них не может сделать этого, так как все время натыкается на соперничающую нить / несмотря на то, что та регулярно освобождает свой mutex /. То есть нет теоретической гарантии работы схемы. Практически же в ситуациях, когда конкуренция за ресурсы не высока, данный подход работает вполне эффективно и надежно.

§

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

Mutex(англ.mutex, отmutual exclusion — «взаимное исключение») — аналог одноместногосемафора, служащий впрограммированиидлясинхронизацииодновременно выполняющихсяпотоков.

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

Задача mutex— защита объекта от доступа к нему других потоков, отличных от того, который завладел mutex. В каждый конкретный момент только один поток может владеть объектом, защищённым mutex. Если другому потоку будет нужен доступ к переменной, защищённой mutex, то этот поток блокируется до тех пор, пока mutex не будет освобождён.

Цель использования mutex— защита данных от повреждения в результате асинхронных изменений.

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

Семафор – это защищенная переменная, значение которой можно опрашивать и менять только при помощи специальных операций wait и signal и операции инициализации init. Двоичные семафоры могут принимать только значения 0 и 1.
Используя семафор, можно организовать работу программы таким образом, что к ресурсу одновременно смо­гут получить доступ несколько потоков, однако количество этих потоков будет ограничено. Создавая семафор, указывается максимальное количество пото­ков, которые одновременно смогут работать с ресурсом.
 
 
Mutex — это простейшие двоичные семафоры, которые могут находиться в одном из двух состояний — отмеченном или неотмеченном (открыт и закрыт соответственно). Когда какой-либо поток, принадлежащий любому процессу, становится владельцем объекта mutex, последний переводится в закрытое состояние. Если задача освобождает mutex, его состояние становится открытым.
Ни один другой поток не может завладеть mutex, который уже принадлежит одному из по­токов. Если mutex защищает какие-то совместно используемые данные, он сможет выполнить свою функцию только в случае, если перед обращением к этим данным каждый из потоков будет проверять состояние этого mutex.
 

Пример mutex: Mutex можно рассматривать как комнату изначально открытую. Первый процесс, который зашел под mutex, то первый человек вошедший в комнату закрывает ее. Другие процессы или другие люди не могут попасть в эту комнату пока предыдущий процесс, то есть человек не откроет комнату и не выйдет из нее. То есть мы имеем взаимное исключение при доступе к общему ресурсу в чистом виде.

Управление оперативной памятью

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

Оперативная память Вашей системы может быть следующих видов:

ü обычная или базовая память;

ü дополнительная память;

ü расширенная память;

ü верхняя память.

Ø Базовая память. Операционная система MS DOS, а, следовательно, и подавляющее большинство работающих под ее управлением программ могут использовать лишь первый мегабайт памяти, который часто называют базовой памятью. Эта память в рамках ДОС поделена на две неравные части: первые 640 К (1К = 1024 байт) отводятся для программ пользователя и отдельных частей самой ДОС и называются стандартной памятью (conventional memory). Для использования стандартной памяти не нужны никакие дополнительные драйверы, поскольку операционная система MS-DOS изначально создана для работы в адресах 0-640 Кбайт. Оставшиеся 384 К зарезервированы для памяти видеоадаптеров и ПЗУ и называются верхним блоком памяти (UMB – Uper Memory Block).

Ø Дополнительная память. Память ПК, остающаяся за вычетом первого мегабайта (т.е. за вычетом базовой памяти), называется дополнительной (Extended Memory). Дополнительная память является естественным дополнением к обычной (базовой) памяти компьютера, на что и указывает само её название. Однако единственный (но, к сожалению, определяющий) факт, в котором нет никакой естественности, заключается в том, что подавляющему большинству программ MS DOS она не доступна! Чтобы использовать дополнительную память, процессор компьютера должен работать в специальном режиме, называемом защищённым. А операционная система MS DOS не поддерживает этого режима процессора.

Ø Расширенная память. Ранние IBM-совместимые ПК типа IBM PC/XT оснащались микропроцессорами 8088 или 8086, способными работать с оперативной памятью емкостью не более 1 Мбайт. Несмотря на значительные размеры этой памяти, в ряде прикладных программ ее оказывается недостаточно. Такие программы вынуждены интенсивно использовать диск для размещения больших объемов данных, что сильно снижает их производительность. Поэтому почти одновременно с появлением компьютеров IBM PC/XT начались поиски путей повышения производительности крупных прикладных пропоим (табличных процессоров, систем управления базами данных и т.п.) за счет использования оперативной памяти большего чем 1 Мбайт размера. Эти поиски привели к выработке соглашения между ведущими фирмами-разработчиками программно-аппаратных средств, которое известно, как EMS LIM (от Expanded Memory Specification – спецификация расширенной памяти, удовлетворяющая стандарту фирм Lotus-Intel-Microsoft). В соответствии с этим стандартом ПК оснащаются специальными EMS-платами, содержащими собственно расширенную память н микросхемы, обеспечивающие доступ к ней. Память, организованная по принципам спецификации EMS, называется расширенной памятью.

Ø Верхняя память. Помимо базовой, расширенной и дополнительной памяти, в ПК существует еще так называемая верхняя память. Как известно, 20-разрядный адрес при работе ПК в реальном режиме образуется путем сложения двух 16-разрядных слов – сегмента и смещения. Перед сложением сегмент смещается на 4 разряда влево (умножается на 16), что и обеспечивает 20-разрядный результат сложения – адрес конкретного байта. Формальное сложение сегмента и смещения может привести к переполнению 20-разрядной адресной сетки.

ОЗУ (оперативное запоминающее устройство), оно же RAM (“Random Access Memory” — память с произвольным доступом), представляет собой область временного хранения данных, при помощи которой обеспечивается функционирование программного обеспечения. Физически, оперативная память в системе представляет собой набор микросхем или модулей (содержащих микросхемы), которые обычно подключаются к системной плате.

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

По своей структуре память напоминает пчелиные соты, т.е. состоит из ячеек, каждая из которых предназначена для хранения мёда определенного объема данных, как правило, одного или четырех бит. Каждая ячейка оной имеет свой уникальный «домашний» адрес, который делится на два компонента — адрес горизонтальной строки (Row) и вертикального столбца (Column).

Ячейки представляют собой конденсаторы, способные накапливать электрический заряд. С помощью специальных усилителей аналоговые сигналы переводятся в цифровые, которые в свою очередь образуют данные). Для передачи на микросхему памяти адреса строки служит некий сигнал, который зовется RAS (Row Address Strobe), а для адреса столбца — сигнал CAS (Column Address Strobe). Схема работы оперативной памяти (рис. 11):

Ядро Linux и его функции — /dev/mem

Рис. 11. Работа оперативной памяти

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

Оперативной памятью управляет контроллер, который находится в чипсете материнской платы, а точнее в той его части, которая называется North Bridge (северный мост) — он обеспечивает подключение CPU (процессора) к узлам, использующим высокопроизводительные шины: ОЗУ, графический контроллер (смотрите изображение).

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

Дело в том, что современные устройства оперативной памяти являются достаточно объемными (привет двухтысячным, когда хватало и 32 Mб), чтобы в ней можно было размещать данные от нескольких одновременно работающих задач. Процессор также может одновременно обрабатывать несколько задач. Это обстоятельство способствовало развитию так называемой системы динамического распределения памяти, когда под каждую обрабатываемую процессором задачу отводятся динамические (переменные по своей величине и местоположению) разделы оперативной памяти.

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

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

Виртуальная память

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

Прежде чем виртуальная память смогла быть использована в распространённых операционных системах, должен был быть решен ряд проблем. Динамическая трансляция адресов требовала дорогого и сложного в изготовлении специального оборудования. Первые реализации замедляли доступ к памяти. Существовали опасения, что новые общесистемные алгоритмы, использующие внешнюю память, будут менее эффективны, чем ранее использовавшиеся алгоритмы конкретных приложений. К 1969 году дебаты вокруг виртуальной памяти для промышленно выпускаемых компьютеров были завершены: команда исследователей из IBM под руководством Дэвида Сейра (англ. David Sayre) показала, что созданная ими система виртуальной памяти во всех отношениях превосходит самые лучшие системы, управляемые вручную. Первым мини-компьютером, в котором была использована виртуальная память, был норвежский NORD-1. В 1970-е годы реализации виртуальной памяти появились в других мини-компьютерах, наиболее известным является VAX, работающий под управлением операционной системы VMS.

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

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

Нам неизвестны ОС, поддерживающие односегментную модель “в чистом виде”, но ее рассмотрение облегчит понимание более сложных моделей.

Внешне (с точки зрения программиста) эта модель очень похожа на модель с фиксированными разделами: программа-процесс готовится в плоском виртуальном адресном пространстве. Процесс занимает непрерывное пространство виртуальной памяти, и в реальную память он также загружается в один непрерывный раздел (сегмент). Сегмент может начинаться с любого адреса реальной памяти и иметь любой раздел, не превышающий, однако, размера реальной памяти. Существенное отличие сегментной модели состоит в том, что она использует аппаратную динамическую трансляцию адресов. Загруженный в реальную память и выполняющийся процесс продолжает обращаться к памяти, используя виртуальные адреса, и лишь при каждом конкретном обращении виртуальный адрес аппаратно переводится в реальный. В вычислительной системе, поддерживающей односегментную модель, должен существовать регистр дескриптора сегмента, содержимое которого состоит из двух полей: начального (базового) адреса сегмента в реальной памяти и длины сегмента. Когда процесс размещается в памяти, для выделенного ему сегмента формируется дескриптор, который записывается в вектор состояния в контексте процесса. При переключении контекста дескриптор сегмента загружается в аппаратный регистр дескриптора сегмента и служит той “таблицей трансляции”, по которой аппаратура переводит виртуальные адреса в реальные. Сама трансляция адресов происходит по простейшему алгоритму. Поскольку виртуальное адресное пространство процесса представляет собой линейную последовательность адресов, начинающуюся с 0, виртуальный адрес является простым смещением относительно начала сегмента. Реальный адрес получается сложением виртуального адреса с базовым адресом, выбранным из дескриптора сегмента, как показано на Рисунке 3.4. Единственный путь для выхода процесса за пределы своего виртуального адресного пространства – задание виртуального адреса, большего, чем размер сегмента. Этот путь легко может быть перекрыт, если аппаратура при трансляции адресов будет сравнивать виртуальный адрес с длиной сегмента и выполнять прерывание-ловушку, если виртуальный адрес больше.

Сегментация памяти

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

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

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

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

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

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

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

Алгоритмы подкачки

Для управления подкачки применяются следующие алгоритмы:

ü подкачка (вталкивание) по запросу (по требованию);

ü подкачка (вталкивание) с упреждением (опережением).

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

К положительным сторонам относятся:

Ø гарантировано, что в первичную память будут переписываться только те страницы (сегменты), которые необходимы для работы процесса;

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

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

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

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

§

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

ü выталкивание случайных страниц или сегментов;

ü выталкивание первой пришедшей страницы или сегмента (FIFO);

ü выталкивание дольше всего не использовавшихся страниц или сегментов (LRU);

ü выталкивание наименее часто использовавшихся страниц или сегментов (LFU);

ü выталкивание не использовавшихся в последнее время страниц или сегментов (NUR).

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

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

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

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

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

Глава 2. Файловая система

Понятия файловой системы

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

Основные цели использования файла:

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

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

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

ФС поддерживают несколько функционально различных типов файлов, в число которых, как правило, входят:

ü Обычные файлы;

ü Файлы-каталоги;

ü Специальные файлы;

ü Именованные конвейеры;

ü Файлы, отображаемые на память.

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

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

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

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

Операционная система не знает назначение файла, это знает только пользователь или программа, которая работает с этим файлом.

Файловая система – это часть операционной системы, включающая:

Ø Совокупность всех файлов на диске;

Ø Наборы структур данных, используемых для управления файлами, такие как каталоги файлов, дескрипторы файлов, таблицы распределения свободного и занятого пространства на диске;

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

Также файловая система является компонентом подсистемы ввода-вывода.

Файловые системы стали необходимы с появлением устройств с прямым доступом к данным, прежде всего – магнитным дискам.

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

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

ü соответствие требованиям управления данными и требованиям со стороны пользователей, включающим возможность хранения данных и выполнения операций с ними;

ü гарантирование корректности данных, содержащихся в файле;

ü оптимизация производительности, как с точки зрения системы (пропускная способность), так и с точки зрения пользователя (время отклика);

ü поддержка ввода-вывода для различных типов устройств хранения информации;

ü минимизация или полное исключение возможных потерь или повреждений данных;

ü защита файлов от несанкционированного доступа;

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

ü обеспечение стандартизированного набора подпрограмм интерфейса ввода-вывода.

Минимальным набором требований к файлам системы со стороны пользователя диалоговой системы общего назначения можно считать следующую совокупность возможностей, предоставляемую пользователю:

ü создание, удаление, чтение и изменение файлов;

ü контролируемый доступ к файлам других пользователей;

ü управление доступом к своим файлам;

ü реструктурирование файлов в соответствии с решаемой задачей;

ü перемещение данных между файлами;

ü резервирование и восстановление файлов в случае повреждения;

ü доступ к файлам по символьным именам.

Как уже было сказано, задачи, решаемые ФС, зависят от способа организации вычислительного процесса в целом. Самый простой тип — это ФС в однопользовательских и однопрограммных ОС, к числу которых относится, например, MS-DOS.

Основные функции в такой ФС нацелены на решение следующих задач:

ü именование файлов;

ü программный интерфейс для приложений;

ü отображения логической модели файловой системы на физическую организацию хранилища данных;

ü устойчивость файловой системы к сбоям питания, ошибкам аппаратных и программных средств.

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

В многопользовательских системах появляется еще одна задача: защита файлов одного пользователя от несанкционированного доступа другого пользователя.

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

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

§

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

Уровень физического размещения данных (ФФС). Речь при этом не идет о конкретном физическом устройстве, например, жестком магнитном диске, а об абстрактном поле данных, множестве логических записей. Существует большое количество таких физических файловых систем, таких какFAT, NTFS, CDFS, ext, ufs, hfsи т.д.

Уровень драйверов. Каждый драйвер отображает множество логических записей физической ФС на конкретный физический носитель. Например, секторы жесткого магнитного диска.

Логическая ФС

ЛФС Windowsпредставляет собой лес файловых систем. Каждое дерево соответствует логическому диску. По традиции имена дисков в Windows представлены буквами латинского алфавита (Например, c: d: и т.д.). Жесткой связи между физическими носителями (дисками) и логическими дисками (томами) нет. Один физический диск может быть разбит на несколько логических, и наоборот, один логический диск может объединять несколько физических дисков.

Иерархическая структура файловой системы.

Иерархическая структура ФС представлена на рис. 12.

Ядро Linux и его функции — /dev/mem

Рис. 12. Иерархическая структура ФС

Каталог самого верхнего уровня называется корневым каталогом, или корнем (root).

Имя файла в ЛФС может содержать от 1 до 255 символов UNICODE, что позволяет использовать не только латинские, но и буквы национальных алфавитов. Также разрешается использовать некоторые специальные символы – подчеркивание, пробел, скобки и несколько других. В ЛФС Windows не различаются заглавные и строчные буквы. Полное имя файла содержит полный путь от имени логического диска до файла. Имена каталогов определяются символами .

Пример: d:fotosnaturefoto1.jpg

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

Метаинформация о файле в ЛФС Windowsхранится в каталоге вместе с именем файла.

Физическая файловая система.

Задача физической файловой системы (ФФС) – отобразить файлы данных и связанные с ними метаданные на устройство хранения.

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

Блок (сектор) – это единица чтения записи данных на устройстве хранения. Для жестких дисков размер блока ранее был 512 байтов. Это делается для совместимости со старыми версиями файловых систем.

Все доступные блоки чередуются от 0 до М-1, где М – это общее число блоков на устройстве хранения. Драйвер устройства обеспечивает чтение или запись любого блока с номером 0<=K<=M-1.

Основные требования к ФФС:

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

Ø Эффективность использования памяти. Для реализации ФФС понадобятся вспомогательные структуры данных, которые будут размещаться в той же памяти. Будем оценивать эти дополнительные накладные расходы для конкретных ФФС.

Ø Надежность. Надежность ФФС – это устойчивость файловой системы к программным и/или аппаратным сбоям.

Ø Деградация. Деградация ФС – это ухудшение свойств ФС во времени, в процессе эксплуатации.

Примеры ФФС:

Ø ФФС FAT сама распространенная ФС. Большинство цифровых фотоаппаратов и смартфонов используют ФФС FAT или ее расширение exFAT.Практически все современные ОС могут работать с ФФС FAT.

Ø ФС EXT2. Разработана для ОС Linuxв 1993 году. Основные решения основаны на файловой системе ufs (UnixFileSystem)и bffs (BerkleyFastFileSystem).Является одной из самых быстрых ФС.

Ø NTFS. Данная ФС была разработана в фирме Microsoftв рамках разработки ОС нового поколения WindowsNTв начале 90-х годов прошлого века. Название расшифровывается как New Technology File System.

Логические файловые системы

Файловая система ОС UNIX

ЛФС Unix весьма сильно отличается от привычной ЛВС Windows.

Во-первых, ЛФС представляет собой дерево, элементами которого являются либо каталоги, либо файлы

Ø Каталог с именем / является корнем дерева ЛФС, обычно в нем находятся несколько каталогов. Основные из них:

Ø bin – каталог, где располагаются основные системные утилиты – ls, ps, cat, cp, mkdir и другие;

Ø etc – каталог для основных конфигурационных файлов. Например, там расположен файл passwd, содержащий список всех пользователей системы

Ø dev – Unix часто называют файло-центрированой системой, так как почти все объекты в ней – это файлы. Файлами представляются все физические устройства, подсоединенные к компьютеру – жесткие диски, разъемы USB, клавиатура, мышь и т.д.

Ø usr – каталог для программ для пользователей. Там расположен компиляторы С/С и их библиотеки, там находятся система GUI для Unix – XWindow и т.д.

Ø home – каталог для пользовательских файлов. Каждый пользователь получает в свое распоряжение домашний каталог, имя которого совпадает с регистрационным именем пользователя, где он является полным хозяином.

Имя файла в Unix может иметь длину до 255 символови содержать символы латинского алфавита (строчные и заглавные), цифры и некоторые специальные символы – подчеркивание, пробел, скобки и несколько других. Важно. Различаются в именах заглавные и строчные буквы.

ü Примеры правильных имен: file1, file_1, “file 1”

ü Примеры неправильных имен: file 1, file*1

Различают полное и относительное имя файла. Полное имя файла начинается с корневого каталога и содержит полный путь к файлу. Имена каталогов отделяются символами /.

Пример: /home/sychov/file1

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

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

ü        имя текущего каталога;

ü        имя родительского по отношению к текущему каталога.

Приведем примеры относительных имен файла. Будем считать, что текущий каталог процесса – /home/sychov, тогда

ü file1 относится к файлу с именем file1 в текущем каталоге;

ü aa/file1       относится к файлу с именем file1 в каталоге aa от текущего каталога;

ü ../popov/file1 относится к файлу с именем file1 в домашнем каталоге пользователя с именем popov;

ü ./file1 тоже самое, что и просто file1;

Монтирование

Вопрос. Как прочесть файл с USB диска? Т.е. при запуске системы построилось дерево ЛФС Unix. Где искать файлы нового диска?

Ответ. Для этого предусмотрена операция MOUNT. Команда mount позволяет смонтировать все дерево файлов нового диска как содержимое некоторого каталога в общем дереве ЛФС.

Ø Формат командыmount

$mount –t <typeFS><device><directory>

Ø Автоматическое монтирование. Современные ОС поддерживают технологию Plug&Play, т.е. автоматическое распознавание и установку новых устройств при подключении. Таким образом при подключении USB диска, он будет распознан и автоматически смонтирован в заранее определенный каталог. Так работают большинство современных версий Linux.

Ø Размонтирование диска. После использования диск может быть размонтирован командой unmount.

Метаинформация

Для каждого файла в ФС хранится метаинформация – т.е. информация о файле: размер, дата создания, владелец, права доступа и т.д. В Unix для этого используется индексный узел (indexnode)

В индексном узле много различных атрибутов. Но есть одна важная особенность ЛФС Unix, в нем не хранится имя файла.

Имя файла находится в каталоге. Логически каталог содержит список имен файлов, находящихся в этом каталоге. Для каждого имени файла в каталоге содержится номер индексного узла, где хранится мета информация о файле.

Жесткая ссылка

Жесткая ссылка. Раздельное хранение имени файла и его метаинформации позволяет иметь несколько имен одного и того же файла. Ничему не противоречит, если файл с другим именем и/или в другом каталоге будет ссылаться на тот же индексный узел.

Команды

ü $ ln file1 file2

Команда создаст новое имя файла file2 для существующего файла file1

ü $ rmfile1

Команда удалит одно из имен файла. Сам файл будет удален только тогда, когда число имен файла станет нулевым. Для этого в индексном узле предусмотрен атрибут nlinks – число связей, т.е. имен файла.

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

Мы уже упоминали, что в каждом каталоге Unix есть два файла:

ü  текущий каталог

ü  родительский каталог

Эти имена являются жесткими ссылками на соответствующие файлы – каталоги.

Типы файлов

С точки зрения ОС Unix файл данных – это просто массив байтов. Такой файл называется обычным и имеет тип regular. Кроме этого, ФС Unix поддерживает и другие типы файлов. Например,любой каталог – это файл, содержащий имена файлов в этом каталоге.

Полный список типов файлов

ü regular – обычный файл данных;

ü directory – каталог;

ü link – «мягкая» ссылка. В этом файле хранится имя другого файла;

ü pipe – специальный файл для передачи информации. Длина всегда 0;

ü socket – аналогичен предыдущему, но используется по другому;

ü device – файл устройства. Все устройства в Unix рассматриваются как файлы.

Физическая файловая система

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

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

Одним из компонентов организации файловой системы является физическая организация файлов, то есть способ размещения файла на диске.

Критериями эффективности организации хранения данных являются:

ü Скорость доступа к данным;

ü Объем адресной информации файла;

ü Степень фрагментированности дискового пространства;

ü Максимально возможный размер файла.

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

Достоинство:

Высокая скорость доступа, минимальный размер адресной информации (необходим адрес начального кластера и размер файла);

Недостаток:

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

§

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

Достоинство:

Адресная информация минимальна (расположение файла задается номером первого кластера), уменьшается фрагментация диска.

Недостаток:

Сложность реализации доступа к произвольно заданному месту файла.

Использование связанного списка индексов.

Является модификацией предыдущего способа.

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

Достоинство:

Адресная информация минимальна (расположение файла задается номером первого кластера), уменьшается фрагментация диска, существует возможность считывать кластеры в произвольной части файла.

Использование перечисления списка кластеров.

Этот перечень и служит адресом файла.

Достоинство:

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

Недостаток:

Длина адреса зависит от размера файла и может составлять значительную величину.

Ядро Linux и его функции — /dev/mem

Рис. 13. Физическая организация файловой системы.

Файловая система FAT.

FAT — классическая архитектура файловой системы, которая из-за своей простоты всё ещё широко используется для флеш-накопителей. Используется в дискетах и некоторых других носителях информации. Ранее использовалась и на жёстких дисках.

Файловая система разработана Биллом Гейтсом и Марком МакДональдом в 1976-1977 годах. Использовалась в качестве основной файловой системы в операционных системах семейств DOS и Windows (кроме семейства Windows NT).

Для обеспечения доступа приложений к файлам операционная система с файловой системой FAT использует следующие структуры:

Ø Загрузочные секторы главного и дополнительных разделов (содержит программу начальной загрузки);

Ø Загрузочные секторы логических дисков (разделов);

Ø Корневой каталог (занимает фиксированную область в 32 сектора, что позволяет хранить информацию 512 записи о файлах и каталогах);

Ø Область данных (область, где размещаются кластеры файлов и всех каталогов, кроме корневого каталога);

Ø Цилиндр для выполнения диагностических операций чтения-записи.

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

Загрузочный сектор главного раздела (называемый главной загрузочной записью – Master Boot Record – MBR) является первым сектором на жестком диске (цилиндр 0, головка 0, сектор 1) и состоит из двух элементов:

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

Ø главный загрузочный код – небольшая программа, которая выполняется системой BIOS. Основная функция этого кода – передача управления в раздел, который обозначен как активный (загрузочный).

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

Логический диск, отформатированный программой Fdisk, состоит из следующих областей(см. рис. 14):

ü загрузочный сектор;

ü основная FAT-таблица, содержащая информацию о размещении файлов и каталогов на диске;

ü копия FAT-таблицы;

ü корневой каталог – фиксированная область (16 Кбайт для жесткого диска), позволяющая хранить 512 записей о файлах и каталогах (каждая запись состоит из 32 байтов);

ü область данных для размещения всех файлов и каталогов, кроме корневого каталога.

Файловая система FAT поддерживает всего 2 типа файлов: обычный файл и каталог.

Таблица FAT (File Allocation Table) состоит из индексных указателей, количество которых равно количеству кластеров области данных. Между кластерами и индексными указателями имеется взаимно однозначное соответствие.

Индексный указатель принимает следующие значения:

ü Кластер свободен;

ü Кластер используется файлом и не является последним кластером файла, в этом случае индекс содержит индексный указатель следующего кластера;

ü Последний кластер файла;

ü Дефектный кластер;

ü Резервный кластер.

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

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

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

Существует несколько разновидностей FAT, различающихся разрядностью индексных указателей – FAT12, FAT16, FAT32. Файловые системы FAT12 и FAT16 оперируют с именами файлов типа «8.3».

В версии FAT16 операционной системы Windows NT введен новый тип – «длинное имя», что позволяет использовать имена длиной до 255 символов, причем каждый символ кодируется 2 байтами в формате Unicode.

Ядро Linux и его функции — /dev/mem

Рис. 14. Части логического диска.

Файловая система EXT2

Файловая система EXT2 разработана для операционной системы Linux в 1993 году. Основные решения основаны на файловой системе ufs (UnixFileSystem) и bffs (BerkleyFastFileSystem). Является одной из самых быстрых файловых систем.

       Основные термины: физический блок или сектор – единица чтения/записи данных.

Логический блок или просто блок – логическая единица размещения файлов.

Основными отличительными свойствами NTFS являются:

ü поддержка больших файлов (теоретически до 16 Терабайт) и больших дисков (264 байт);

ü восстанавливаемость после сбоев и отказов программ и аппаратуры управления дисками;

ü высокая скорость операций, в том числе и для больших дисков;

ü низкий уровень фрагментации, в том числе и для больших дисков;

ü гибкая структура, допускающая развитие за счет добавления новых типов записей и атрибутов файлов с сохранением совместимости с предыдущими версиями ФС;

ü устойчивость к отказам дисковых накопителей;

ü поддержка длинных символьных имен;

ü контроль доступа к каталогам и отдельным файлам.

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

       Все типы файлов имеют символьные имена. В иерархически организованных файловых системах обычно используются три типа имен: простые, составные и относительные. Не является исключением и ext2. Ограничения на простое имя состоят в том, что его длина не должна превышать 255 байт, а также в имени не должны присутствовать символ NUL и слеш.

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

Атрибутами файловой системы ext2 являются: тип и права доступа к файлу, владелец, группа доступа, информация о разрешённых операциях (ACL), время создания, дата последнего доступа, дата последнего изменения и время последнего удаления, текущий размер файла, спецификация файла: обычный файл, каталог, файл байт-ориентированного устройства, файл блочно-ориентированного устройства, именованный канал, символическая ссылка.

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

§

Структура дискового раздела

       Как и в любой файловой системе UNIX, в составе ext2 можно выделить следующие составляющие:

ü блоки и группы блоков;

ü индексный дескриптор;

ü суперблок.

       Всё пространство раздела диска разбивается на блоки фиксированного размера, кратные размеру сектора: 1024, 2048, 4096 или 8192 байт. Размер блока указывается при создании файловой системы на разделе диска. Меньший размер блока позволяет сэкономить место на жёстком диске, но также ограничивает максимальный размер файловой системы. Все блоки имеют порядковые номера. С целью уменьшения фрагментации и количества перемещений головок жёсткого диска при чтении больших массивов данных блоки объединяются в группы блоков.

       Базовым понятием файловой системы является индексный дескриптор, или inode (англ. information node). Это специальная структура, которая содержит информацию об атрибутах и физическом расположении файла. Индексные дескрипторы объединены в таблицу, которая содержится в начале каждой группы блоков.

Суперблок   

Суперблок— основной элемент файловой системы ext2. Он содержит общую информацию о файловой системе:

ü общее число блоков и индексных дескрипторов в файловой системе;

ü число свободных блоков и индексных дескрипторов в файловой системе;

ü размер блока файловой системы;

ü количество блоков и индексных дескрипторов в группе блоков;

ü размер индексного дескриптора;

ü идентификатор файловой системы (магическое число 0xEF53 для семейства файловых систем ext);

ü дата последней проверки файловой системы;

ü количество произведённых монтирований;

ü флаг состояния файловой системы.

       Суперблок находится в 1024 байтах от начала раздела. В следующем блоке после суперблока располагается глобальная дескрипторная таблица — описание групп блоков, представляющее собой массив, содержащий общую информацию обо всех группах блоков раздела.

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

Группы блоков

       Все блоки раздела ext2 объединяются в группы блоков. Для каждой группы создаётся отдельная запись в глобальной дескрипторной таблице, в которой хранятся основные параметры:

ü номер блока в битовой карте блоков,

ü номер блока в битовой карте inode,

ü номер блока в таблице inode,

ü число свободных блоков в группе,

ü число индексных дескрипторов, содержащих каталоги.

Битовая карта блоков — это структура, каждый бит которой показывает, отведён ли соответствующий ему блок какому-либо файлу. Если бит равен 1, то блок занят. Аналогичную функцию выполняет битовая карта индексных дескрипторов, которая показывает, какие именно индексные дескрипторы заняты, а какие нет. Ядро Linux, используя число индексных дескрипторов, содержащих каталоги, пытается равномерно распределить inode каталогов по группам, а inode файлов старается по возможности переместить в группу с родительским каталогом. Все оставшееся место, обозначенное в таблице как данные, отводится для хранения файлов.

Каталоги

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

ü номер индексного дескриптора файла;

ü размер записи;

ü длина имени файла;

ü имя файла.

       Подобная организация каталога позволяет хранить в нём длинные имена файлов без потери места на диске.

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

Система адресации данных

Система адресации данных — это одна из самых важных составляющих файловой системы. Именно она позволяет находить нужный файл среди множества как пустых, так и занятых блоков на диске.

       Файловая система ext2 использует следующую схему адресации блоков файла. Для хранения адреса файла выделено 15 полей, каждое из которых состоит из 4 байт. Если файл умещается в 12 блоков, то номера соответствующих кластеров непосредственно перечисляются в первых двенадцати полях адреса. Если размер файла превышает 12 блоков, то следующее поле содержит адрес кластера, в котором могут быть расположены номера следующих блоков файла. Таким образом, 13-е поле используется для косвенной адресации.

       При максимальном размере блока в 4096 байт кластер, соответствующий 13-му полю, может содержать до 1024 номеров следующих блоков файла. Если размер файла превышает 12 1024 блоков, то используется 14-е поле, в котором находится адрес кластера, содержащего 1024 номеров кластеров, каждый из которых ссылается на 1024 блока файла. Здесь применяется уже двойная косвенная адресация. И наконец, если файл включает более 12 1024 1048576 блоков, то используется последнее 15-е поле для тройной косвенной адресации. Данная система адресации позволяет при максимальном размере блока в 4096 байт иметь файлы, размер которых превышает 2 TB.

§

       Основное достоинство – скорость работы. Быстро стала основной файловой системой для семейства Linux, активно используется в различных устройствах на базе ОС Linux, например, домашних файловых серверах. Более поздняя файловая система EXT3 сделана на ее основе, просто добавлено журналирование. Диск с EXT3 можно смонтировать как диск с EXT2, обратная совместимость полная.

Основные недостатки:

Ø Хотя склонность к фрагментации у EXT2 меньше, чем у FAT, тем не менее она есть. Никаких стандартных средств дефрагментации для EXT2 нет.

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

Файловая система NTFS

Файловая система NTFSпозволяет записывать в файл дополнительные потоки данных. Это дает возможность записать в один файл несколько дополнительную информацию. WindowsExplorer видит файл, но не показывает наличие и имена дополнительных потоков.

       Файловая система была разработана в фирме Windows в рамках разработки операционной системы нового поколения WindowsNT в начале 90-х годов. Название расшифровывается как NewTechnologyFileSystem.

Перед разработчиками были поставлены следующие задачи:

ü ФС должна быть быстрой;

ü ФС должна быть гибкой, т.е. предусматривать возможности расширения;

ü ФС должна быть устойчивой к сбоям;

ü ФС должна обеспечивать безопасность и контроль доступа к файлам.

       Файловая система NTFSпредставляет собой один и более файлов. Каталог тоже файл. Основа структуры тома NTFS – главная таблица файлов MFT(Master File Table). Это тоже файл. MFT содержит, по крайней мере, одну запись для каждого файла тома, включая одну запись для самой себя. MFT состоит из записей, размер которых равен размеру кластера и зависит от размера тома -1, 2, или 4 Кбайта. По умолчанию 2 Кбайта. Порядковый номер записи в MFT является номером файла в томе. Изначально под зону MFT отводится 12,5% объема тома NTFS.

       Структура тома NTFS показана на рис. 15.

Ядро Linux и его функции — /dev/mem

Рис. 15 – Структура тома NTFS.

       Загрузочный блок тома NTFS располагается в начале тома, а его копия – в середине области данных тома. Загрузочный блок содержит стандартный блок параметров BIOS, количество блоков в томе, а также начальные логические номера кластеров основной копии MFT и зеркальной копии MFT.

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

       Основными системными атрибутами всех файлов являются:

Ø имя файла (FN — file name) – этот атрибут содержит длинное имя файла в формате Unicode, а также номер входа в таблице MFT для родительского каталога; если этот файл содержится в нескольких каталогах, то у него будет несколько атрибутов типа File Name; этот атрибут файла всегда резидентный;

Ø данные (Data) – содержит обычные данные файла;

Ø дескриптор безопасности (SD — security descriptor) – этот атрибут содержит информацию о защите файла: список прав доступа ACL и поле аудита, которое определяет, какого рода операции над этим файлом нужно регистрировать;

Ø список атрибутов (AL – attribute list) – список атрибутов, из которых состоит файл; содержит ссылки на номер записи MFT, где расположен каждый атрибут; этот редко используемый атрибут нужен только в том случае, если атрибуты файла не умещаются в основной записи и занимают дополнительные записи MFT;

Ø стандартная информация (SI — standard information) – этот атрибут хранит всю остальную стандартную информацию о файле, которую трудно связать с каким-либо другим атрибутом файла, например, время создания файла, время обновления и другие.

           Файлы NTFS в зависимости от размера делятся на небольшие, большие, очень большие и сверхбольшие. Каждый тип файла имеет свои особенности размещения в томе NTFS.

1. Небольшие файлы (small). Небольшим файлом считается такой файл, все атрибуты которого, включая данные (атрибут Data) умещаются в одной записи MFT (второй отрезок). То есть характерной особенностью небольшого файла является то, что все его атрибуты являются резидентными. (рис. 16).

Ядро Linux и его функции — /dev/mem

Рис. 16 – Небольшой файл NTFS.

2. Большие файлы (large). Если файл настолько велик, что его данные не помещаются в одну запись MFT, то данные файла помещаются в область данных тома NTFS. Атрибут Data такого файла, находящийся в MFT (второй отрезок) помечается как нерезидентный и в него помещается адресная информация о месте нахождения каждого отрезка файла в области данных тома NTFS. Адресная информация каждого отрезка файла – это тройка значений: LSN, VCN и K. Если для какого-то файла атрибут данных, хранящий адресную информацию нерезидентных отрезков файла помещается в одну, относящуюся к файлу запись MFT, то такой файл называется большим. (рис. 17).

Ядро Linux и его функции — /dev/mem

Рис. 17 – Большой файл NTFS.

3. Очень большие файлы (huge). Если файл настолько велик, что его атрибут данных, хранящий адреса нерезидентных отрезков данных, не помещается в одной записи, то этот атрибут помещается в другую запись MFT, а ссылка на такой атрибут помещается в основную запись файла (рис. 18). Эта ссылка содержится в атрибуте AttributeList. Сам атрибут данных по-прежнему содержит адреса нерезидентных отрезков данных.

Ядро Linux и его функции — /dev/mem

Рис. 18 – Очень большой файл NTFS.

4. Сверхбольшие файлы (extremelyhuge).Для сверхбольших файлов в атрибуте Attribute List можно указать несколько атрибутов. расположенных в дополнительных записях MFT (рис. 19). Кроме того, можно использовать двойную косвенную адресацию, когда нерезидентный атрибут будет ссылаться на другие нерезидентные атрибуты. поэтому в NTFS не может быть атрибутов слишком большой для системы длины.

Ядро Linux и его функции — /dev/mem

Рис. 19 – Сверхбольшой файл NTFS.

Управление безопасностью

На домашних компьютерах сейчас хранится все больше и больше ценной информации. Многие люди хранят свои финансовые данные, включая налоговые декларации и номера кредитных карт на своих компьютерах. Любовные письма обрели цифровой формат. А жесткие диски в наше время наполнены важными фотографиями, видеоклипами и фильмами.

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

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

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

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

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

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

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

Третья задача — работоспособность системы (system availability) — означает, что никто не может нарушить работу системы и вывести ее из строя. Атаки, вызывающие отказ от обслуживания (denial of service, DOS), приобретают все более распространенный характер. Например, если компьютер работает в роли интернет-сервера, то постоянное забрасывание его запросами может лишить его работоспособности, отвлекая все рабочее время его центрального процессора на изучение и отклонение входящих запросов. Если на обработку входящего запроса на чтение веб-страницы уходит, скажем, 100 мкс, то любой, кто сможет отправлять 10 000 запросов в секунду, способен вывести сервер из строя. Чтобы справиться с атаками на конфиденциальность и целостность данных, можно подобрать вполне подходящие модели и технологии, а вот противостоять атакам, вызывающим отказы от обслуживания, значительно труднее.

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

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

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

Совершенно очевидно, что нужен способ запрещения процессам доступа к тем объектам, к которым у них нет прав доступа. Более того, этот механизм должен также предоставлять возможность при необходимости ограничивать процессы поднабором разрешенных операций. Например, процессу A может быть дано право проводить чтение данных из файла F, но не разрешено вести запись в этот файл.

§

Понятие пользователя.

ü Пользователь – это лицо, зарегистрированное на компьютере и имеющее определенные права по использованию ресурсов компьютера.

ü Пользователи могут быть реальными, с именем и фамилией, но могут быть и абстрактными, например,anonymous.

ü Различают две процедуры проверки пользователя:

ü Аутентификация – процедура идентификации пользователя

ü Авторизация – процедура проверки права пользователя на совершение определенного действия.

Чтобы начать работать, человек должен «войти» в систему, введя со свободного терминала свое учетное имя (account name) и, возможно, пароль (password). Человек, зарегистрированный в учетных файлах системы, и, следовательно, имеющий учетное имя, называется зарегистрированным пользователем системы. Регистрацию новых пользователей обычно выполняет администратор системы. Пользователь не может изменить свое учетное имя, но может установить и/или изменить свой пароль. Пароли хранятся в отдельном файле в закодированном виде.

Рассмотрим пользователей и его атрибуты на примере системы UNIX.

Прежде чем вы сможете начать работу в UNIX, вы должны стать пользователем системы, т. е. получить имя, пароль и ряд других атрибутов.

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

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

В системе существует один пользователь, обладающий неограниченными правами. Это суперпользователь или администратор системы.

Каждый пользователь системы имеет уникальное имя. Однако система различает пользователей по ассоциированному с именем идентификатору пользователя или UID (User Identifier). Понятно, что идентификаторы пользователя также должны быть уникальными. Пользователь является членом одной или нескольких групп — списков пользователей, имеющих сходные задачи (например, пользователей, работающих над одним проектом). Принадлежность к группе определяет волнительные права, которыми обладают все пользователи группы. Каждая группа имеет уникальное имя (уникальное среди имен групп, имя группы и пользователя могут совпадать), но, как и для пользователя, внутренним представлением группы является ее идентификатор G1D (Group. entifier). В конечном счете UID и GID определяют, какими правами обдает пользователь в системе.

Вся информация о пользователях хранится в файле /etc/passwd. Это обычный текстовый файл, право на чтение которого имеют все пользователи системы, а право на запись имеет только администратор (суперпользователь). В этом файле хранятся пароли пользователей, правда в зашифрованном виде. Подобная открытость — недостаток с точки зрения безопасности, поэтому во многих системах зашифрованные пароли хранятся в дельном закрытом для чтения и записи файле /etc/shadow. Аналогично, информация о группах хранится в файле /etc/group и содержит списки пользователей, принадлежащих той или иной группе.

Атрибуты пользователя

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

Рассмотрим подробнее каждый из атрибутов:

Ø name Регистрационное имя пользователя. Это имя пользователь вводит в ответ на приглашение системы login. Для небольших систем имя пользователя достаточно произвольно. В больших системах, в которых зарегистрированы сотни пользователей, требования уникальности заставляют применять определенные правила выбора имен.

Ø passwd-encod Пароль пользователя в закодированном виде. Алгоритмы кодирования известны, но они не позволяют декодировать пароль. При входе в систему пароль, который вы набираете, кодируется, и результат сравнивается с полем passwd-encod. В случае совпадения пользователю разрешается войти в систему.

Ø UID Идентификатор пользователя является внутренним представлением пользователя в системе. Этот идентификатор наследуется задачами, которые запускает пользователь, и файлами, которые он создает. По этому идентификатору система проверяет пользовательские права (например, при запуске программы или чтении файла). Суперпользователь имеет UID = 0, что дает ему неограниченные права в системе.

Ø GIDопределяет идентификатор первичной группы пользователя. Этот идентификатор соответствует идентификатору в файле /etc/group, который содержит имя группы и полный список пользователей, являющихся ее членами. Принадлежность пользователя к группе определяет дополнительные права в системе. Группа определяет общие для всех членов права доступа и тем самым обеспечивает возможность совместной работы (например, совместного использования файлов).

Ø Comments обычно, это полное “реальное” имя пользователя. Это поле может содержать дополнительную информацию, например, телефон или адрес электронной почты. Некоторые программы (например, finger(l) и почтовые системы) используют это поле.

Ø Home-dir Домашний каталог пользователя. При входе в систему пользователь оказывается в этом каталоге. Как правило, пользователь имеет ограниченные права в других частях файловой системы, но домашний каталог и его подкаталоги определяют область файловой системы, где он является полноправным хозяином.

Ø Shell Имя программы, которую UNIX использует в качестве командного интерпретатора. При входе пользователя в систему, UNIX автоматически запустит указанную программу. Обычно это один из стандартных командных интерпретаторов /bin/sh (Bourne shell), /bin/csh (C shell) или /bin/ksh (Kom shell), позволяющих пользователю вводить команды и запускать задачи. В принципе, в этом поле может быть указана любая программа, например, командный интерпретатор с ограниченными функциями (restricted shell), клиент системы управления базой данных или даже редактор. Важно то, что, завершив выполнение этой задачи, пользователь автоматически выйдет из системы. Некоторые системы имеют файл /etc/shells, содержащий список программ, которые могут быть использованы в качестве командного интерпретатора.

§

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

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

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

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

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

Как работают «права доступа»

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

Аутентификация и авторизация

Аутентификация(authentication) предотвращает доступ к сети нежелательных лиц и разрешает вход для легальных пользователей. Аутентификацию следует отличать от идентификации. Идентификаторы пользователей применяются в системе с теми же целями, что и идентификаторы любых других объектов: файлов, процессов, структур данных, но они не связаны непосредственно с обеспечением безопасности. Идентификация заключается в сообщении пользователем системе своего идентификатора, в то время как аутентификация — это процедура доказательства пользователем того, что он есть тот, за кого себя выдает, в частности доказательство того, что именно ему принадлежит введенный им идентификатор.

В процедуре аутентификации участвует две стороны: одна сторона доказывает свою аутентичность, предъявляя некоторые доказательства, а другая сторона — аутентификатор — проверяет эти доказательства и принимает решение. В качестве доказательства аутентичности используются самые разнообразные приемы:

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

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

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

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

Перехват паролей по сети можно предупредить путем их шифрования перед передачей в сеть.

Легальность пользователя может устанавливаться по отношению к различным системам. Так, работая в сети, пользователь может проходить процедуру аутентификации и как локальный пользователь, который претендует на ресурсы только данного компьютера, и как пользователь сети, желающий получить доступ ко всем сетевым ресурсам. При локальной аутентификации пользователь вводит свои идентификатор и пароль, которые автономно обрабатываются операционной системой, установленной на данном компьютере. При логическом входе в сеть данные о пользователе (идентификатор и пароль) передаются на сервер, который хранит учетные записи всех пользователей сети. Многие приложения имеют свои средства определения, является ли пользователь за конным. И тогда пользователю приходится проходить дополнительные этапы проверки. В качестве объектов, требующих аутентификации, могут выступать не только пользователи, но и различные устройства, приложения, текстовая и другая информация. Так, например, пользователь, обращающийся с запросом к корпоративному серверу, должен доказать ему свою легальность, но он также должен убедиться сам, что ведет диалог действительно с сервером своего предприятия. Другими словами, сервер и клиент должны пройти процедуру взаимной аутентификации. Здесь мы имеем дело с аутентификацией на уровне приложений. При установлении сеанса связи между двумя устройствами также часто предусматриваются процедуры взаимной аутентификации на более низком, канальном уровне. Примером такой процедуры является аутентификация по протоколам РАР и CHAP, входящим в семейство протоколов РРР. Аутентификация данных означает доказательство целостности этих данных, а также то, что они поступили именно от того человека, который объявил об этом. Для этого используется механизм электронной подписи.

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

ü избирательный доступ;

ü мандатный доступ.

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

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

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

ü централизованная схема авторизации, базирующаяся на сервере;

ü децентрализованная схема, базирующаяся на рабочих станциях.

В первой схеме сервер управляет процессом предоставления ресурсов пользователю. Главная цель таких систем — реализовать «принцип единого входам. В соответствии с централизованной схемой пользователь один раз логически входит в сеть и получает на все время работы некоторый набор разрешений по доступу к ресурсам сети. Система Kerberos с ее сервером безопасности и архитектурой клиент-сервер является наиболее известной системой этого типа. Системы TACACS и RADIUS, часто применяемые совместно с системами удаленного доступа, также реализуют этот подход.

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

В крупных сетях часто применяется комбинированный подход предоставления пользователю прав доступа к ресурсам сети: сервер удаленного доступа ограничивает доступ пользователя к подсетям или серверам корпоративной сети, то есть к укрупненным элементам сети, а каждый отдельный сервер сети сам по себе ограничивает доступ пользователя к своим внутренним ресурса (разделяемым каталогам, принтерам или приложениям). Сервер удаленного доступа предоставляет доступ на основании имеющегося у него списка прав доступа пользователя, или списка контроля доступа (Access Control List, ACL), а каждый отдельный сервер сети предоставляет доступ к своим ресурсам на основании хранящегося у него списка прав доступа, например, ACL файловой системы.

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

§

Основные функции администрирования сетей.

Согласно международным стандартам администрирование сети имеет следующие функции:

Ø Управление отказами. Сюда входит поиск, правильное определение и устранение всех неполадок и сбоев в работе конкретной сети.

Ø Управление конфигурацией. Речь идет о конфигурации компонентов системы, включая их локацию, сетевые адреса, настройку параметров сетевых операционных систем и др.

Ø Учет работы сети. Администрирование вычислительной сети включает в себя регистрацию и последующий контроль над используемыми ресурсами и устройствами сети.

Ø Управление производительностью. Речь идет о предоставлении статистической информации о работе сети за указанный отрезок времени. Делается это с целью минимизации затрат ресурсов и энергии, а также с целью планирования ресурсов на будущие нужды.

Ø Управление безопасностью. Функция отвечает за контроль доступа и сохранение целостности всех данных.

Обязанности системного аднимистартора.

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

ü Проверка работоспособности баз данных.

ü Контроль над бесперебойной работой локальных сетей.

ü Защита данных и обеспечение их целостности.

ü Защита сети от незаконного доступа.

ü Регулировка прав доступа пользователей локальной сети к ресурсам сети.

ü Резервное копирование информации.

ü Использование оптимальных методов программирования с целью полного использования доступных средств и ресурсов сети.

ü Ведение специальных журналов по работе сети.

ü Осуществление обучения пользователей локальной сети.

ü Контроль над используемым программным обеспечением.

ü Контроль над совершенствованием локальной компьютерной сети.

ü Разработка права доступа к сети.

ü Приостановление незаконной модификации программного обеспечения для сети

Сетевая инфраструктура.

Компьютерная сеть состоит из компонентов, которые можно объединить в отдельные группы:

ü Активное сетевое оборудование.

ü Кабельная система.

ü Средства коммуникации.

ü Сетевые приложения.

ü Сетевые протоколы.

ü Сетевые службы.

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

Задачи сетевого администрирования

Администрирование сети предвидит работу с конкретной системой на самых разных уровнях. При наличии сложных корпоративных сетей перед администрированием стоят следующие задачи:

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

Ø Настройка сетевых узлов. Администрирование локальных сетей в этом случае предвидит работу с активным сетевым оборудованием, чаще всего с сетевым принтером.

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

Ø Поиск неисправностей. Администрирование сети предвидит умения поиска всех возможных неисправностей, начиная от проблем с маршрутизатором, и заканчивая проблемами в настройках сетевых протоколов и служб.

Ø Установки сетевых протоколов. Сюда относятся такие работы, как планирование и последующая настройка сетевых протоколов, их тестирование и определение оптимальной конфигурации.

Ø Поиск путей повышения эффективности работы сети. В частности, речь идет о поиске узких мест, которые требуют замены соответствующего оборудования.

Ø Мониторинг сетевых узлов и сетевого трафика.

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

§

Администрирование средств безопасности предвидит работу в нескольких направлениях:

Ø Распространение актуальной информации, необходимой для работы средств безопасности.

Ø Сбор и анализ данных о функционировании механизмов безопасности. Администрирование локальных сетей в этом случае включает работу с информационной базой управления безопасностью. В обязанности аднимистартора в этом вопросе входят следующие задачи:

Ø Генерация и перераспределение ключей.

Ø Настройка и управление доступом к сети.

Ø Управление шифрованием при помощи соответствующих крипто параметров.

Ø Настройка и управление трафиком и маршрутизацией.

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

Ø Защита системы от вредоносных программ

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

ü Доступ к компьютеру с использованием различных ID устройств.

ü Установка запрета на запись информации на съемные диски.

ü Шифрование съемных носителей информации и др.

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

Управление доступом к файлам в ОС Windows NT. Списки прав доступа.

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

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

Для системы безопасности Windows NT характерно наличие большого количества различных предопределенных (встроенных) субъектов доступа (как отдельных пользователей, так и групп). Таквсистемевсегдаимеютсятакиепользователи, как Administrator, System и Guest, атакжегруппы Users, Administrators, Account Operators, Server Operators, Everyone идр.Смысл этих встроенных пользователей и групп состоит в том, что они наделены некоторыми правами, облегчая администратору работу по созданию эффективной системы разграничения доступа. При добавлении нового пользователя администратору остается только решить, к какой группе или группам отнести этого пользователя администратор может создавать новые группы, а также добавлять права к встроенным группам для реализации собственной политики безопасности, но во многих случаях встроенных групп оказывается вполне достаточно. Windows NT поддерживает три класса операций доступа, которые отличаются типом субъектов и объектов, участвующих в этих операциях.

Права определяются для субъектов типа группа на выполнение некоторых системных операций: установку системного времени, архивирование файлов, выключение компьютера и т.п. В этих операциях участвует особый объект доступа — операционная система в целом.

В основном права отличают одну встроенную группу пользователей от другой. Некоторые права у встроенной группы являются также встроенными – их у данной группы нельзя удалить.

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

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

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

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

ü Владелец (Owner).

ü Группа (Group). Hабор пользователей, разделяющих файл и нуждающихся в типовом способе доступа к нему.

ü Остальные (Univers).

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

§

Язык программирования Java

Java — объектно-ориентированный язык программирования, разрабатываемый компанией Sun Microsystems с 1991 года и официально выпущенный 23 мая 1995 года. Изначально новый язык программирования назывался Oak (James Gosling) и разрабатывался для бытовой электроники, но впоследствии был переименован в Java и стал использоваться для написания апплетов, приложений и серверного программного обеспечения.

       Язык Java зародился как часть проекта создания передового программного обеспечения для различных бытовых приборов. Реализация проекта была начата на языке C , но вскоре возник ряд проблем, наилучшим средством борьбы с которыми было изменение самого инструмента — языка программирования. Стало очевидным, что необходим платформо-независимый язык программирования, позволяющий создавать программы, которые не приходилось бы компилировать отдельно для каждой архитектуры и можно было бы использовать на различных процессорах под различными операционными системами.

       Язык Java потребовался для создания интерактивных продуктов для сети Internet. Фактически, большинство архитектурных решений, принятых при создании Java, было продиктовано желанием предоставить синтаксис, сходный с C и C . В Java используются практически идентичные соглашения для объявления переменных, передачи параметров, операторов и для управления потоком выполнением кода. В Java добавлены все хорошие черты C .

Виртуальная машина Java

Программы на Java транслируются в байт-код, выполняемый виртуальной машиной Java (JVM) — программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор.

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

Часто к недостаткам концепции виртуальной машины относят снижение производительности. Ряд усовершенствований несколько увеличил скорость выполнения программ на Java:

Ø применение технологии трансляции байт-кода в машинный код непосредственно во время работы программы (JIT-технология) с возможностью сохранения версий класса в машинном коде,

Ø широкое использование платформенно-ориентированного кода (native-код) в стандартных библиотеках,

Ø аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология Jazelle, поддерживаемая некоторыми процессорами фирмы ARM).

По данным сайта shootout.alioth.debian.org, для семи разных задач время выполнения на Java составляет в среднем в полтора-два раза больше, чем для C/C , в некоторых случаях Java быстрее, а в отдельных случаях в 7 раз медленнее[12]. С другой стороны, для большинства из них потребление памяти Java-машиной было в 10—30 раз больше, чем программой на C/C . Также примечательно исследование, проведённое компанией Google, согласно которому отмечается существенно более низкая производительность и бо́льшее потребление памяти в тестовых примерах на Java в сравнении с аналогичными программами на C .

Идеи, заложенные в концепцию и различные реализации среды виртуальной машины Java, вдохновили множество энтузиастов на расширение перечня языков, которые могли бы быть использованы для создания программ, исполняемых на виртуальной машине. Эти идеи нашли также выражение в спецификации общеязыковой инфраструктуры CLI, заложенной в основу платформы .NET компанией Microsoft.

Что такое Java Virtual Machine Java Virtual Machine (сокращенно Java VM, JVM) – виртуальная машина Java– основная часть исполняющей системы Java, так называемой Java Runtime Environment (JRE). Виртуальная машина Java интерпретирует и исполняет байт-код Java, предварительно созданный из исходного текста Java-программы компилятором Java. В 1996 г. компания Sun выпустила первую версию документа «Голубая книга JVM», в котором описана спецификация виртуальной машины Java, ставшего де-факто отраслевым стандартом платформы Java. Благодаря этому документу появились альтернативные реализации JVM, являющиеся «разработками с чистого листа» (англ. clean room design). В качестве примера можно привести Kaffe. Начиная с версии J2SE 5.0 изменения в спецификации JVM вырабатываются в соответствии с формализованными пожеланиями заинтересованных сторон. Процесс внесения изменений в спецификации JVM называется Java Community Process.

Ядро Linux и его функции — /dev/mem

Платформа .NET

Основные идеи и положения

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

Ø Обеспечение согласованной объектно-ориентированной среды программирования для локального сохранения и выполнения объектного кода, для локального выполнения кода, распределенного в Интернете, либо для удаленного выполнения.

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

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

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

Ø Обеспечение единых принципов работы разработчиков для разных типов приложений, таких как приложения Windows и веб-приложения.

Ø Разработка взаимодействия на основе промышленных стандартов, которое обеспечит интеграцию кода платформы .NET Framework с любым другим кодом.

Платформа состоит из двух частей. Основой является исполняющая среда Common Language Runtime (CLR), которая может выполнять как обычные программы, так и серверные приложения. Вторая, не менее важная часть, это библиотека классов Framework Class Library (FCL), содержащая в себе множество компонентов для работы с базами данных, сетью, вводом/выводом, файлами, пользовательским интерфейсом и т.д. Это позволяет разработчику не заниматься низкоуровневым программированием, а использовать уже готовые классы.

§

Имена нынешнего поколения продуктов от Microsoft сопровождаются окончанием .Net (читается Dot Net), отражающим видение Microsoft современного коммуникативного мира.

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

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

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

В эпоху стремительного развития Интернета — глобальной информационной сети,

объединяющей компьютеры разных архитектур, важнейшими задачами при созданиипрограмм становятся:

ü переносимостьвозможность выполнения на различных типах компьютеров;

ü безопасностьневозможность несанкционированных действий;

ü надежность— способность выполнять необходимые функции в предопределенных условиях; средний интервал между отказами;

ü использование готовых компонентовдля ускорения разработки;

ü межъязыковое взаимодействиевозможность применять одновременно несколькоязыков программирования.

Платформа .NET позволяет успешно решать все эти задачи. Для обеспечения переносимостикомпиляторы, входящие в состав платформы, переводят программуне в машинные коды, а в промежуточный язык (Microsoft Intermediate Language,MSIL, или просто I L) , который не содержит команд, зависящих от языка, операционнойсистемы и типа компьютера. Программа на этом языке выполняется не самостоятельно, а под управлением системы, которая называется общеязыковойсредой выполнения(CommonLanguageRuntime, CLR).

Среда CLR может быть реализована для любой операционной системы. Привыполнении программы CLR вызывает так называемый JIT-компилятор, переводящий код с языка IL в машинные команды конкретного процессора, которыенемедленно выполняются. JIT означает «just in time», что можно перевести как «вовремя», то есть компилируются только те части программы, которые требуетсявыполнить в данный момент. Каждая часть программы компилируется одинраз и сохраняется в кэше 1 раз для дальнейшего использования.

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

ü Кэшобласть оперативной памяти, предназначенная для временного хранения информации.

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

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

Далее хотелось бы привести общую схему обработки кода в .Net и сборки единого исполняемого модуля:

Ядро Linux и его функции — /dev/mem

Рис. 20. Сборка и компиляция единого исполняемого модуля

Пользовательский интерфейс

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

В основном пользователь генерирует сообщения следующих типов:

ü запрос информации

ü запрос помощи

ü запрос операции или функции

ü ввод или изменение информации

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

Типы интерфейсов.

Интерфейсы пользователя бывают двух типов:

1. процедурно-ориентированные:

ü примитивные

ü меню

ü со свободной навигацией

2. объектно-ориентированные:

ü прямого манипулирования.

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

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

Процедурно-ориентированные интерфейсы:

ü Обеспечивает пользователю функции, необходимые для выполнения задач;

ü Акцент делается на задачи;

ü Пиктограммы представляют приложения, окна или операции;

ü Содержание папок и справочников отражается с помощью таблицы-списка.

Объектно-ориентированные интерфейсы:

ü Обеспечивает пользователю возможность взаимодействия с объектами;

ü Акцент делается на входные данные и результаты;

ü Пиктограммы представляют объекты;

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

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

Интерфейс Меню. В отличие от примитивного интерфейса, позволяет пользователю выбирать операцию из специального списка, выводимого ему программой. Эти интерфейсы предполагают реализацию множества сценариев работы, последовательность действий в которых определяется пользователями. Древовидная организация меню предполагает строго ограниченную реализацию. При этом возможны два варианта организации меню:

ü каждое окно меню занимает весь экран

ü на экране одновременно присутствуют несколько разноуровневых меню (Windows).

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

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

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

§

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

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

Конкретное выделение ресурса тому или иному потребителю является третьей задачей управления ОЗУ. Эта подзадача следует за предыдущей задачей планирования: после решения задачи, какому процессу сколько выделить памяти и на какое время в соответствии с наличием ресурса, следует операция непосредственного выделения. Это означает, что для предоставляемого ресурса идет корректировка системных данных (например, изменение статуса занятости), а затем выдача его потребителю.

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

Глава 4. Компьютерные сети

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

Протокол играет очень важную роль, поскольку недостаточно только соединить компьютеры линиями связи. Нужно еще добиться того, чтобы они “понимали” друг друга.

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

Преимущества работы в сети:

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

Ø Совершенствование коммуникаций (доступ к удаленным БД, обмен информации)

Ø улучшение доступа к информации

Ø свобода в территориальном размещении компьютеров

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

Сетевая операционная система

Сетевая операционная система(англ. Network operating system)– это операционная система, которая обеспечивает обработку, хранение и передачу данных в информационной сети.

Главными задачами сетевой ОС являются разделение ресурсов сети (например, дисковые пространства) и администрирование сети. Системный администратор определяет разделяемые ресурсы, задаёт пароли, определяет права доступа для каждого пользователя или группы пользователей. Отсюда сетевые ОС делят на сетевые ОС для серверов и сетевые ОС для пользователей.

Существуют специальные сетевые ОС, которым приданы функции обычных систем (например, Windows NT) и обычные ОС (Windows XP), которым приданы сетевые функции. Практически все современные ОС имеют встроенные сетевые функции.

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

В зависимости от того, как распределены функции между компьютерами сети, сетевые операционные системы, а, следовательно, и сети делятся на два класса:одноранговые и двухранговые, которые чаще называют сетями с выделенными серверами.

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

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

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

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

Протоколы TCP/IP. Интернет

Термин «TCP/IP» обычно обозначает все, что связано с протоколами TCP и IP. Он охватывает целое семейство протоколов, прикладные программы и даже саму сеть. В состав семейства входят протоколы UDP, ARP, ICMP, TELNET, FTP и многие другие. TCP/IP – это технология межсетевого взаимодействия, технология Internet. Сеть, которая использует технологию Internet, называется «Internet». Если речь идет о глобальной сети, объединяющей множество сетей с технологией Internet, то ее называют Internet.

Единая логическая сеть

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

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

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

Потоки данных

Рассмотрим потоки данных, проходящие через стек протоколов. В случае использования протокола TCP (Transmission Control Protocol – протокол управления передачей), данные передаются между прикладным процессом и модулем TCP. Типичным прикладным процессом, использующим протокол TCP, является модуль FTP (File Transfer Protocol – протокол передачи файлов). Стек протоколов в этом случае будет FTP/TCP/IP/ENET. При использовании протокола UDP (User Datagram Protocol – протокол пользовательских датаграмм), данные передаются между прикладным процессом и модулем UDP. Например, SNMP (Simple Network Management Protocol – простой протокол управления сетью) пользуется транспортными услугами UDP. Его стек протоколов выглядит так: SNMP/UDP/IP/ENET.

Модули TCP, UDP и драйвер Ethernet являются мультиплексорами n x 1. Действуя как мультиплексоры, они переключают несколько входов на один выход. Они также являются демультиплексорами 1 x n. Как демультиплексоры, они переключают один вход на один из многих выходов в соответствии с полем типа в заголовке протокольного блока данных.

Когда Ethernet-кадр попадает в драйвер сетевого интерфейса Ethernet, он может быть направлен либо в модуль ARP (Address Resolution Protocol – адресный протокол), либо в модуль IP (Internet Protocol – межсетевой протокол). На то, куда должен быть направлен Ethernet-кадр, указывает значение поля типа в заголовке кадра.

Если IP-пакет попадает в модуль IP, то содержащиеся в нем данные могут быть переданы либо модулю TCP, либо UDP, что определяется полем «протокол» в заголовке IP-пакета.

Если UDP-датаграмма попадает в модуль UDP, то на основании значения поля «порт» в заголовке датаграммы определяется прикладная программа, которой должно быть передано прикладное сообщение. Если TCP-сообщение попадает в модуль TCP, то выбор прикладной программы, которой должно быть передано сообщение, осуществляется на основе значения поля «порт» в заголовке TCP-сообщения.

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

Мультиплексор n x 1 и демультиплексор 1 x n. Данные от прикладного процесса проходят через модули TCP или UDP, после чего попадают в модуль IP и оттуда – на уровень сетевого интерфейса.

Хотя технология Internet поддерживает много различных сред передачи данных, в основном используют Ethernet, так как именно эта среда чаще всего служит физической основой для IP-сети. Машина не имеет одну точку соединения с Ethernet. Шестибайтный Ethernet-адрес является уникальным для каждого сетевого адаптера и распознается драйвером.

Машина имеет также четырехбайтный IP-адрес. Этот адрес обозначает точку доступа к сети на интерфейсе модуля IP с драйвером. IP-адрес должен быть уникальным в пределах всей сети Internet. Работающая машина всегда знает свой IP-адрес и Ethernet-адрес.

§

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

Межсетевой протокол IP

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

Прямая маршрутизация

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

Косвенная маршрутизация

Рассмотрим случай, когда сеть Internet состоит из трех сетей Ethernet, на базе которых работают три IP-сети, объединенные некоторым шлюзом. Каждая IP-сеть включает четыре машины; каждая машина имеет свои собственные IP- и Ethernet адреса.

Шлюз соединяет все три сети и, следовательно, имеет три IP-адреса и три Ethernet-адреса. Эта машина имеет стек протоколов TCP/IP, но вместо двух модулей ARP и двух драйверов, он содержит три модуля ARP и три драйвера Ethernet, хотя эта машина имеет только один модуль IP.

Менеджер сети присваивает каждой сети Ethernet уникальный номер, называемый IP-номером сети. 

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

Если какая-то машина посылает некой другой машине IP-пакет, то IP-адрес и Ethernet-адрес отправителя соответствуют адресам первой машины. IP-адрес места назначения является адресом второй машины, но поскольку модуль IP в первую машину посылает IP-пакет через шлюз, Ethernet-адрес места назначения является адресом этого шлюза.

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

Правила маршрутизации в модуле IP

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

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

Решение о маршрутизации принимается до того, как IP-пакет передается сетевому драйверу, и до того, как происходит обращение к ARP-таблице.

IP-адрес

Менеджер сети присваивает IP-адреса машинам в соответствии с тем, к каким IP-сетям они подключены. Старшие биты 4-х байтного IP-адреса определяют номер IP-сети. Оставшаяся часть IP-адреса – номер узла (хостномер). Для машины с IP-адресом 223.1.2.1 сетевой номер равен 223.1.2, а хост-номер – 1. Напомним, что IP-адрес узла идентифицирует точку доступа модуля IP к сетевому интерфейсу, а не всю машину.

Некоторые IP-адреса являются выделенными и трактуются по-особому. В выделенных IP-адресах все нули соответствуют либо данному узлу, либо данной IP-сети, а IP-адреса, состоящие из всех единиц, используются при широковещательных передачах. Для ссылок на всю IP-сеть в целом используется IP-адрес с нулевым номером узла. Особый смысл имеет IP-адрес, первый октет которого равен 127. Он используется для тестирования программ и взаимодействия процессов в пределах одной машины. Когда программа посылает данные по IP-адресу 127.0.0.1, то образуется как бы «петля». Данные не передаются по сети, а возвращаются модулям верхнего уровня, как только что принятые. Поэтому в IP-сети запрещается присваивать машинам IP-адреса, начинающиеся со 127.

Подсети

Адресное пространство сети Internet может быть разделено на непересекающиеся подпространства – «подсети», с каждой из которых можно работать как с обычной сетью TCP/IP. Таким образом, единая IP-сеть организации может строиться как объединение подсетей. Как правило, подсеть соответствует одной физической сети, например, одной сети Ethernet.

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

Подсети позволяют избежать этих недостатков. Организация должна получить один сетевой номер. Стандарты TCP/IP определяют структуру IP-адресов. Оставшаяся часть IP-адреса может использоваться, как угодно. Например, можно решить, что третий октет будет определять номер подсети, а четвертый октет – номер узла в ней. Обязательно надо описать конфигурацию подсетей в файлах, определяющих маршрутизацию IP-пакетов. Это описание является локальным для конкретной организации и не видно вне нее. Все машины вне этой организации видят одну большую IP-сеть. Следовательно, они должны поддерживать только маршруты доступа к шлюзам, соединяющим эту IP-сеть с остальным миром. Изменения, происходящие в IP-сети организации, не видны вне нее. Легко можно добавить новую подсеть, новый шлюз и т.п.

IP-таблица маршрутов

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

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

В большинстве систем таблица маршрутов может быть изменена с помощью команды «route». Содержание таблицы маршрутов определяется менеджером сети, поскольку менеджер сети присваивает машинам IP-адреса.

Протокол TCP

Протокол TCP предоставляет транспортные услуги, отличающиеся от услуг UDP. Вместо ненадежной доставки датаграмм без установления соединений, он обеспечивает гарантированную доставку с установлением соединений в виде байтовых потоков.

Протокол TCP используется в тех случаях, когда требуется надежная доставка сообщений. Он освобождает прикладные процессы от необходимости использовать таймауты и повторные передачи для обеспечения надежности. Наиболее типичными прикладными процессами, использующими TCP, являются FTP (File Transfer Protocol – протокол передачи файлов) и TELNET. Кроме того, TCP используют система X-Window, rcp (remote copy – удаленное копирование) и другие «r-команды». Большие возможности TCP даются не бесплатно. Реализация TCP требует большой производительности процессора и большой пропускной способности сети. Внутренняя структура модуля TCP гораздо сложнее структуры модуля UDP.

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

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

Протокол TCP разбивает поток байт на пакеты; он не сохраняет границ между записями. Например, если один прикладной процесс делает 5 записей в TCP-порт, то прикладной процесс на другом конце виртуального канала может выполнить 10 чтений для того, чтобы получить все данные. Но этот же процесс может получить все данные сразу, сделав только одну операцию чтения. Не существует зависимости между числом и размером записываемых сообщений с одной стороны и числом, и размером считываемых сообщений, с другой стороны.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *