Добавил:
github.com Кофедра ВТ-помойка Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Тимофеев 2018 / ОС 3 лаб

.docx
Скачиваний:
32
Добавлен:
26.01.2019
Размер:
3.18 Mб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра вычислительной техники

отчет

по лабораторной работе №3

по дисциплине «Операционные системы»

Тема: «Управление файловой системой»

Студент гр. 6307

Лазарев С. О.

Преподаватель

Тимофеев А. В.

Санкт-Петербург

2018

Выполнение лабораторной работы:

Задание 3.1 Управление дисками, каталогами и файлами.

Отображение процесса в утилите livekd его PID = =

Получим информацию о дескрипторах:

Отображение в утилите handle

Не вызывая ни одной функции winapi программа получает 50 дескрипторов. Будем последовательно выполнять пункты меню и смотреть на изменение количества предоставленных программе дескрипторов.

  1. Выполнение пункта меню 1 – просмотр количества жестких дисков; функции winapi - GetLogicalDrives и GetLogicalDriveStrings:

Количество дескрипторов не изменилось.

  1. Выполнение пункта меню 2 – просмотр подобной информации о жестких дисках; функции winapi – GetVolumeInformationA, GetDriveTypeA, GetDiskFreeSpaceA.

Количество дескрипторов никак не изменилось.

  1. Выполнение пункта меню 3 – создание директории; функции winapi – CreateDirectoryA.

Создадим тестовую папку NewDir.

Количество дескрипторов не изменилось.

  1. Выполнение пункта меню 4 – удаление директории; функции winapi – RemoveDirectoryA.

Удалим тестовую папку NewDir.

Количество дескрипторов не изменилось.

  1. Выполнение пункта меню 5 – создание файлов; функции winapi – CreateFileA.

Создадим файл NewFile.

Количество дескрипторов не изменилось.

Закомментируем в исходном коде функцию CloseHandle, перекомпилируем и запустим программу снова.

Новый cid процесса равен 33F416. Количество дескрипторов, предоставляемых программе осталось прежним: 50.

Создадим файл NewFile1

Количество дескрипторов увеличилось на 1.

Незакрытый дескриптор:

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

  1. Выполнение пункта меню 6 – копирование файлов; функции winapi – CopyFile.

Количество дескрипторов в HandleCount увеличилось на 16.

По сравнению с предыдущим пунктом появилось 10 дескрипторов на объекты типа Semaphore, 5 – EtwRegistration, 1 - File

Повторим операцию. Скопируем файл NewFile2 в новый файл и проверим количество дескрипторов, предоставляемых процессу:

Количество дескрипторов не изменилось.

  1. Выполнение пункта меню 7 – перемещение файлов; функции winapi – MoveFile.

Переместим файл text.txt на уровень выше

Количество дескрипторов не изменилось.

  1. Выполнение пункта меню 8 – перемещение файлов с заменой; функции winapi – MoveFileExA.

Переместим файл NewFile на уровень выше с заменой файла hi.cpp

Количество дескрипторов не изменилось.

  1. Выполнение пункта меню 9 – просмотр атрибутов файла; функции winapi GetFileAttributesA.

Количество дескрипторов не изменилось.

  1. Выполнение пункта меню 10 – получение временной информации о файле по его; функции winapi GetFileTime.

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

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

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

  1. Выполнение пункта меню 11 – получение информации о файле по его дескриптору; функции winapi GetFileInformationByHandle.

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

Новый cid нашего процесса = 14BC;

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

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

Количество дескрипторов снова увеличилось на 1.

Новый дескриптор, указывающий на файл C:/users/frose/source/repos/os3/os3/folder/hi.cpp:

  1. Выполнение пункта меню 12 – установка атрибутов файлов; функции winapi SetFileAttributesA.

Установим 3 новых атрибута файлу просмотренному в предыдущем пункте. Удалим атрибут Archived.

Проверим установленные атрибуты функцией GetFileAttributesA:

Проверим состояние выделенных дескрипторов:

Количество дескрипторов не изменилось.

  1. Выполнение пункта меню 13 – установка временной информации о файле; функции winapi SetFileTime.

Количество дескрипторов не изменилось. В конце функций вызывающих SetFileTime, getFileTime использована CloseHandle. Дескриптор открытый в функции вызывающей getFileInforamtionByHandle по прежнему открыт, поскольку там CloseHandle была закомментирована.

В функции createFile, вызывающей функцию CreateFileA, и в функции getFileInforamtionByHandle, вызывающей, GetFileInformationByHandle были допущены утечки дескрипторов. Воспользуемся этими функциями для работы с одним и тем же файлом.

Новый cid 2D8416

До вызова функций с утечкой дескриптора программе было предоставлено 50 дескрипторов, после – 52.

00d4 и 00dc последние в таблице дескрипторы на один и тот же файл, предоставленные программе.

У каждого процесса есть ограничение на количество предоставляемых ему дескрипторов, превысив которые система не даст создавать процессу объекты. При каждом вызове функции CreateFileA и GetFileInformationByHandle объявленные в windows.h возвращают дескриптор на файл. Если бы мы много раз вызывали функции возвращающие дескриптор на файл и не закрывали его то получили бы проблемы с производительностью и аварийные отказы программы.

Новый cid BF816

Получим дескриптор на файл в функции getFileInforamtionByHandle, но после функции CreateFileA возвращающей дескриптор вызовем функцию system("pause"); и закроем предоставленный программе дескриптор через утилиту handle. Дальше в коде функция GetFileInformationByHandle использует переменную содержащую закрытый дескриптор. Посмотрим на результат:

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

3.2. Копирование файла с помощью операция перекрывающегося ввода-вывода

Для исследования выберем файлы small.txt размером 100 000 000 байт (95,3 МБ), файл bigfile.txt размером 5 300 000 000 байт (4,93 ГБ).

Работа с файлом small.txt:

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

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

Оптимальным можно считать блок размером 500*4096 байт (234мс)

Сверим исходные файлы и их копии:

Зафиксируем размер блока в 500*4096 байт и будем последовательно изменять количество перекрывающихся операций ввода вывода.

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

Работа с файлом bigfile.txt:

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

По горизонтали – размер блока в Кб, по вертикали – длительность в мс.

Оптимальным можно считать блок размером 1000*4096 байт (40500 мс)

Зафиксируем размер блока в 1000*4096 байт и будем последовательно изменять количество перекрывающихся операций ввода вывода.

График зависимости длительности копирования от количество перекрывающихся операций

Выводы: исходя из результатов эксперимента, копирование файлов большими блоками дает многократное сокращение времени копирования, однако для небольших файлов множители выше 10 не дают такого значительного увеличения быстродействия, а слишком большие блоки уже наоборот могут сильно увеличить время. Для таких файлов оптимальным будет размер блока в 10-20 раз меньше размера подобного файла. Для файла же большего размера оптимальным оказался множитель 1000, отыграв у тестов с множителями менее 1000 более 10 секунд. Увеличение же операции перекрывающего ввода-вывода не дало хоть сколь заметного прироста, а разница между временем больше похоже на погрешность, за исключением случаев с большим количеством таких операций: там время наоборот увеличилось. Однако функции ReedFileEx и WriteFileEx позволяют убрать чтение и запись файла в фон, в то время как программа будет продолжать работу.

Анализ в LiveKD:

В начале работы программе предоставлено 50 дескрипторов.

После ввода основных данных количество дескрипторов не изменилось

Число дескрипторов выросло на 2: дескриптор файла big.txt (чтение) и дескриптор файла big12.txt (запись).

Вывод:

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

Соседние файлы в папке Тимофеев 2018