Тимофеев 2018 / ОС 3 лаб
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра вычислительной техники
отчет
по лабораторной работе №3
по дисциплине «Операционные системы»
Тема: «Управление файловой системой»
Студент гр. 6307 |
|
Лазарев С. О. |
Преподаватель |
|
Тимофеев А. В. |
Санкт-Петербург
2018
Выполнение лабораторной работы:
Задание 3.1 Управление дисками, каталогами и файлами.
Отображение процесса в утилите livekd его PID = =
Получим информацию о дескрипторах:
Отображение в утилите handle
Не вызывая ни одной функции winapi программа получает 50 дескрипторов. Будем последовательно выполнять пункты меню и смотреть на изменение количества предоставленных программе дескрипторов.
-
Выполнение пункта меню 1 – просмотр количества жестких дисков; функции winapi - GetLogicalDrives и GetLogicalDriveStrings:
Количество дескрипторов не изменилось.
-
Выполнение пункта меню 2 – просмотр подобной информации о жестких дисках; функции winapi – GetVolumeInformationA, GetDriveTypeA, GetDiskFreeSpaceA.
Количество дескрипторов никак не изменилось.
-
Выполнение пункта меню 3 – создание директории; функции winapi – CreateDirectoryA.
Создадим тестовую папку NewDir.
Количество дескрипторов не изменилось.
-
Выполнение пункта меню 4 – удаление директории; функции winapi – RemoveDirectoryA.
Удалим тестовую папку NewDir.
Количество дескрипторов не изменилось.
-
Выполнение пункта меню 5 – создание файлов; функции winapi – CreateFileA.
Создадим файл NewFile.
Количество дескрипторов не изменилось.
Закомментируем в исходном коде функцию CloseHandle, перекомпилируем и запустим программу снова.
Новый cid процесса равен 33F416. Количество дескрипторов, предоставляемых программе осталось прежним: 50.
Создадим файл NewFile1
Количество дескрипторов увеличилось на 1.
Незакрытый дескриптор:
Таким образом, не использовав функцию CloseHandle мы допустили утечку дескриптора файла.
-
Выполнение пункта меню 6 – копирование файлов; функции winapi – CopyFile.
Количество дескрипторов в HandleCount увеличилось на 16.
По сравнению с предыдущим пунктом появилось 10 дескрипторов на объекты типа Semaphore, 5 – EtwRegistration, 1 - File
Повторим операцию. Скопируем файл NewFile2 в новый файл и проверим количество дескрипторов, предоставляемых процессу:
Количество дескрипторов не изменилось.
-
Выполнение пункта меню 7 – перемещение файлов; функции winapi – MoveFile.
Переместим файл text.txt на уровень выше
Количество дескрипторов не изменилось.
-
Выполнение пункта меню 8 – перемещение файлов с заменой; функции winapi – MoveFileExA.
Переместим файл NewFile на уровень выше с заменой файла hi.cpp
Количество дескрипторов не изменилось.
-
Выполнение пункта меню 9 – просмотр атрибутов файла; функции winapi GetFileAttributesA.
Количество дескрипторов не изменилось.
-
Выполнение пункта меню 10 – получение временной информации о файле по его; функции winapi GetFileTime.
Первый аргумент функции GetFileTime – объект типа HANDLE. Попытаемся получить информацию о файле из предыдущего пункта.
В функции, которая вызывает функцию win32api файлу был предоставлен новый дескриптор и перед выходом из функции закрыт. Новый дескриптор независим от предыдущего незакрытого дескриптора на этот же файл, в программе не произошло никаких ошибок.
Если бы в конце функции, которая вызывает getFileTime, не была использована CloseHandle мы бы получили ещё одну утечку дескриптора.
-
Выполнение пункта меню 11 – получение информации о файле по его дескриптору; функции winapi GetFileInformationByHandle.
Опять же, поскольку в исходном коде программы была использована функция CloseHandle количество дескрипторов не поменялось. Закомментируем её, и перекомпилируем запустим программу снова:
Новый cid нашего процесса = 14BC;
Количество дескриптор вернулось к изначальному количеству. При выходе из программы дескриптор не закрытого файла и дескрипторы на объекты семафор были удалены.
Выполним функцию получения информации о файле по дескриптору, не закрыв дескриптор:
Количество дескрипторов снова увеличилось на 1.
Новый дескриптор, указывающий на файл C:/users/frose/source/repos/os3/os3/folder/hi.cpp:
-
Выполнение пункта меню 12 – установка атрибутов файлов; функции winapi SetFileAttributesA.
Установим 3 новых атрибута файлу просмотренному в предыдущем пункте. Удалим атрибут Archived.
Проверим установленные атрибуты функцией GetFileAttributesA:
Проверим состояние выделенных дескрипторов:
Количество дескрипторов не изменилось.
-
Выполнение пункта меню 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, и предоставляющие ту или иную часть его возможностей в более удобном виде.