рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Определение ОС. Функции ОС. Процессы и потоки. Классификация ОС. История развития

Определение ОС. Функции ОС. Процессы и потоки. Классификация ОС. История развития - раздел История, Определение Ос. Функции Ос....

Определение ОС. Функции ОС. Процессы и потоки. Классификация ОС. История развития.

1.1 Определение ОС.

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

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

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

 

Уровни ВС.

Расположение ОС в общей структуре компьютера.

 

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

 

Микроархитектура.

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

 

Машинный язык.

У некоторых машин микропрограммного уровня нет. Такие системы называются RISC (Reduced Instruction Set Computers - компьютеры с упрощенным набором…  

Системное и прикладное ПО.

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

Основные ресурсы ВС.

Процессорное время (процессор)

Адресное пространство (оперативная память)

Файлы (накопители данных)

Внешние устройства ввода/вывода (принтеры, сетевые устройства, …)

 

Дополнительная функция ОС.

  1.3 Мультипрограммирование. Мультипрограммирование (многозадачность и многопоточность), метод “одновременного” выполнения на одной ЭВМ нескольких…

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

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

Варианты мультипрограммирования.

а.) Три однопоточных процесса

б.) Один процесс с тремя потоками

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

- Готов к выполнению – ждет ЦП; - Выполняется – выделен ЦП; - Приостановлен (блокирован) – ждет некоторого события (например, окончания ввода-вывода).

Особенности алгоритмов управления ресурсами.

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

- однозадачные (например, MS-DOS, MSX); - многозадачные (OC EC, UNIX, Windows 9х, NT и выше). Однозадачные ОС в основном выполняют функцию предоставления пользователю виртуальной машины.

Многозадачность.

Среди множества существующих вариантов реализации многозадачности можно выделить две группы алгоритмов: - невытесняющая (корпоративная) многозадачность (NetWare, Windows 3.x); - вытесняющая многозадачность (OS/2, UNIX, Win’95 и выше).

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

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

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

 

Классификация дисциплин обслуживания.

 

 

 
 

 


Дисциплины обслуживания.

Приоритетное обслуживание – отдельным задачам предоставляется преимущественное право перейти в состояние ВЫПОЛНЕНИЯ. Фиксированные приоритеты – являются величиной постоянной на всем жизненном… Динамические приоритеты – изменяются в зависимости от некоторых условий в соответствии с определенными правилами. Для…

Приоритетное обслуживание.

Каждому процессу присваивается приоритет, и управление передается процессу с самым высоким приоритетом.

Приоритетное обслуживание может использовать относительные и абсолютные приоритеты.

Приоритет может быть динамический и фиксированный.

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

 

Динамический приоритет.

Динамический приоритет может устанавливаться так:

- П=1/Т, где Т- часть использованного в последний раз кванта

- Если использовано 1/50 кванта, то приоритет 50.

- Если использован весь квант, то приоритет 1.

Т.е. процессы, ограниченные вводом/вывода, будут иметь приоритет над процессами ограниченными процессором.

 

 

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

- однопользовательские (MS-DOS, Windows 3.x, Windows 9x); - многопользовательские (UNIX, Windows NT, 2000-2007). Главным отличием многопользовательских систем от однопользовательских является наличие средств защиты информации…

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

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

Виды мультипроцессирования.

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

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

 

Состояния процессов и потоков при мультипроцессировании.

Несколько состояний “Выполняется” (по одному на каждый CPU)

Одно или несколько состояний “Готов” (общая очередь или отдельная на каждый CPU)

 

Особенности алгоритмов управления ресурсами.

   

Типы многозадачных ОС.

Многозадачные ОС подразделяются на три типа в соответствии с использованными при их разработке критериями эффективности:

- системы пакетной обработки (например, OC EC);

- системы разделения времени (UNIX, MS Windows);

- системы реального времени (QNX, RT/11).

 

Системы пакетной обработки.

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

Системы пакетной обработки.

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

Системы разделения времени.

Системы разделения времени (time sharing) призваны исправить основной недостаток систем пакетной обработки – отсутствие интерактивности.

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

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

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

Критерием эффективности систем разделения времени является не максимальная пропускная способность, а удобство и эффективность работы пользователя.

 

Системы реального времени.

Таким образом, критерием эффективности для систем реального времени временя реакции системы на события от объекта управления, это свойство системы…  

Гибридные системы.

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

Структурная организация операционных систем.

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

Рассмотрим основные способы структурной организации ОС:

- монолитную структуру;

- многоуровневую структуру;

- ядерную структуру;

- микроядерную структуру;

- объектно-ориентированный подход.

 

Монолитная структура.

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

 

Многоуровневая структура.

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

Понятие ядра.

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

Ядро – центральная часть ОС, выполняющая основные функции.

Ядро системы MULTICS, находящееся постоянно в памяти компьютера занимало всего 135 Килобайт кода.

 

Уровни привилегий (защиты).

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

Между числом уровней привилегий, поддерживаемых аппаратно, и числом уровней привилегий ОС нет прямого соответствия.

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

Ядро в привилегированном (защищенном) режиме.

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

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

 

Пример ядра в непривилегированном режиме.

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

Так, сетевая ОС Novell NetWare использует привилегированный режим процессоров Intel х86/Pentium как для работы ядра, так и для работы своих специфических приложений – загружаемых модулей NLM.

 

Монолитное ядро.

Монолитность ядер усложняет их отладку, понимание кода ядра, добавление новых функций и возможностей, удаление «мёртвого», ненужного,… «Разбухание» кода монолитных ядер также повышает требования к объёму… Это делает монолитные ядерные архитектуры мало пригодными к эксплуатации в системах, сильно ограниченных по объёму…

Модульное ядро.

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

Микроядро.

Развитием ядерного подхода явилась архитектура на основе микроядра.

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

 

Достоинства и недостатки микроядра.

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

Появление ОС.

Первый настоящий цифровой компьютер был изобретен английским математиком Чарльзом Бэббиджем (Charles Babbage. 1792-1871). Хотя большую часть жизни… Это была чисто механическая машина, а технологии того времени не были… Интересный исторический факт: Бэббидж понимал, что для аналитической машины ему необходимо программное обеспечение,…

Этапы эволюции.

1 этап (1940-60) системный монитор, ранние пакетные системы

2 этап (1965-75) мультипрограммирование, пакетные ОС и ОС разделения времени

3 этап (1970-80) ОС мини-ЭВМ

4 этап (1980-90) ОС ПК

5 этап (1990-наст.вр.) корпоративные ОС

 

Этап (1940-60).

С середины 50-х годов – новая техническая база – полупроводниковые элементы: - выросли технические характеристики ЭВМ: быстродействие процессоров, объемы… - появились первые алгоритмические языки, и появился новый тип системного программного обеспечения – трансляторы;

Этап (1965-75).

Реализованы основные концепции, присущие современным ОС: - мультипрограммирование, - мультипроцессирование,

Этап (1970-80).

