1. Программа фонового копирования с размещением заданий в каталоге. - существует отдельная папка, где располагаются задания - задания представляют собой простой текстовый файл, состоящий из двух частей откуда и куда, с возможностью задания маски - программа отслеживает наличие какого-либо файла в папке. Как только он появляется, начинается выполнение задания - по завершению задания, файл с заданием удаляется - для каждого отдельного задания запускается отдельный поток --------------------------------------------------------------Для работы с потоками используются функция CreateThread. ПОТОКИ HANDLE CreateThread( LPSECURITY ATTRIBUTES ProcAttr, SIZT_T StackSize, LPTHREAD_START_ROUTINE Func, LPVOID Params, DWORD Flags, LPWORD ThreadId) 1) Показывает NULL 2) Размер стэка зависит от того, что делает поток 3) Функция, которая будет запущена в качестве потока 4) Параметр, который попадает в функцию как данные 5) Создать, но не запускать 6) Iв потока VOID ExitThread(DWORD ExitCode) Завершение потока. BOOL TerminateThread(HANDLE h, DWORD ExitCode) DWORD [Suspend/Resume] Thread(HANDLE h) Suspend – приостановить работу потока Resume – возобновить работу потока Действие функции Suspend является накапливаемым (если два раза запустить функцию SuspendThread одному и тому же потоку, то необходимо вызвать дважды ResumeThread) BOOL SwitchToThread() Вызвать планировщик системы. DWORD SetThreadAffinitiMask(HANDLE h, DWORD NetMask) Уст. множество процессоров, на которых поток может работать. Результат – предыдущая маска, в которой все работало DWORD SetThreadIdealProcessor(HANDLE h, DWORD NProc) Устанавливаем для потока предпочитаемый процессор. Если все равно какой процессор, то вместо NProc ставим константу MAXIMUM_PROCESSOR. 2. Программа фонового копирования с получением заданий по каналу - задания должны получаться программой по именованному каналу - задание предоставляет собой пары имен файлов разделенных символом '|' - для каждого отдельного задания запускается отдельный поток -----------------------------------------------------------------------------------Для работы с именованным каналом используется функция CreateNamePipe Именованные каналы. Каналы – способ локального и сетевого взаимодействия. 1) функции сервера 2) функции клиента Каналы должны быть с одним именем. 1. СЕРВЕР Создать канал: HANDLE CreateNamePipe( LPCTSRT pipename, DWORD openmode, // режим открытия DWORD pipemode, DWORD maxinstance, DWORD outbufsize, DWORD inbufsize, LPSECURITY ATTRIBUTES ProcAttr,//атрибуты безопасности ) Имя канала: \\.\pipe\<имя > - до 256 символов FILE_FLAG_FIRST_PIPE_INSTANCE – может присутствовать во втором параметре: PIPE_ACCESS_DUPLEX, PIPE_ACCESS_INBOUND, PIPE_ACCESS_OUTBOUND FILE_FLAG_WRITE_THROUGH – если процессы находятся на разных машинах в сети FILE_FLAG_OVERLAPPED – асинхронный режим (для канала) PIPE_TYPE_BYTE и PIPE_TYPE_MESSAGE – каждая запись в канал – пакет PIPE_READMODE_BYTE, PIPE_READMODE_MESSAGE MAXINSTANCES – max допустимое число каналов с таким именем PIPE_UNLIMITED_INSTANCES DEFOULTTimeout – время ожидания Серверная сторона CREATE_NAMED_PIPE BOOL ConnectNamePipe(HANDLE h, LPOVERLAPPED Ov) BOOL DisconnectNamedPipe(HANDLE h) 2. КЛИЕНТ BOOL WiatNamedPipe(LPCTSTR Name, DWORD TimeOut) Подключиться к каналу: CreateFile В виде имени – имя канала \\<pc>\piep\<имя> BOOL CallNamedPipe( LPCTSTR NamePipe, //имя канала LPVOID InBuf, // входные параметры DWORD InSize, // сколько будет отправлено байт LPVOID OutBuf, // выходной результат DWORD OutSize, // полный размер буфера LPDWORD BytesRead, // сколько реально прочитано DWORD TimeOut) 3. Эмуляция планировщика процессов с использованием волокон (Fiber). Алгоритм "лотерейное планирование". ------------------------------------------------------------------------------------Для работы с волокнами используется функция CreateFiber LPVOID CreateFiber( SIZE_T StackSize, LPFIBER_START_ROUTINE Func, LPVOID Params) – создаем волокно. VOID DeleteFiber(LPVOID f) – удаление волокны LPVOID ConvertThreadToFiber (LPVOID Params) – прежде чем начать работу один поток превратить в волокно. BOOL ConvertFiberToThread() – уничтожаем структуру волокна и превращаем его в поток VOID SwitchToFiber(LPVOID f) – переключиться на указанное волокно Лотерейное планирование В основе алгоритма лежит раздача потокам лотерейных билетов на доступ к различным ресурсам, в том числе и процессору. Когда планировщику необходимо принять решение, выбирается случайным образом лотерейный билет, и его обладатель получает доступ к ресурсу. Более важным потоком в этом случае выдается большее число билетов. Каждый поток получает количество ресурсов, пропорциональное количеству имеющихся у него билетов. Например, если всего 100 билетов, и 20 из них находятся у одного потока, то в среднем ему будет доставаться около 20% времени центрального процессора. Лотерейное планирование характеризуется несколькими интересными свойствами. Например, при изменении у потока количества билетов, его шансы увеличиваются уже в следующем розыгрыше, то есть лотерейное планирование обладает высоко отзывчивостью. Кроме того, взаимодействующие потоки могут при необходимости обмениваться билетами в зависимости от того, кому нужнее в данный момент тот или иной ресурс. И, наконец, с помощью лотерейного планирования можно легко организовать загрузку центрального процессора несколькими постоянно готовыми к исполнению потоками в определенной пропорции, например 50:20:20:2:1. 4. Эмуляция планировщика процессов с использованием волокон (Fiber). Алгоритм "циклическое планирование". --------------------------------------------------------------------------Для работы с волокнами используется функция CreateFiber LPVOID CreateFiber( SIZE_T StackSize, LPFIBER_START_ROUTINE Func, LPVOID Params) – создаем волокно. VOID DeleteFiber(LPVOID f) – удаление волокны LPVOID ConvertThreadToFiber (LPVOID Params) – прежде чем начать работу один поток превратить в волокно. BOOL ConvertFiberToThread() – уничтожаем структуру волокна и превращаем его в поток VOID SwitchToFiber(LPVOID f) – переключиться на указанное волокно 5. Эмуляция планировщика процессов с использованием волокон (Fiber). Алгоритм "случайный выбор". --------------------------------------------------------------------------Для работы с волокнами используется функция CreateFiber LPVOID CreateFiber( SIZE_T StackSize, LPFIBER_START_ROUTINE Func, LPVOID Params) – создаем волокно. VOID DeleteFiber(LPVOID f) – удаление волокны LPVOID ConvertThreadToFiber (LPVOID Params) – прежде чем начать работу один поток превратить в волокно. BOOL ConvertFiberToThread() – уничтожаем структуру волокна и превращаем его в поток VOID SwitchToFiber(LPVOID f) – переключиться на указанное волокно 6. Эмуляция планировщика процессов с использованием волокон (Fiber). Алгоритм "приоритетные счетчики". --------------------------------------------------------------------------Для работы с волокнами используется функция CreateFiber LPVOID CreateFiber( SIZE_T StackSize, LPFIBER_START_ROUTINE Func, LPVOID Params) – создаем волокно. VOID DeleteFiber(LPVOID f) – удаление волокны LPVOID ConvertThreadToFiber (LPVOID Params) – прежде чем начать работу один поток превратить в волокно. BOOL ConvertFiberToThread() – уничтожаем структуру волокна и превращаем его в поток VOID SwitchToFiber(LPVOID f) – переключиться на указанное волокно Алгоритм "приоритетные счетчики". Планировщик использует для определения порядка выполнения потоков алгоритм, основанный на приоритетах, в соответствии с которым каждому потоку присваивается число - приоритет, и потоки с более высоким приоритетом выполняются раньше потоков с меньшим приоритетом. Процесс получает базовый приоритет в тот момент, когда его создает подсистема той или иной прикладной среды. Значение базового приоритета присваивается процессу системой по умолчанию, или системным администратором, или указывается при вызове родительским процессом. Поток наследует этот базовый приоритет и может изменить его, немного увеличив или уменьшив. На основании получившегося в результате приоритета, называемого приоритетом планирования, производится планирование выполнения потоков. 7. Cервер шифрации данных на основе именованных каналов Для работы с именованным каналом используется функция CreateNamePipe Именованные каналы. Каналы – способ локального и сетевого взаимодействия. 3) функции сервера 4) функции клиента Каналы должны быть с одним именем. 3. СЕРВЕР Создать канал: HANDLE CreateNamePipe( LPCTSRT pipename, DWORD openmode, // режим открытия DWORD pipemode, DWORD maxinstance, DWORD outbufsize, DWORD inbufsize, LPSECURITY ATTRIBUTES ProcAttr,//атрибуты безопасности ) Имя канала: \\.\pipe\<имя > - до 256 символов FILE_FLAG_FIRST_PIPE_INSTANCE – может присутствовать во втором параметре: PIPE_ACCESS_DUPLEX, PIPE_ACCESS_INBOUND, PIPE_ACCESS_OUTBOUND FILE_FLAG_WRITE_THROUGH – если процессы находятся на разных машинах в сети FILE_FLAG_OVERLAPPED – асинхронный режим (для канала) PIPE_TYPE_BYTE и PIPE_TYPE_MESSAGE – каждая запись в канал – пакет PIPE_READMODE_BYTE, PIPE_READMODE_MESSAGE MAXINSTANCES – max допустимое число каналов с таким именем PIPE_UNLIMITED_INSTANCES DEFOULTTimeout – время ожидания Серверная сторона CREATE_NAMED_PIPE BOOL ConnectNamePipe(HANDLE h, LPOVERLAPPED Ov) BOOL DisconnectNamedPipe(HANDLE h) 4. КЛИЕНТ BOOL WiatNamedPipe(LPCTSTR Name, DWORD TimeOut) Подключиться к каналу: CreateFile В виде имени – имя канала \\<pc>\piep\<имя> BOOL CallNamedPipe( LPCTSTR NamePipe, //имя канала LPVOID InBuf, // входные параметры DWORD InSize, // сколько будет отправлено байт LPVOID OutBuf, // выходной результат DWORD OutSize, // полный размер буфера LPDWORD BytesRead, // сколько реально прочитано DWORD TimeOut) 8. Cервер шифрации блоков данных на основе сокетов --------------------------------------------------------------------Способ сетевого взаимодействия. Сервер, основанный на сокетном протоколе, позволяет обслуживать сразу множество клиентов. Причем, ограничение на их количество Вы можете указать сами (или вообще убрать это ограничение, как это сделано по умолчанию). Для каждого подключенного клиента сервер открывает отдельный сокет, по которому Вы можете обмениваться данными с клиентом. На сайте de.dstu.edu.ru на факультете «Информатика и вычислительная техника», на кафедре «ПОВТиАС» находится методичка «Принципы построения и услуги сети Internet», автор Сукиязов, в ней подробно расписано как работать с сокетами. 9. Модель файловой системы FAT16 в файле Программа может иметь как консольный, так и Windows интерфейс. Файловая система должна моделироваться в рамках файла, то есть диск – это файл, который создается во время запуска программы. В программе необходимо реализовать следующие операции: Форматирование ФС Создание папки Создание файла. Необходимо предусмотреть возможность: когда добавляется текстовый файл, чтобы можно было ввести строку текста и сохранить в этом файле, для другого типа файла (отличного от текстового) указать размер. Просмотреть информацию об объеме свободного и занятого места в памяти. Просмотр и редактирование содержимого для текстового файла. Переименование папки и файла. Копирование одного файла, папки (со всем ее содержимым), группы файлов. Перемещение одного файла, папки (со всем ее содержимым), группы файлов. Удаление файла, папки (со всем ее содержимым), группы файлов. Просмотр содержимого папки. ------------------------------------------------------------FAT - File Allocation Table (таблица размещения файлов) - этот термин относится к одному из способов организации файловой системы на диске. Эта таблица хранит информацию о файлах на жестком диске в виде последовательности чисел, определяющих, где находится каждая часть каждого файла. С ее помощью операционная система выясняет, какие кластеры занимает нужный файл. FAT является самой распространенной файловой системой и поддерживается подавляющим большинством операционных систем. В файловой системе FAT16 на каждый кластер в таблице размещения файлов отводится по 2 байта Структура системы FAT Логический диск, отформатированный в системе FAT, имеет следующие разделы: загрузочный сектор; таблица размещения файлов — собственно FAT (традиционно в двух экземплярах); корневой каталог; файлы. Для хранения файлов всё доступное для них пространство разбивается на кластеры. Таблица размещения файлов содержит ячейки, каждая из которых указывает на определённый кластер на жёстком диске. Если кластер принадлежит файлу, то его ячейка содержит номер следующей ячейки этого же файла. Если ячейка указывает на конец файла, она содержит значение «FFFF». Неиспользуемые кластеры помечены нулём. «Плохие» кластеры помечены специальным кодом «FFF7». Максимальный размер кластера, который поддерживается в FAT, составляет 32 Кб. Зная, что максимальное количество кластеров, которое можно проадресовать шестнадцатиразрядным указателем равно 65536, можно вычислить какой величины раздел можно отформатировать, применяя тот или иной размер кластера. Если взять размер кластера равным размеру физического кластера(сектора), то получим: 65536*512=32 Мб. Если взять кластер в 2 раза больше, то можно отформатировать раздел уже до 64 Мб. Ввиду того, что разрядность ФС величина постоянная, для форматирования дисков различных размеров будут применяться разные размеры кластеров. Например, чтобы отформатировать диск более 1 Гб, нужно применять кластер 32 Кб. Поскольку такой размер кластера является максимально допустимым в этой ФС, то можно определить, что максимальный размер раздела, форматируемый под FAT, равен 2 Гб. Существует три версии FAT — FAT12, FAT16 и FAT32. Они отличаются количеством бит, отведённых для хранения номера кластера. 10.Модель файловой системы EXT2 в файле Программа может иметь как консольный, так и Windows интерфейс. Файловая система должна моделироваться в рамках файла, то есть диск – это файл, который создается во время запуска программы. В программе необходимо реализовать следующие операции: Форматирование ФС Создание папки Создание файла. Необходимо предусмотреть возможность: когда добавляется текстовый файл, чтобы можно было ввести строку текста и сохранить в этом файле, для другого типа файла (отличного от текстового) указать размер. Просмотреть информацию об объеме свободного и занятого места в памяти. Просмотр и редактирование содержимого для текстового файла. Переименование папки и файла. Копирование одного файла, папки (со всем ее содержимым), группы файлов. Перемещение одного файла, папки (со всем ее содержимым), группы файлов. Удаление файла, папки (со всем ее содержимым), группы файлов. Просмотр содержимого папки. ------------------------------------------------------------ext2 расширенная файловая система — файловая система для ядра Linux. Логическая организация файловой системы ext2 Сетевая иерархия каталогов файловой системы ext2 Граф, описывающий иерархию каталогов, файловой системы ext2 представляет собой сеть, это достигается тем, что один файл может входить сразу в несколько каталогов. Все типы файлов имеют символьные имена. В иерархически организованных файловых системах обычно используются три типа имен — файлов: простые, составные и относительные. Не является исключением и «вторая расширенная файловая система». Ограничения на простое имя состоят в том что, его длина не должна превышать 255 символов, а также в имени не должны присутствовать символ NUL и ‘/’. Ограничения на символ NUL связаны с представлением строк на языке Си, а на символ ‘/’ с тем, что он используются как разделительный символ между каталогами. Полное имя представляет собой цепочку простых символьных имен всех каталогов, через которые проходит путь от корня до данного файла. В файловой системе ext2 файл может входить в несколько каталогов, а значит, иметь несколько полных имен; здесь справедливо соответствие «один файл — много полных имен». В любом случае полное имя однозначно определяет файл. Физическая организация файловой системы ext2 Структура дискового раздела Как и в любой файловой системе UNIX, в составе ext2 можно выделить следующие составляющие: блоки и группы блоков; индексный дескриптор; суперблок; Всё пространство раздела диска разбивается на блоки фиксированного размера, кратные размеру сектора — 1024, 2048 и 4096 байт. Размер блока указывается при создании файловой системы на разделе диска. Меньший размер блока позволяет экономить место на жёстком диске, но также ограничивает максимальный размер файловой системы. Все блоки имеют порядковые номера. С целью уменьшения фрагментации и количества перемещений головок жёсткого диска при чтении больших массивов данных блоки объединяются в группы блоков. Базовым понятием файловой системы является индексный дескриптор (информационный узел), information node, или inode. Это специальная структура, которая содержит информацию об атрибутах и физическом расположении файла. Обобщенная структурная схема ФС ext2 Каждая группа блоков имеет одинаковое строение. Суперблок — основной элемент файловой системы ext2. Он содержит общую информацию о файловой системе: общее число блоков и индексных дескрипторов в файловой системе; число свободных блоков и индексных дескрипторов в файловой системе; размер блока файловой системы; количество блоков и индексных дескрипторов в группе; размер индексного дескриптора; идентификатор файловой системы. От целостности суперблока напрямую зависит работоспособность файловой системы. Операционная система создаёт несколько резервных копий суперблока для возможности его восстановления в случае повреждения. Описание группы блоков, представляет собой массив, содержащий общую информацию обо всех блоках раздела. Битовая карта блоков — это структура, каждый бит которой показывает, отведён ли соответствующий ему блок какому-либо файлу. Если бит равен 1, то блок занят. Аналогичную функцию выполняет битовая карта индексных дескрипторов, показывая какие именно индексные дескрипторы заняты, а какие нет. Все оставшееся место, обозначенное в таблице, как данные, отводится для хранения файлов. Система адресации данных Система адресации данных — это одна из самых существенных составных частей файловой системы. Именно система адресации позволяет находить нужный файл среди множества как пустых, так и занятых блоков на диске. Файловая система ext2 использует следующую схему адресации блоков файла. Для хранения адреса файла выделено 15 полей, каждое из которых состоит из 4 байт. Если размер файла меньше или равен 12 блоков, то номера этих кластеров непосредственно перечисляются в первых двенадцати полях адреса. Если размер файла превышает 12 блоков, то следующее 13-е поле содержит адрес кластера, в котором могут быть расположены номера следующих блоков файла. Таким образом, 13-й элемент адреса используется для косвенной адресации. При максимальном размере блока равном 4096 байт, 13-й элемент, может содержать до 1024 номеров следующих кластеров данных файла. Если размер файла превышает 12+1024 блоков, то используется 14-е поле, в котором находится номер блока, содержащего 1024 номеров блоков, каждый из которых хранят 1024 номеров блоков данных файла. Здесь применяется уже двойная косвенная адресация. И наконец, если файл включает более 12+1024+1048576 = 1049612 блоков, то используется последнее 15-е поле для тройной косвенной адресации. Таким образом, описанная выше система адресации, позволяет при максимальном размере блока 4 Кб иметь файлы размера до 2 терабайт. 11.Cетевой чат на основе именованных каналов с выделенным сервером --------------------------------------------------------------------------------------Для работы с именованным каналом используется функция CreateNamePipe Именованные каналы. Каналы – способ локального и сетевого взаимодействия. 5) функции сервера 6) функции клиента Каналы должны быть с одним именем. 5. СЕРВЕР Создать канал: HANDLE CreateNamePipe( LPCTSRT pipename, DWORD openmode, // режим открытия DWORD pipemode, DWORD maxinstance, DWORD outbufsize, DWORD inbufsize, LPSECURITY ATTRIBUTES ProcAttr,//атрибуты безопасности ) Имя канала: \\.\pipe\<имя > - до 256 символов FILE_FLAG_FIRST_PIPE_INSTANCE – может присутствовать во втором параметре: PIPE_ACCESS_DUPLEX, PIPE_ACCESS_INBOUND, PIPE_ACCESS_OUTBOUND FILE_FLAG_WRITE_THROUGH – если процессы находятся на разных машинах в сети FILE_FLAG_OVERLAPPED – асинхронный режим (для канала) PIPE_TYPE_BYTE и PIPE_TYPE_MESSAGE – каждая запись в канал – пакет PIPE_READMODE_BYTE, PIPE_READMODE_MESSAGE MAXINSTANCES – max допустимое число каналов с таким именем PIPE_UNLIMITED_INSTANCES DEFOULTTimeout – время ожидания Серверная сторона CREATE_NAMED_PIPE BOOL ConnectNamePipe(HANDLE h, LPOVERLAPPED Ov) BOOL DisconnectNamedPipe(HANDLE h) 6. КЛИЕНТ BOOL WiatNamedPipe(LPCTSTR Name, DWORD TimeOut) Подключиться к каналу: CreateFile В виде имени – имя канала \\<pc>\piep\<имя> BOOL CallNamedPipe( LPCTSTR NamePipe, //имя канала LPVOID InBuf, // входные параметры DWORD InSize, // сколько будет отправлено байт LPVOID OutBuf, // выходной результат DWORD OutSize, // полный размер буфера LPDWORD BytesRead, // сколько реально прочитано DWORD TimeOut)