1969 год – начало работ Министерства обороны США по объединению суперкомпьютеров оборонных и научно-исследовательских центров в единую сеть ARPANET,… Середина 70-х годов – широкое распространение получили мини-ЭВМ (PDP-11, Nova,… ОС мини-компьютеров часто стали делать специализированными, например, только для управления в реальном времени (ОС…

Этап (1980-90).

Начало 80-х годов – появление персональных компьютеров (ПК), которые стали мощным катализатором для бурного роста ЛВС, в результате чего поддержка… Также в 80-е годы – приняты основные стандарты на коммуникационные технологии… 1981 год – первая ОС компании Microsoft для ПК. MS-DOS было однопрограммной однопользовательской ОС с интерфейсом…

Операционная система MS Windows 2000 и выше. Общая характеристика и основные функции. Структура MS Windows 2000-2003. Объекты в MS Windows 2000-2003.

2.2 Основная характеристика Windows 2000-2008.   Система Windows 2000-2008 не является дальнейшим развитием ранее существовавших продуктов.

Краткая характеристика.

l Многоуровневая ОС. l Ядро работает в защищенном режиме. l Присутствует микроядро, но оно дополнительно не защищено от остальных фрагментов ядра (т.е. по сути присутствует…

Структура ядра.

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

Назначение объектов.

Объекты очень удобны для поддержки четырех важных функций ОС:

- присвоения понятных имен системным ресурсам;

- разделения ресурсов и данных между процессами;

- защиты ресурсов от несанкционированного доступа;

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

 

Типы объектов Windows 2000-2008.

Объекты ядра (kernel object) – это более примитивный набор объектов, реализованный ядром. Большинство этих объектов создаются и используются только… - Управляющие объекты (объекты прерываний, … ) - Объекты диспетчеризации (семафоры, события, мьютексы, таймеры,…)

Структура объектов Windows 2000-2003.

  Удержание объектов. Удержание объектов включает две фазы. Первая фаза называется удержанием имени (name retention) и управляется…

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

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

 

Защита объектов.

- управление избирательным доступом (discretionary access control) – основной механизм контроля доступа, при котором владельцы объектов разрешают… - управление привилегированным доступом (privileged access control) –…  

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

При отсутствии ACL объект является незащищенным, и система защиты предоставляет к нему запрошенный тип доступа. ACL представляет собой список элементов контроля доступа (access control… В списке ACL есть записи ACE двух типов - разрешающие и запрещающие доступ. В ходе просмотра выполняется сравнение…

Основы файловых систем. Файлы и их атрибуты. Каталоги. Логическая организация ФС. Логическая, физическая организация файлов. Кэширование. RAID - системы.

4. Основы файловых систем. Файлы и их атрибуты. Каталоги. Логическая организация ФС. Логическая, физическая организация файлов. Способы учёта свободного дискового пространства.

3.1 Основы файловых систем.

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

l В широком смысле понятие “ФС” включает:

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

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

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

3.2, 3.3 Файлы и их атрибуты. Каталоги.

Файл – это именованный набор связанной информации, записанной во вторичную память.

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

Имена файлов:

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

- Общий формат символьного имени файла: <ИМЯ>.<РАСШИРЕНИЕ>

- Символьные имена могут быть различной длины в зависимости от типа ФС.

- Поддержка национальных алфавитов – символьные имена в формате UNICODE.

- Присваивание нескольких символьных имен одному файлу.

- Возможное различие строчных и прописных букв.

Типы файлов:

- обычные файлы:

- специальные файлы;

- файлы-каталоги.

Обычные файлы:

Обычные файлы в свою очередь подразделяются на текстовые и двоичные:

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

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

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

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

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

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

 

Каталоги:

Каталоги – системные файлы, поддерживающие структуру файловой системы.

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

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

 

Атрибуты файлов:

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

- информация о разрешенном доступе;

- пароль для доступа к файлу;

- владелец файла;

- создатель файла;

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

- времена создания, последнего доступа и последнего изменения;

- текущий размер файла;

- максимальный размер файла.

 

Структура каталогов:

 

Каталоги могут непосредственно содержать атрибуты файлов, как это сделано в файловой системе FAT16, или, как это реализовано в ОС UNIX, ссылаться на специальные индексные узлы (i-node), которые содержат атрибуты и информацию о размещении файлов.

 

 

3.4 Логическая организация ФС.

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

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

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

 

 

3.5 Логическая, физическая организация файлов.

 

Логическая организация файла:

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

Физическая организация файла:

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

Файл состоит из физических записей – блоков.

Блок – наименьшая единица данных, которой внешнее устройство обменивается с оперативной памятью.

Примерами блоков являются сектора, кластеры и цилиндры.

 

Цилиндры и сектора:

Магнитный диск представляет собой один или несколько объединенных дисков (блинов), по поверхностям (Sides) которых перемещаются головки (Heads).

Головки перемещаются по круговым дорожкам (Tracks), каждая дорожка разделена на сектора (Sectors). Дорожки, равноудаленные от центра диска и образующие цилиндрическую поверхность, называют цилиндрами (Cilinders).

 

Кластеры:

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

Кластер представляет группу смежных секторов. Число секторов в кластере всегда равно степени двойки (2n).

Способы физической организации.

 

Непрерывное размещение:

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

В качестве примера обычно приводят файловую систему, реализованную в IBM OS/360.

Достоинства этого метода:

- отсутствие накладных расходов на хранение служебной информации;

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

- простое вычисление адреса любого блока файла.

 

Но имеются и два существенных недостатка:

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

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

 

Связанный список блоков:

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

В качестве примера обычно приводят операционную систему TOPS-10 и компьютер Alto.

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

Недостатками данного метода являются:

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

- совместное хранение служебной информации и данных в одном блоке, при повреждении блока файла дальнейшая цепочка «обрывается»;

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

 

Связанный список индексов:

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

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

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

Во-вторых, данные файла занимают блок целиком, а значит имеют объем, равный степени двойки.

 

Перечень номеров блоков:

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

Например, в UNIX используется вариант данного способа, позволяющий обеспечить фиксированную длину адреса, независимо от размера файла. Для хранения адреса файла в индексном узле (i-node) выделено 13 полей:

- Если размер файла меньше или равен 10 блокам, то номера этих блоков непосредственно перечислены в первых десяти полях адреса.

- Если размер файла больше 10 блоков, то следующее 11-е поле содержит адрес блока, в котором могут быть расположены n номеров следующих блоков файла.

- Если файл больше чем 10 + n блоков, то используется 12-е поле, в котором находится номер блока, содержащего n номеров блоков, которые содержат по n номеров блоков данного файла.

- И, наконец, если файл больше 10+ n + n * n, то используется последнее 13-е поле для тройной косвенной адресации, что позволяет описать размещение файла, имеющего размер максимум 10 + n + n * n + n * n * n блоков.

Размер блока – 4Kб, адрес – 4 байта

Прямая адресация: 10 x 4Kб = 40Kб

Одиночная косвенная адресация: (4Kб / 4б) x 4Kб = 1K x 4Kб = 4Mб

Двойная косвенная адресация: 1K x 1K x 4Kб = 4Гб

Тройная косвенная адресация: 1K x 1K x 1K x 4Kб = 4Tб

 

Способы учета свободного дискового пространства:

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

l Битовая карта (bit map) – в этом случае список свободных блоков диска реализован в виде битового вектора. Каждый блок представлен одним битом, принимающим значение 0 или 1, в зависимости от того, занят он или свободен.

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

l Способ «счетчика» (counting) – каждая группа последовательных свободных блоков описывает парой чисел (номер стартового свободного блока; число последовательных свободных блоков).

 

Права доступа к файлу:

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

Этот список может включать следующие операции:


l создание файла

l уничтожение файла

l открытие файла

l закрытие файла

l чтение файла

l запись в файл

l дополнение файла

l поиск в файле

l получение атрибутов файла

l установление новых значений атрибутов

l переименование

l выполнение файла

l чтение каталога


 

Управление правами доступа:

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

 

Различают два основных подхода к определению прав доступа:

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

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

 

3.6 Кэширование.

 

Кэширование диска.

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

RAID - 0.

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

RAID - 1.

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

RAID - 4.

Главное отличие между RAID 3 и 4 состоит в том, что в последнем, расслоение данных выполняется на уровне секторов, а не на уровне битов или…  

Сравнение RAID-систем.

  Составные RAID системы: l RAID 0+1 / RAID 1+0

Фрагментация и дефрагментация.

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

Размеры разделов и кластеров FAT16 для Windows 95-2000.

 

 

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

ФС Virtual FAT появилась в первой версии Win’95.

Во второй версии Win’95 пользователям была предложена уже FAT32.

Virtual FAT поддерживала длинные имена файлов (LFN), но была 16-разрядной.

Длинные имена (LFN) хранятся в специально отформатированных 32-байт записях, байт атрибутов у которых равен 0Fh.

Поддерживает разделы до 4 Гб.

 

Long File Names.

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

Элемент каталога VFAT.

 

Пример длинного имени.

THEQUI~1.FOX

Проблемы длинных имен:

На первый взгляд использованный в VFAT механизм длинных имен файлов позволяет сохранить преемственность с прикладными программами прошлого поколения и выглядит идеальным.

Однако этот метод далек от совершенства:

- Требуется больше дискового пространства;

- Бóльшая фрагментация (на уровне каталогов).

 

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

FAT32 это развитие файловой системы FAT(VFAT, FAT16).

32-разрядная адресация кластеров – максимальное число адресуемых кластеров – 4 294 377 472.

Поддержка больших разделов (более 4Gb), кроме этого уменьшен размер кластера на разделе.

Поддержка длинных имен до 255 символов, причем нет ограничений на число и размер расширения.

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

Имеет более высокую надежность: FAT32 способна перемещать корневой каталог, создает резервную копию загрузочного сектора и может работать с резервной копией FAT.

 

Структура элемента каталога:

Чтобы обеспечить возможность работы с возросшим числом кластеров, в записи каталога для каждого файла должно выделяться 4 байт для начального кластера файла .

2 дополнительных байта (по сравнению с FAT16 и VFAT) выделяются среди зарезервированных 10 байт.

 

Сравнение FAT16 и FAT32:

Файловая система NTFS. Тома NTFS. Физическая структура MFT и метафайлы. Атрибуты в NTFS. Хранение файлов и каталогов. Сжатие файлов в NTFS. Защита целостности данных. Дополнительные возможности в NTFS.

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

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

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

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

6.2 Тома NTFS.

Структура NTFS начинается с тома (volume). Том соответствует логическому разделу на диске и создается, когда Вы форматируете диск или часть его для NTFS.

На одном диске может находиться один или несколько томов.

NTFS обрабатывает каждый том независимо от других.

 

 

Типы томов:

1. Простой том (simple)

2. Составной том (spanned) – том, использующий более одного раздела для формирования одного

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

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

3. Зеркальный том (mirrored, RAID 0) содержит копии своих данных на двух разделах. В случае

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

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

4. Чередующийся набор томов (stripped , RAID 1) – том, состоящий из нескольких разделов, по

которым равномерными блоками распределены данные. Размер блока данных - 64 Кбайт. Первый

блок данных размером в 64 Кбайт хранится на первом разделе, вторые 64 Кбайт на втором и т.д.

Чередующиеся наборы томов могут повысить производительность системы, если использовать

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

параллельно.

5. Чередующийся набор томов с четностью (RAID-5) – это чередующийся набор с дополнительным

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

которую система может использовать при восстановлении данных, расположенных на одном из

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

 

Внутреннее имя тома:

В разделе HKEY_LOCAL_ MACHINESYSTEMMountedDevices системного реестра хранится информация о базовых дисках.

Внутреннее имя имеет форму ??Volume{XX-XX-XX-XX}, где X — числа, образующие глобальный уникальный ID (GUID), присвоенный тому операционной системой.

Для работы с томами существует системная утилита mountvol (будет рассмотрена позже)

 

6.3 MFT и ее структура.

Каждый файл на томе NTFS представлен записью в специальном файле, называемом главной файловой таблицей (MFT – master file table).

NTFS резервирует первые 16 записей таблицы для специальной информации. Первая запись этой таблицы описывает непосредственно главную файловую таблицу;

За ней следует зеркальная запись (mirror record) MFT. Если первая запись MFT разрушена, то NTFS читает вторую запись для отыскания зеркального файла MFT, первая запись которого идентична первой записи MFT. Местоположения сегментов данных MFT и зеркального файла MFT записаны в секторе начальной загрузки. Дубликат сектора начальной загрузки находится в логическом центре диска.

Третья запись MFT — файл регистрации (log file); используется для восстановления файлов. Файл регистрации подробно описан ниже. Семнадцатая и последующие записи главной файловой таблицы используются собственно файлами и каталогами (также рассматриваются как файлы NTFS) на томе. На слайде показана упрощенная структура MFT.

 

 

 

 

Метафайлы:

Первые 16 файлов NTFS (метафайлы) носят служебный характер.

Метафайлы находятся корневом каталоге NTFS диска – они начинаются с символа имени "$".

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

 

Перечень метафайлов

4 метафайла зарезервировано 6.4 Атрибуты файлов.

Заголовок атрибута

Атрибуты файлов NTFS - 1

Атрибуты файлов NTFS - 2

6.5 Хранение файлов. Файлы NTFS в общем случае состоят из следующих атрибутов: 1. Заголовок записи MFT (H - header)

Сравнение структуры логического диска FAT32 и тома NTFS . Функции win32 API для работы с файлами.

Сравнение структуры логического диска Fat32 и тома NTFS. Варианты организации асинхронной работы с файлами.

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

 

Поиск данных файла:

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

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

В системе FAT16, где максимальный размер области FAT составляет 128 Кбайт, это не составит проблемы – вся область FAT просто хранится в памяти, или же считывается с диска целиком за один проход и буферизируется. FAT32 же, напротив, имеет типичный размер области FAT порядка сотен килобайт, а на больших дисках – даже несколько мегабайт.

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

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

Вывод: Абсолютный лидер - FAT16, он никогда не заставит систему делать лишние дисковые операции для данной цели. Затем идет NTFS - эта система также не требует чтения лишней информации, по крайней мере, до того момента, пока файл имеет разумное число фрагментов. FAT32 испытывает огромные трудности, вплоть до чтения лишних сотен килобайт из области FAT, если файл разбросан по разным областям диска. Работа с внушительными по размеру файлами на FAT32 в любом случае сопряжена с огромными трудностями - понять, в каком месте на диске расположен тот или иной фрагмент файла, можно лишь изучив всю последовательность кластеров файла с самого начала, обрабатывая за один раз один кластер (через каждые 4 Кбайт файла в типичной системе). Стоит отметить, что если файл фрагментирован, но лежит компактной кучей фрагментов - FAT32 всё же не испытывает больших трудностей, так как физический доступ к области FAT будет также компактен и буферизован.

 

Поиск свободного места:

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

NTFS имеет битовую карту свободного места, одному кластеру соответствует 1 бит. Для поиска свободного места на диске приходится оценивать объемы в десятки раз меньшие, чем в системах FAT и FAT32.

 

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

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

Вывод: NTFS имеет наиболее эффективную систему нахождения свободного места. Стоит отметить, что действовать "в лоб" на FAT16 или FAT32 очень медленно, поэтому для нахождения свободного места в этих системах применяются различные методы оптимизации, в результате чего и там достигается приемлемая скорость. (Одно можно сказать наверняка - поиск свободного места при работе в DOS на FAT32 - катастрофический по скорости процесс, поскольку никакая оптимизация невозможна без поддержки хоть сколь серьезной операционной системы).

Работа с каталогами и файлами:

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

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

 

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

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

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

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

 

Итоги

Параметр Лидер Аутсайдер
Поиск данных файла FAT16, NTFS FAT32
Поиск свободного места NTFS FAT32
Работа с каталогами и файлами NTFS(*) 䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü

(*) Для больших каталогов

Тома FAT32 могут теоретически быть больше 2 ТБ, но операционные системы Windows Server 2003, Windows 2000 и Windows XP могут форматировать диски объемом только до 32 ГБ. (Windows Server 2003, Windows 2000 и Windows XP Professional могут читать и записывать на большие по объему тома FAT32, отформатированные другими операционными системами).

Тома NTFS могут теоретически быть объемом до 16 эксабайт (ЭБ), но практический предел составляет 2 ТБ.

Пользователь может определить размер кластера при форматировании тома NTFS. Однако NTFS-сжатие не поддерживается для кластеров, размер которых больше 4 КБ.

 

7.2 Функции win32 API для работы с файлами.

Соответствие Win32 API и UNIX:

Win32 API UNIX Описание
CreateFile open создать новый файл или открыть существующий
DeleteFile unlink удалить существующий файл
CloseHandle close закрыть файл
ReadFile read прочитать данные из файла
WriteFile write записать данные в файл
SetFilePointer Iseek установить указатель работы с файлом
GetFileAttributes stat вернуть аттритбуты файла
LockFile fcntl заблокировать регион файла для решения взаимного исключения
UnlockFile fcntl разблокировать регион файла

CreateDirectory mkdir создать новый каталог
RemoveDirectory rmdir удалить пустой каталог
FindFirstFile opendir выполнить инициализацию для начала чтения записей каталога
FindNextFile readdir прочитать следующую запись каталога
MoveFile rename перенести файл из одного каталога в другой
SetCurrentDirectory chdir изменить текущий каталог

 

 

Работа с каталогами и файлами:

 

функция выполняемое действие

GetCurrentDirectory Получение текущего каталога
SetCurrentDirectory Смена текущего каталога
GetSystemDirectory Получение системного каталога
GetWindowsDirectory Получение основного каталога системы
CreateDirectory Создание каталога
RemoveDirectory Удаление каталога
CopyFile Копирование файла
MoveFile MoveFileEx Перемещение или переименование файла
DeleteFile Удаление файла

Работа с томами:

Для выяснения того, какие логические диски существуют в системе, используется функция DWORD GetLogicalDrives( void )

Каждый установленный бит возвращаемого значения соответствует существующему в системе логическому устройству. Например, если в системе существуют диски A:, C: и D:, то возвращаемое функцией значение равно 13(десятичное).

 

Функция DWORD GetLogicalDrivesStrings( DWORD cchBuffer, LPTSTR lpszBuffer) заполняет lpszBuffer информацией о корневом каталоге каждого логического диска в системе. В приведенном выше примере буфер будет заполнен символами: A:<null>C:<null>D:<null><null>

Параметр cchBuffer определяет длину буфера. Функция возвращает реальную длину буфера, необходимую для размещения всей информации.

 

Для определения типа диска предназначена функция: UINT GetDriveType( LPTSTR lpszRootPathName )

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

 

Идентификатор Описание
Тип устройства определить нельзя
Корневой каталог не существует
DRIVE_REMOVABLE Гибкий диск
DRIVE_FIXED Жесткий диск
DRIVE_REMOTE Сетевой диск
DRIVE_CDROM Компакт диск
DRIVE_RAMDISK RAM диск

 

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

Функция GetDiskFreeSpace сообщает информацию о размерах сектора и кластера и о наличии свободных кластеров.

 

Создание и открытие файла:

HANDLE CreateFile (

LPCTSTR lpFileName, // pointer to name of the file

DWORD dwDesiredAccess, // access (read-write) mode

DWORD dwShareMode, // share mode

LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security descriptor

DWORD dwCreationDistribution, // how to create

DWORD dwFlagsAndAttributes, // file attributes

HANDLE hTemplateFile // handle to file with attributes to copy

);

 

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

 

Параметры CreateFile ():

Параметр dwDesiredAccess задает тип доступа к файлу. Можно определить флаги GENERIC_READ и GENERIC_WRITE а так же их комбинацию для разрешения чтения или записи в файл.

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

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

- CREATE_NEW - Создает файл, если файл существует, то ошибка.

- CREATE_ALWAYS - Создает файл , если файл существует, то старый файл удаляется и новый создается.

- OPEN_EXISTING - Открывает существующий файл.

- OPEN_ALWAYS - Создает файл, если файл не существует, то создается новый файл.

- TRUNCATE_EXISTING - Открывает файл и урезает его до нулевой длины

Параметр dwFlagsAndAttributes определяет атрибуты файла, если он создается и задает режим работы с файлом.

- FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_TEMPORARY

- Атрибуты файла могут комбинироваться за исключением FILE_ATTRIBUTE_NORMAL, который всегда используется в одиночестве.

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

FILE_FLAG_NO_BUFFERING - Не осуществлять кэширование и опережающее чтение

- FILE_FLAG_RANDOM_ACCESS - Кэшировать как файл произвольного доступа

- FILE_FLAG_SEQUENTIAL_SCAN - Кэшировать как файл последовательного доступа

- FILE_FLAG_WRITE_TROUGH - Не буферизовать операцию записи. Производить запись на диск немедленно.

- FILE_FLAG_DELETE_ON_CLOSE - Уничтожить файл при закрытии. Полезно комбинировать с атрибутом FILE_ATTRIBUTE_TEMPORARY.

- FILE_FLAG_OVERLAPPED - Работа с файлом будет осуществляться асинхронно.

Синхронный и асинхронный ввод/вывод:

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

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

 

Функции файлового ввод-вывода:

BOOL ReadFile(

HANDLE hFile, // handle of file to read

LPVOID lpBuffer, // address of buffer that receives data

DWORD nNumberOfBytesToRead, // number of bytes to read

LPDWORD lpNumberOfBytesRead, // address of number of bytes read

LPOVERLAPPED lpOverlapped // address of structure needed for overlapped I/O

);

 

BOOL WriteFile(

HANDLE hFile, // handle to file to write to

LPCVOID lpBuffer, // pointer to data to write to file

DWORD nNumberOfBytesToWrite, // number of bytes to write

LPDWORD lpNumberOfBytesRead, // pointer to number of bytes written

LPOVERLAPPED lpOverlapped // address of structure needed for overlapped I/O

);

 

Параметры функция файлового ввода-вывода:

Параметры функции ReadFile () имеют следующее предназначение:

- hFile – описатель объекта ядра “файл”, полученный в результате вызова функции CreateFile

- LpBuffer – адрес буфера, в который будет производиться чтение

- nNumberOfBytesToRead – количество байт, которые необходимо прочитать

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

- lpOverlapped – указатель на структуру OVERLAPPED, управляющую асинхронным вводом выводом.

Параметры функции WriteFile () аналогичны параметрам функции ReadFile ().

 

Пример синхронного копирования файла:

/* Open files for input and output. */

inhandle = CreateFile("data", GENERIC_READ, 0, NULL, OPEN_EXlSTING, 0, NULL);

outhandle = CreateFile ("newf", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

/* Copy the file. */

do {

s = ReadFile(inhandle, buffer, BUF_SIZE, &count, NULL);

if (s && count > 0) WriteFile(outhandle, buffer, count, Socnt, NULL);

} while (s>0 && count>0);

/* Close the files. */

CloseHandle (inhandle):

CloseHandle (outhandle);

 

Асинхронный ввод-вывод:

Для организации асинхронной работы с файлами необходимо при вызове функции CreateFile () установить флаг FILE_FLAG_OVERLAPPED в параметре dwFlagsAndAttributes.

После этого функции ReadFile () и WriteFile () будут работать асинхронно, т.е. только запускать операции ввода вывода и не ожидать их завершения.

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

 

typedef struct _OVERLAPPED {

DWORD Internal; //Используется операционной системой. Хранит статус завершения операции.

DWORD InternalHigh; //Используется ОС. Хранит количество переданных байт.

DWORD Offset; //Позиция в файле, начиная с которой необходимо

производить операцию чтения (записи).

DWORD OffsetHigh; //Количество байт для передачи.

HANDLE hEvent; //Описатель события, которое произойдет при завершении операции чтения (записи).

} OVERLAPPED;

 

Вариант 1 организации асинхронного ввода-вывода:

Перед запуском операции создается объект ядра “событие” и его описатель передается в функцию ReadFile () или WriteFile () в качестве элемента hEvent параметра lpOverlapped.

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

Выполнение программы при этом приостанавливается до завершения операции ввода-вывода.

 

Вариант 2 организации асинхронного ввода-вывода:

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

Этот метод прост и корректен, но не позволяет производить параллельно несколько операций ввода-вывода с одним и тем же файлом.

Вариант 3 организации асинхронного ввода-вывода:

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

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

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

 

Классификация методов распределения памяти.

 

9.1 Методы распределения памяти с использованием дискового пространства.

 

Понятие виртуальной памяти:

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

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

Термин виртуальная память обычно ассоциируется с возможностью адресовать пространство памяти, гораздо большее, чем емкость первичной (реальной) памяти конкретной вычислительной машины. Концепция виртуальной памяти является далеко не новой, впервые она была реализована в вычислительной машине Atlas, созданной в Манчестерском университете в Англии в 1960г.

Виртуальная память (ВП) – это совокупность программно-аппаратных средств, позволяющих выполнять программы, размер которых превосходит имеющуюся оперативную память.

Для этого менеджер ВП решает следующие задачи:

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

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

- преобразует виртуальные адреса в физические.

 

Физические и виртуальные адреса:

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

- адреса, на которые делает ссылки выполняющийся процесс, называются виртуальными адресами (ВА);

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

Для установления соответствия между ВА и ФА разработаны различные способы. Так, механизмы динамического преобразования адресов (DAT - Dynamic Address Translation) обеспечивают преобразование ВА в ФА время выполнения процесса.

Механизм отображения адресов:

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

 

Способы организации виртуальной памяти:

- страничное распределение;

- сегментное распределение;

- сегментно-страничное распределение.

 

Страничное распределение.

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

Сегментное распределение.

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

Сегментно-страничное распределение.

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

Архитектура памяти MS Windows 2000. Менеджер ВП. Виртуальное АП. Средства защиты памяти. Страничное преобразование. Реализация свопинга в MS Windows 2000-2003.

 

Менеджер виртуальной памяти:

l управление виртуальными адресными пространствами процессов;

l разделение памяти между процессами;

l защита виртуальной памяти одного процесса от других процессов.

l Менеджер виртуальной памяти (VMM) является составной частью ядра ОС. Приложения не могут получить к нему прямой доступ.

l Для управления памятью прикладным программам предоставляются различные интерфейсы (API).

 

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

Memory Mapped File API - набор функций, позволяющий работать с файлами, отображаемыми в память. Новый механизм, предоставляемый Win32 API для работы с файлами и взаимодействия процессов.

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

Local, Global Memory API - набор функций работы с памятью, совместимых с 16-битной Windows. Следует избегать их использования.

CRT Memory API - функции стандартной библиотеки языка “С” периода исполнения (runtime).

 

Архитектура API управления памятью.

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

Архитектура памяти в MS Windows 2000-2003. Проецируемые файлы, назначение и использование. Функции Win32 API.

 

Проецируемые файлы.

(Джеффри Рихтер. Windows для профессионалов.) Файлы, проецируемые (отображаемые) в память, - это один из самых замечательных… Win32 действует иначе: ОС берет на себя заботу о перемещении страниц адресного пространства процесса, находящихся в…

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

   

Объекты управления центральным процессором и объединения ресурсов в MS Windows 2000-2003. Атрибуты процессов и потоков. Классы приоритетов.

 

14.1, 14.2 Управление центральным процессором и объединение ресурсов.

Атрибуты процессов и потоков.

Объекты Windows .

Задание – набор процессов, управляемых как единое целое, с общими квотами и лимитами Процесс – контейнер для ресурсов Поток – сущность планируемая ядром

Процессы.

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

Потоки.

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

Задание (job).

Процессы Windows не поддерживают в явном виде отношения родитель-потомок, поэтому начиная с Windows 2000 в модель процессов введено новое расширение – задания (jobs).

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

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

 

Квоты и лимиты для заданий:

Квоты (базовые и расширенные базовые ограничения):

- максимальное количество процессов;

- суммарное время центрального процессора (для каждого процесса и для задания в целом);

- максимальное количество используемой памяти (для каждого процесса и для задания в целом);

Базовые ограничения по пользовательскому интерфейсу;

Ограничения, связанные с защитой.

 

Волокна (fibers).

Реализованы на уровне кода пользовательского режима. В потоке может быть одно или несколько волокон. Для ядра поток – все то, что можно вытеснить и… Процессорное время между волокнами распределяется по пользовательскому…  

Общие принципы диспетчеризация (планирование загрузки) в MS Windows 2000-2003. Классы приоритетов. Относительные приоритеты. Динамическое изменение приоритетов.

15.1 Общие принципы диспетчеризация (планирование загрузки) в MS Windows 2000-2003.

Планирование загрузки однопроцессорной системы.

Планирование загрузки процессорного времени: - В Windows реализована вытесняющая многозадачность, при которой ОС не ждет,… - Планировщик всегда выбирает из очереди поток с наивысшим приоритетом; если сразу несколько потоков имеют одинаковый…

Граф состояний потоков в MS Windows 2000-2003. Поток простоя. Принципы адаптивного планирования.

Готовность. При поиске потока на выполнение диспетчер просматривает только потоки, находящиеся в состоянии готовности,…

Граф состояний потоков в MS Windows 2000-2003. Особенности планирования в многопроцессорных системах.

  Управление потоками в МПС: Операционные системы Windows 2000-2003 руководствуется следующими базовыми стратегиями для решения того, на каких…

Граф состояний потоков в MS Windows 2000-2003. Особенности планирования в ОС MS Windows Vista и Server 2008.

  Проблема неравномерного распределения ресурсов процессора: Все версии ОС Windows собирают статистику загрузки процессора, для этого каждые 10 или 15 мс (в зависимости от…

Планирование загрузки процессорного времени в MS WINDOWS 2000-2003. Функции WIN 32 API создания и завершение процессов и потоков, управление потоками

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

Создание потока

HANDLE CreateThread (

PSECURITY_ATTRIBUTES psa,

SIZE_T cbStack,
PTHREAD_START_ROUTINE pfnStartAddr,

PVOID pvParam,

DWORD dwCreate,

PDWORD pdwThreadID

);

 

Параметры создания потока

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

Функция CreateRemoteThread

  HANDLE CreateRemoteThread( HANDLE hProcess, // дескриптор процесса

Приоритеты потоков

Поток можно завершить четырьмя способами: 1. функция потока возвращает управление (рекомендуемый способ); 2. поток самоуничтожается вызовом функции ExitThread (нежелательный способ);

Функция ExitThread

Поток можно завершить принудительно, вызвав:

VOID ExitThread(DWORD dwExitCоde);

В параметр dwExitCode Вы помещаете значение, которое система рассматривает как код завершения потока.

 

Функция TerminateThread

BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode); В параметр dwExitCode помещается код завершения потока. После того как поток… Если завершается процесс:

Засыпание и переключение потоков

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

BOOL SwitchToThread();

Вызов SwitchToThread аналогичен вызову Sleep с передачей в dwMilliseconds нулевого значения. Разница лишь в том, что SwitchToThread дает возможность…   Определение периодов выполнения потока:

Планирование загрузки процессорного времени в MS WINDOWS 2000-2003. Функции WIN 32 API создания и завершения потоков.

 

Управление потоками.

Флаг CREATE_SUSPENDED

Если поток создан с флагом CREATE_SUSPENDED, то после своего создания он остается в приостановленном состоянии. Вы можете настроить некоторые его свойства (например, приоритет, о котором мы поговорим позже). Закончив настройку, Вы должны разрешить выполнение потока. Для этого вызовите ResumeThread и пере дайте описатель потока, возвращенный функцией CreateThread.

DWORD ResumeThread(HANDLE hThread);

Выполнение потока можно приостановить не только при его создании с флагом CREATE_SUSPENDED, но и вызовом SuspendThread. Выполнение отдельного потока можно приостанавливать несколько раз. Если поток приостановлен 3 раза, то и возобновлен он должен быть тоже 3 раза — лишь тогда система выделит ему процессорное время.

DWORD SuspendThread(HANDLE hThread);

VOID Sleep ( DWORD dwMilliseconds ); Эта функция приостанавливает поток па dwMilliseconds миллисекунд. Отметим… Вызывая Sleep, поток добровольно отказывается от остатка выделенного ему кванта времени

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

 

Возникновение гонок (состязаний)

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

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

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

Представим, что каталог спулера состоит из большого числа сегментов, нумерованных 0,1, 2…, в каждом из которых может храниться имя файла. Также есть две совместно используемые переменные: out, указывающая на следующий файл для печати, и in, указывающая на следующий свободный сегмент.

Эти две переменные можно хранить в одном файле, доступном для всех процессов. Пусть в данный момент времени сегменты с 0 по 3 пусты (файлы уже напечатаны), а сегменты 4-6 заняты (файлы ждут печати).

Более или менее одновременно процессы A и B решают поставить файл в очередь на печать.

 

Возможна следующая ситуация:

1. Процесс A считывает значение (7) переменной in и сохраняет его в локальной переменной next_free_slot. После этого происходит прерывание по таймеру, и процессор переключается на процесс B. Процесс B, в свою очередь, считывает значение переменной in и сохраняет его (опять 7) в своей локальной переменной next_free_slot.

2. Теперь оба процесса считают, что следующий свободный сегмент – седьмой.

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

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

5. В результате файл процесса B не напечатается.

 

 

Критические секции

Важным понятием синхронизации потоков для решения проблемы состязаний является понятие «критической секции» программы.

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

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

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

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

Условия исключения гонок

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

В программе не должно быть предположений о скорости или количестве процессоров

Процесс вне критической секции не может блокировать другие процессы

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

Взаимное исключение с использованием критических секций

Семафоры

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

Семафор - неотрицательная целая переменная S >= 0, которая может изменяться и проверяться только посредством двух примитивов:

V(S): переменная S увеличивается на 1 единым неделимым действием. К переменной S нет доступа другим потокам во время выполнения этой операции.

P(S): уменьшение S на 1, если это возможно. Если S=0 и невозможно уменьшить S, оставаясь в области целых неотрицательных значений, то в этом случае поток, вызывающий операцию Р, ждет, пока это уменьшение станет возможным. Успешная проверка и уменьшение также являются неделимой операцией.

Иллюстрация работы семафора

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

Создание семафора

HANDLE CreateSemaphore(

LPSECURITY_ATTRIBUTE psa,

LONG lInitialCount,

LONG lMaximumCount,

LPCTRTR pszName);

HANDLE OpenSemaphore(

DWORD fdwAccess,

BOOL bInheritHandle,

LPCTSTR pszName);

Параметр lMaximumCount сообщает системе максимальное состояние семафора.

Управление семафором

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

BOOL ReleaseSemaphore(

HANDLE hSem,

LONG lReleaseCount,

PLONG plPreviousCount);

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

Поток увеличивает значение счетчика текущего числа ресурсов, вызывая функцию ReleaseSemaphore.

Она просто складывает величину lReleaseCount со значением счетчика текущего числа ресурсов. Обычно в параметре lReleaseCount передают 1.

Функция возвращает исходное значение счетчика ресурсов в *plPreviousCount.

 

Мьютексы

Иногда используется упрощенная версия семафора – мьютекс (mutex, mutual exclusion – взаимное исключение). Иногда называют еще двоичным семафором.

Мьютекс – переменная, которая может находиться в одном из двух состояний: блокированном или неблокированном.

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

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

 

Использование мьютекса

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

 

 

 

Создание мьютекса

HANDLE CreateMutex(

LPSECURITY_ATTRIBUTES psa,

BOOL fInitialOwner,

LPCTSTR pszName);

HANDLE OpenMutex(

DWORD fdwAccess,

BOOL fInheritHandle,

LPCTSTR pszName);

Параметр fInitialOwner определяет начальное состояние мьютекса:

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

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

Управление мьютексом

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

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

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

BOOL ReleaseMutex (HANDLE hMutex);

Задача о читателях и писателях

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

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

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

 

Введем два семафора: е – число пустых буферов, и f – число заполненных буферов, причем в исходном состоянии е =N, a f =0. Тогда работа потоков с общим буферным пулом может быть описана следующим образом.

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

 

Критические секции и состязания. Семафоры , атомарные операции, CRITICAL_SECTION. Задача о читателях и писателях. Предотвращение критических ситуаций и средства синхронизации процессов

Возникновение гонок (состязаний)

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

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

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

Представим, что каталог спулера состоит из большого числа сегментов, нумерованных 0,1, 2…, в каждом из которых может храниться имя файла. Также есть две совместно используемые переменные: out, указывающая на следующий файл для печати, и in, указывающая на следующий свободный сегмент.

Эти две переменные можно хранить в одном файле, доступном для всех процессов. Пусть в данный момент времени сегменты с 0 по 3 пусты (файлы уже напечатаны), а сегменты 4-6 заняты (файлы ждут печати).

Более или менее одновременно процессы A и B решают поставить файл в очередь на печать.

 

Возможна следующая ситуация:

1. Процесс A считывает значение (7) переменной in и сохраняет его в локальной переменной next_free_slot. После этого происходит прерывание по таймеру, и процессор переключается на процесс B. Процесс B, в свою очередь, считывает значение переменной in и сохраняет его (опять 7) в своей локальной переменной next_free_slot.

2. Теперь оба процесса считают, что следующий свободный сегмент – седьмой.

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

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

5. В результате файл процесса B не напечатается.

 

Критические секции

Важным понятием синхронизации потоков для решения проблемы состязаний является понятие «критической секции» программы.

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

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

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

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

Условия исключения гонок

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

В программе не должно быть предположений о скорости или количестве процессоров

Процесс вне критической секции не может блокировать другие процессы

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

Взаимное исключение с использованием критических секций

Семафоры

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

Семафор - неотрицательная целая переменная S >= 0, которая может изменяться и проверяться только посредством двух примитивов:

V(S): переменная S увеличивается на 1 единым неделимым действием. К переменной S нет доступа другим потокам во время выполнения этой операции.

P(S): уменьшение S на 1, если это возможно. Если S=0 и невозможно уменьшить S, оставаясь в области целых неотрицательных значений, то в этом случае поток, вызывающий операцию Р, ждет, пока это уменьшение станет возможным. Успешная проверка и уменьшение также являются неделимой операцией.

Иллюстрация работы семафора

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

Создание семафора

HANDLE CreateSemaphore(

LPSECURITY_ATTRIBUTE psa,

LONG lInitialCount,

LONG lMaximumCount,

LPCTRTR pszName);

HANDLE OpenSemaphore(

DWORD fdwAccess,

BOOL bInheritHandle,

LPCTSTR pszName);

Параметр lMaximumCount сообщает системе максимальное состояние семафора.

Управление семафором

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

BOOL ReleaseSemaphore(

HANDLE hSem,

LONG lReleaseCount,

PLONG plPreviousCount);

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

Поток увеличивает значение счетчика текущего числа ресурсов, вызывая функцию ReleaseSemaphore.

Она просто складывает величину lReleaseCount со значением счетчика текущего числа ресурсов. Обычно в параметре lReleaseCount передают 1.

Функция возвращает исходное значение счетчика ресурсов в *plPreviousCount.

 

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

Набор атомов собирается в таблицу (atom table). Система обеспечивает несколько таблиц атомов для разных задач. По типу доступа их два типа:

Локальные (доступны только из приложения)

Глобальные (доступны из всех приложений)

 

Функции WIN 32 API для атомов

GlobalAddAtom

GlobalGetAtomName

GlobalFindAtom

GlobalDeleteAtom

 

Сообщение WM_COPYDATA

Отправитель:

COPYDATASTRUCT cds;

cds.cbData = (DWORD) nSize;

cds.lpData = (PVOID) pBuffer;

SendMessage (hWndTarget, WM_COPYDATA, (WPARAM) hWnd, (LPARAM) &cds);

Получатель:

PCOPYDATASTRUCT pcds = (PCOPYDATASTRUCT) lParam;

PBYTE pBuffer = (PBYTE) pcds -> lpData;

 

Критические секции

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

Они называются EnterCriticalSection и LeaveCriticalSection и имеют в качестве параметра предварительно проинициализированную структуру типа CRITICAL_SECTION.

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

CRITICAL_SECTION cs;

DWORD WINAPI SecondThread()

{

InitializeCriticalSection(&cs); EnterCriticalSection(&cs);

//…критический участок кода LeaveCriticalSection(&cs);

}

Функции EnterCriticalSection и LeaveCriticalSection реализованы на основе атомарных Interlocked-функций.

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

 

Задача о читателях и писателях

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

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

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

 

Введем два семафора: е – число пустых буферов, и f – число заполненных буферов, причем в исходном состоянии е =N, a f =0. Тогда работа потоков с общим буферным пулом может быть описана следующим образом.

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

 

Синхронизация потоков с использованием объектов ядра MS Windows 2000-2003. Основные принципы синхронизации. События. Семафоры. Функции WIN 32 API.

 

Синхронизация потоков с использованием объектов ядра Windows 2000

Простейшей формой связи потоков является синхронизация (synchronization).

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

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

 

Синхронизационные объекты и их состояния

1. процессы

2. потоки

3. задания

4. файлы

5. консольный ввод

6. уведомления об изменении файлов

7. события

8. ожидаемые таймеры

9. семафоры

10. мьютексы

 

Свободен Занят

Средства ожидания и сообщения реализованы в ядре Windows как часть объектной архитектуры.

Синхронизационные объекты (synchronization objects) – это объекты ядра, при помощи которых поток синхронизирует свое выполнение.

В любой момент времени синхронизационный объект находится в одном из двух состояний: свободен (signaled state) или занят.

Правила, по которым объект переходит в свободное или занятое состояние, зависят от типа этого объекта:

Объект-поток находится в состоянии «занят» все время существования, но устанавливается системой в состояние "свободен", когда его выполнение завершается. Аналогично, ядро устанавливает процесс в состояние "свободен", когда завершился его последний поток.

В противоположность этому, объект – таймер «срабатывает» через заданное время (по истечении этого времени ядро устанавливает объект – таймер в состояние "свободен").

 

События

 

События – самая примитивная разновидность объектов ядра.

События содержат счетчик числа пользователей (как и все объекты ядра) и две булевы переменные: одна сообщает тип данного объекта-события, другая – его состояние (свободен или занят).

События просто уведомляют об окончании какой-либо операции. Объекты-события бывают двух типов: со сбросом вручную (manual-reset events) и с автосбросом (auto-reset events). Разница в том, что первый вид события нужно применять если событие ждут несколько потоков. Только сброс вручную позволяет это сделать. Иначе первый же обработчик сбросит событие и другие потоки об этом не узнают.

Объекты-события обычно используют в том случае, когда какой-то поток выполняет инициализацию, а затем сигнализирует другому потоку, что тот может продолжить работу. Инициализирующий поток переводит объект "событие” в занятое состояние и приступает к своим операциям. Закончив, он сбрасывает событие в свободное состояние. Тогда другой поток, который ждал перехода события в свободное состояние, пробуждается и вновь становится планируемым.

 

Иллюстрация работы “события”

       
   
 

 

 

событие с ручным сбросом событие с автоматическим сбросом

Создание события

HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES psa,

BOOL fManualReset,

BOOL fInitialState,

LPCTSTR pszName);

HANDLE OpenEvent(

DWORD fdwAccess,

BOOL fInhent,

LPCTSTR pszName);

 

Объект ядра “событие" создается функцией CreateEvent.

Параметр fManualReset (булева переменная) сообщает системе, хотите Вы создать событие со сбросом вручную (TRUE) или с автосбросом (FALSE).

Параметр fInitialState определяет начальное состояние события – свободное (TRUE) или занятое (FALSE). После того как система создает объект событие, CreateEvent возвращает описатель события, специфичный для конкретного процесса.

Потоки из других процессов могут получить доступ к этому объекту:

наследованием описателя с применением функции DuplicateHandle;

вызовом OpenEvent c передачей в параметре pszName имени, совпадающего с указанным в аналогичном параметре функции CreateEvent.

 

Управление событием

Перевод события в свободное состояние:

BOOL SetEvent (HANDLE hEvenеt);

Перевод события в занятое состояние:

BOOL ResetEvent (HANDLE hEvent);

Освобождение события и перевод его обратно в занятое состояние:

BOOL PulseEvent (HANDLE hEvent);

Особенности PulseEvent

Функция PulseEvent устанавливает событие и тут же переводит его обратно в сброшенное состояние.

Ее вызов равнозначен последовательному вызову SetEvent и ResetEvent. Если PulseEvent вызывается для события со сбросом вручную, то все потоки, ожидающие этот объект, получают управление.

При вызове PulseEvent для события с автосбросом пробуждается только один из ждущих потоков. А если ни один из потоков не ждет объект-событие, вызов функции не дает никакого эффекта.

Семафоры

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

Семафор - неотрицательная целая переменная S >= 0, которая может изменяться и проверяться только посредством двух примитивов:

V(S): переменная S увеличивается на 1 единым неделимым действием. К переменной S нет доступа другим потокам во время выполнения этой операции.

P(S): уменьшение S на 1, если это возможно. Если S=0 и невозможно уменьшить S, оставаясь в области целых неотрицательных значений, то в этом случае поток, вызывающий операцию Р, ждет, пока это уменьшение станет возможным. Успешная проверка и уменьшение также являются неделимой операцией.

Иллюстрация работы семафора

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

Создание семафора

HANDLE CreateSemaphore(

LPSECURITY_ATTRIBUTE psa,

LONG lInitialCount,

LONG lMaximumCount,

LPCTRTR pszName);

HANDLE OpenSemaphore(

DWORD fdwAccess,

BOOL bInheritHandle,

LPCTSTR pszName);

Параметр lMaximumCount сообщает системе максимальное состояние семафора.

Управление семафором

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

BOOL ReleaseSemaphore(

HANDLE hSem,

LONG lReleaseCount,

PLONG plPreviousCount);

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

Поток увеличивает значение счетчика текущего числа ресурсов, вызывая функцию ReleaseSemaphore.

Она просто складывает величину lReleaseCount со значением счетчика текущего числа ресурсов. Обычно в параметре lReleaseCount передают 1.

Функция возвращает исходное значение счетчика ресурсов в *plPreviousCount.

Синхронизация потоков с использованием объектов ядра MS Windows 2000-2003. Основные принципы синхронизации. Таймеры ожидания. Мьютексы. Функции WIN 32 API.

 

Синхронизация потоков с использованием объектов ядра Windows 2000

Простейшей формой связи потоков является синхронизация (synchronization).

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

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

 

Синхронизационные объекты и их состояния

  1. процессы

2. потоки

3. задания

4. файлы

5. консольный ввод

6. уведомления об изменении файлов

7. события

8. ожидаемые таймеры

9. семафоры

10. мьютексы

 

Свободен Занят

Средства ожидания и сообщения реализованы в ядре Windows как часть объектной архитектуры.

Синхронизационные объекты (synchronization objects) – это объекты ядра, при помощи которых поток синхронизирует свое выполнение.

В любой момент времени синхронизационный объект находится в одном из двух состояний: свободен (signaled state) или занят.

Правила, по которым объект переходит в свободное или занятое состояние, зависят от типа этого объекта:

Объект-поток находится в состоянии «занят» все время существования, но устанавливается системой в состояние "свободен", когда его выполнение завершается. Аналогично, ядро устанавливает процесс в состояние "свободен", когда завершился его последний поток.

В противоположность этому, объект – таймер «срабатывает» через заданное время (по истечении этого времени ядро устанавливает объект – таймер в состояние "свободен").

 

Ожидающие таймеры

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

Создание ожидающего таймера

HANDLE CreateWaitableTimer(

LPSECURITY_ATTRIBUTES psa,

BOOL fManualReset,

LPCTSTR pszName);

HANDLE OpenWaitableTimer(

DWORD dwDesiredAccess,

BOOL bInheritHandle,

LPCTSTR pszName);

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

Объекты «ожидающий таймер» всегда создаются в занятом состоянии.

Управление ожидающим таймером

BOOL SetWaitableTimer(

HANDLE hTimer,

const LARGE_INTEGER *pDueTime,

LONG lPeriod,

LPTIMERAPCROUTINE pfnCompletionRoutine,

LPVOID pvArgToCompletionRoutine,

BOOI fResume);

BOOL CancelWaitableTimer (HANDLE hTimer);

 

Эта функция принимает несколько параметров, в которых легко запутаться. Очевидно, что hTimer определяет нужный таймер. Следующие два параметра (pDuеТimе и lPeriod) используются совместно, первый из них задает, когда таймер должен сработать в первый раз, второй определяет, насколько часто это должно происходить в дальнейшем.

Обычно нужно, чтобы таймер сработал только раз – через определенное (абсолютное или относительное) время перешел в свободное состояние и уже больше никогда не срабатывал Для этого достаточно передать 0 в параметре lPeriod Затем можно либо вызвать CloseHandle, чтобы закрыть таймер, либо перенастроить таймер повторным вызовом SetWaitableTimer с другими параметрами.

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

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

 

Мьютексы

Иногда используется упрощенная версия семафора – мьютекс (mutex, mutual exclusion – взаимное исключение). Иногда называют еще двоичным семафором.

Мьютекс – переменная, которая может находиться в одном из двух состояний: блокированном или неблокированном.

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

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

 

Использование мьютекса

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

 

Создание мьютекса

HANDLE CreateMutex(

LPSECURITY_ATTRIBUTES psa,

BOOL fInitialOwner,

LPCTSTR pszName);

HANDLE OpenMutex(

DWORD fdwAccess,

BOOL fInheritHandle,

LPCTSTR pszName);

Параметр fInitialOwner определяет начальное состояние мьютекса:

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

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

Управление мьютексом

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

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

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

BOOL ReleaseMutex (HANDLE hMutex);

 

 

Межпроцессорное взаимодействие. Передача информации в MS Windows 2000-2003. Анонимные каналы. Почтовые ящики. Функции WIN 32 API.

Анонимные каналы Анонимные каналы не имеют имен. Не пригодны для обмена через сеть.

Межпроцессорное взаимодействие. Передача информации в MS Windows 2000-2003. Именованные каналы. Почтовые ящики. Функции WIN 32 API.

Виды межпроцессорного взаимодействия (IPC) Предотвращение критических ситуаций Синхронизация процессов

– Конец работы –

Используемые теги: определение, ОС, Функции, ОС, процессы, потоки, Классификация, ОС, История, развития0.135

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Определение ОС. Функции ОС. Процессы и потоки. Классификация ОС. История развития

Что будем делать с полученным материалом:

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

Еще рефераты, курсовые, дипломные работы на эту тему:

Лекция: Уровни абстракции ОС. ОС с архитектурой микроядра. Виртуальные машины. Цели проектирования и разработки ОС. Генерация ОС В лекции рассматриваются следующие вопросы: методы проектирования и реализации ОС: уровни абстракции ОС; ОС с архитектурой мик
В лекции рассматриваются следующие вопросы методы проектирования и реализации... Содержание Введение Уровни абстракции ОС Операционные системы с микроядром Виртуальные машины другой распространенный подход к...

ПБУ 6/01 Учет ОС. Порядок признания ОС в учете. Организация аналитического учета ОС. Первичная документация по учету и инвентаризации ОС
Определение и классификация нематериальных активов особенности их учета ПБУ Учет НМА Условия признания НМА в бухгалтерском учете... Порядок бухгалтерского учета нематериальных активов регулируется Положением по бухгалтерскому учету Учет...

Лекция 1. ВВЕДЕНИЕ. ПРЕДМЕТ ГИДРАВЛИКИ И КРАТКАЯ ИСТОРИЯ ЕЕ РАЗВИТИЯ 1.1. Краткая история развития гидравлики
Лекция ВВЕДЕНИЕ ПРЕДМЕТ ГИДРАВЛИКИ И КРАТКАЯ ИСТОРИЯ ЕЕ РАЗВИТИЯ... Лекция ОСНОВЫ ГИДРОСТАТИКИ Гидростатическое давление Основное уравнение гидростатики Давление...

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

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

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

ПБУ 6/01 Учет ОС. Порядок признания ОС в учете. Организация аналитического учета ОС. Первичная документация по учету и инвентаризации ОС
Определение и классификация нематериальных активов особенности их учета ПБУ Учет НМА Условия признания НМА в бухгалтерском учете... Порядок бухгалтерского учета нематериальных активов регулируется Положением по бухгалтерскому учету Учет...

Лекции по дисциплине История Отечественная история, История России
Составитель к и н доцент УШКАЛОВ В А г Составитель лекций к ф н доцент Топчий И В... Лекция Введение Теоретические проблемы истории...

Классификация ОС универсальные операционные системы и ОС специального назначения
По алгоритмам управления ресурсами... однозадачные ОС MS DOS предоставляет пользователю виртуальную машину... многозадачные Windows Unix поддерживают параллельное исполнение некоторых задач...

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

0.037
Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • По категориям
  • По работам