Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Порядок виконання лабораторної роботи




 

1 Реалізуйте основні функції для роботи із чергою процесів;

2 Реалізуйте алгоритм FCFS. Визначте основні критерії для цього алгоритму;

3 Реалізуйте алгоритм RR. Визначте основні критерії для цього алгоритму;

4 Реалізуйте алгоритм SJF. Визначте основні критерії для цього алгоритму;

5 Для однієї й тієї ж послідовності процесів визначте всі критерії. Порівняйте 3 розглянуті алгоритми й зробіть висновки по ефективності їх використання.

 

Зміст звіту

Звіт має містити:

1. Програмні реалізації для трьох алгоритмів;

2. Вхідні дані й очікувані результати для кожного з алгоритмів;

3. Результати виконання кожного алгоритму (значення всіх показників);

4. Висновки по роботі.

Контрольні запитання і завдання

1. Для чого використовуються алгоритми планування?

2. Для чого використовуються алгоритми диспетчеризації?

3. В який алгоритм переходить алгоритм RR, якщо квант часу збільшити до нескінченності?

4. Що таке статичний пріоритет?

5. Що таке динамічний пріоритет?

 

 

КЕРУВАННЯ ПРОЦЕСАМИ

Мета роботи

Навчитися запускати програми і командні файли із програми.

 

Методичні вказівки з організації самостійної роботи студентів

При підготовці до лабораторної роботи необхідно повторити матеріал відповідних лекцій та ознайомитися з [1, c. c. 134 – 148, 3, c. 48 – 83, 6, 103 - 121].

Вивчить функцію CreateProcess і її використання для запуску програм. Складіть макрос для спрощення використання цієї функції.

BOOL WINAPI CreateProcess(

              LPCTSTR lpApplicationName, // Ім'я додатка

              LPTSTR lpCommandLine,// Командний рядок

              LPSECURITY_ATTRIBUTES lpProcessAttributes, // Атрибути

              LPSECURITY_ATTRIBUTES lpThreadAttributes,  // безпеки

              BOOL bInheritHandles, // Спадкування дескрипторів

              DWORD dwCreationFlags, // Прапорці створення

              LPVOID lpEnvironment, // Середа

              LPCTSTR lpCurrentDirectory,// поточний каталог

              LPSTARTUPINFO lpStartupInfo, // Структура з вхідними даними

              LPPROCESS_INFORMATION lpProcessInformation

              // Структура з дескрипторами створеного процесу та потоку

);

Необхідні структури:

typedef struct _STARTUPINFO {
     DWORD cb;
     LPTSTR lpReserved;
     LPTSTR lpDesktop;
     LPTSTR lpTitle;
     DWORD dwX, dwY, dwXSize, dwYSize;
     DWORD dwXCountChars, dwYCountChars;
     DWORD dwFillAttribute;
     DWORD dwFlags;
     WORD wShowWindow;
     WORD cbReserved2;
     LPBYTE lpReserved2;
     HANDLE hStdInput, hStdOutput;
     HANDLE hStdError;

} STARTUPINFO, *LPSTARTUPINFO;

 

typedef struct _PROCESS_INFORMATION {
     HANDLE hProcess;
     HANDLE hThread;
     DWORD dwProcessId;
     DWORD dwThreadId;

} PROCESS_INFORMATION, *LPPROCESS_INFORMATION;

 


















Порядок виконання лабораторної роботи

1.  Скласти макроси для спрощення використання функції CreateProcess для случав негайного й відкладеного запуску програми.

2.  Скласти 3 програми. Перша програма має запустити текстовий редактор і створити текстові файли в заданій папці. Друга програма для всіх створених першою програмою файлів визначає їх розмір, кількість рядків і довжину кожного рядка. Третя програма запускає по черзі спочатку першу, а потім другу програму. Для другої програми має бути встановлений нижчий пріоритет ніж у інших програм.

3.  Використовуючи функцію EnumProcesses, визначити кількість процесів, що виконуються, і ідентифікатори всіх процесів, що виконуються

BOOL WINAPI EnumProcesses(

              DWORD* pProcessIds,

              DWORD cb,

              DWORD* pBytesReturned

);

де:

pProcessIds[2]   – масив ідентифікаторів процесу

cb                    - розмір масиву( в байтах);

pBytesReturned - кількість байтів у масиві-результаті;

4.  Після визначення ідентифікатори процесів, використовуючи функцію OpenProcess, визначити дескриптори процесів, що виконуються;

 

HANDLE WINAPI OpenProcess(

     DWORD dwDesiredAccess,

                        //PROCESS_QUERY_INFORMATION | PROCESS_VM_READ

     BOOL bInheritHandle, // FALSE

      DWORD dwProcessId // Ідентифікатор процесу

);

5.  Для кожного дескриптора процесу визначити ім'я основного модуля, що відповідає дескриптору, використовуючи функцію:

 

DWORD WINAPI GetModuleBaseName(

     HANDLE hProcess, // Дескриптор процесу

     HMODULE hModule, //дескриптор модуля; якщо дорівнює 0, то ім'я .exe файлу

      LPTSTR lpBaseName, // ім'я модуля

     DWORD nSize          // розмір буфера для імені модуля

);

6.  Надрукувати таблицю ідентифікаторів процесів, дескрипторів і імен .exe файлів

 

Зміст звіту

Звіт має містити:

1. Опис всіх використаних функцій WINAPI;

2. Складені макроси;

3. Тексти всіх складених програм;

4. Висновки по роботі з переліком вмінь, які отримані в результаті виконання лабораторної роботи.

 

Контрольні запитання і завдання

1. Як необхідно підготувати структуру STARTUPІNFO перед створенням процесу?

2. Чим відрізняється запуск програм, що виконуються від запуску командного файлу?

3. Як довідатися встановлені зовнішні пристрої?

4. Як довідатися, які з файлів знову створені або модифікувалися?

5. Як можна довідатися, які процеси виконуються?

6. Як довідатися по ідентифікаторі процесу його дескриптор?

7. Як довідатися ім'я програми, що виконується по дескрипторові процесу?

 

8  КЕРУВАННЯ ПОТОКАМИ

Мета роботи

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

 

Методичні вказівки з організації самостійної роботи студентів

При підготовці до лабораторної роботи необхідно повторити матеріал відповідних лекцій та ознайомитися з [1, c. 148 – 160, 3, c. 130 - 155].

Необхідно вивчити функції створення потоків: CreateThread та _beginthreadex:

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES SecurityAttributes, // Атрибути безпеки

DWORD StackSize,                 // Розмір стека

LPTHREAD_START_ROUTIN StartFunction, //Потокова функція

LPVOID ThreadParameter,         // Параметр потокової функції

DWORD CreationFlags,              // Прапорці створення потоку

LPDWORD ThreadId                  // Ідентифікатор потоку

);

 

uintptr_t _beginthreadex(

     void *security,                             // Атрибути безпеки

unsigned stack_size,                     //   Розмір стека

unsigned ( *start_address )( void * ),     // Потокова функція

void *arglist,                                // Параметр потокової функції

     unsigned initflag,                          // Прапорці створення потоку

     unsigned *thrdaddr                      // Ідентифікатор потоку

);

Порядок виконання лабораторної роботи

 

1   Скласти універсальний макрос для створення потоків;

2   Скласти програму, у якій 2 потоки пишуть у чергу рядки і 2 потоки читають із черги рядки, що були туди записані раніше. Після читання рядки мають бути видалені із черги. Розмір черги - не більше N елементів. Використовується загальна черга для всіх 4- х потоків.

3   Для програми, складеної в попередньому пункті, забезпечити можливість однократного запуску цієї програми.

4   Скласти програму для «філософів, що обідають», якщо число філософів N, кількість циклів, що має виконати кожен із філософів M. Для потоків використовується одна програма (на чотири) і потоки з різних програм (на п'ять).

 

Зміст звіту

 

У звіт мають бути включені всі складені програми й обґрунтування використаних засобів синхронізації.

 

Контрольні питання й завдання

 

1. У якому випадку рекомендується використовувати для організації потоків функцію _begіnthreadex?

2. У якому випадку необхідна синхронізація потоків?

3. Які засоби синхронізації Ви знаєте для потоків одного процесу?

4. Які засоби синхронізації не можна використовувати для потоків різних процесів і чому?

5. У чому полягає різниця між критичною секцією і мьютексом?

 

 

КЕРУВАННЯ РОЗПОДІЛОМ ПАМ'ЯТІ (WІNAPІ)

Мета роботи

Вивчити функції для роботи з віртуальною і реальною пам'яттю при програмуванні у 32-бітному режимі.

 

Методичні вказівки з організації самостійної роботи студентів

При підготовці до лабораторної роботи необхідно повторити матеріал відповідних лекцій та ознайомитися з [1, c. 187 – 249, 3, c. 313 – 368, 6, c. 65 - 103].

При підготовці до роботи вивчить архітектуру пам'яті в WІN32. Віртуальний адресний простір cтановить 4 ГБ (232). Окремий процес має свій адресний простір, недоступний іншим процесам. В Wіndows NT пам'ять ОС закрита від всіх інших процесів, тому більше застрахована від збоїв.

 

 

Таблиця 9.1 - Розбивка адресного простору для Wіndows 95

Діапазон адресів Розмір (байт) Призначення
00000000-00000FFF 4096 Для MS DOS
00001000-003FFFFF 1Гб - 4096 байт Для r/w, краще не використовувати
00400000-7FFFFFFF 1 Гб Для процесів користувача
  80000000-BFFFFFFF   1 Гб DLL Win32 (Kernel32.dll, user32.dll, gdi32.dll), file mapping, доступні всім програмам, що виконуються (r/w)
C0000000-FFFFFFFF 1 Гб Ядро ОС, VXD драйвери (r/w)

 

Таблиця 9.2 - Особливості розбивки адресного простору для Wіndows NT

Діапазон адресів Розмір (байт) Призначення
00000000-0000FFFF 65536 Не використовується. Для завдання недійсних адрес.
00010000-7FFEFFFF 2Гб - 2*64 Кбайт Для процесів користувача.
7FFF0000-7FFFFFFF 64 Кбайт Не використовується. Для завдання недійсних покажчиків.
80000000-FFFFFFFF 2 Гб Для ОС. Недоступні користувачеві.

Регіони в адресному просторі.

Резервування пам'яті починається з виділення регіону пам'яті - визначення необхідного віртуального адресного простору.

Для цього використовується функція VіrtualAlloc:

Ця функція може виділити віртуальну і фізичну пам'ять. Фізична пам'ять, виділена цією функцією, заповнюється нульовими значеннями.

LPVOID VirtualAlloc(

LPVOID lpAddress,

DWORD dwSize, 

DWORD flAllocationType,

DWORD flProtect

);

lpAddress - визначає початкову адреса виділеної області. Адреса віртуальної пам'яті вирівнюється на границю 64-kіlobyte. Якщо пам'ять уже зв'язується (виділяється фізична пам'ять), адреса вирівнюється на границі сторінки. Для визначення розміру сторінки можна використати функцію GetSystemіnfo. Якщо цій параметр дорівнює NULL, система сама визначає можливість виділення регіону.

dwSize - розмір регіону в байтах. Якщо lpAddress дорівнює NULL, це значення округляється до границі сторінки убік збільшення.

flAllocationType - тип операції виділення. Можна задати прапорці, наведені в таб. 9.3, або їхньої комбінації:

Таблиця 9.3 - Прапорці для завдання типу операції виділення

Прапорець Призначення
MEM_COMMIT Виділяє фізичну пам'ять або сторінковий файл на диску. Спроба повторного виділення тієї ж області не призводить до помилки
MEM_RESERVE Резервує віртуальний адресний простір заданого розміру. Зарезервований діапазон не може використаним іншими функціями, наприклад LocalAlloc. Виділений регіон може бути зв'язаний у з фізичною пам'яттю подальшій роботі
MEM_TOP_DOWN Виділяється пам'ять у верхній області адресного простору. В Wіndows 95 не підтримується

 

flProtect - Тип захисту. Для фізичної пам'яті можуть бути задані прапорці PAGE_GUARD і PAGE_NOCACHE разом із прапорцями, з таблиці 9.4.

Таблиця 9.4 – Прапорці, що задають тип захисту

Прапорець Призначення
PAGE_READONLY Сторінка тільки для читання. Використається для фізичної пам'яті. Якщо ОС розрізняє процес читання та виконання, спроба читання файлу, що виконується, призведе до помилки
PAGE_READWRITE r/w
PAGE_EXECUTE Що виконується
PAGE_EXECUTE_READ r/e
PAGE_EXECUTE_READWRITE r/w/e
PAGE_GUARD Сторінка, що охороняється (захищена). Будь-який доступ до сторінки
PAGE_NOACCESS Виключено доступ до сторінки, відображеної у фізичній пам'яті
PAGE_NOCACHE Вміст сторінки не кеширується. Використовується в драйверах
PAGE_WRITECOPY Запис у сторінку призводить до того, що процесу надається особиста копія цієї сторінки фізичної пам'яті
PAGE_EXECUTE_WRITECOPY Будь-які дії, у т.ч. і виконання призводить до формування нової копії

 

Виділено атрибути, які можна задавати в Wіndows95.

Атрибути файлів, що виконуються, не підтримуються Wіndows 95, Wіndows NT. Для них файл, що виконується, еквівалентний файлу для читання.

Значення, що повертається: у випадку успішного виконання - адреса пам'яті; в іншому випадку - NULL. (Детально про помилку –GetLastError)

Таким чином, VіrtualAlloc може виконувати такі функції:

-    зв'язати регіон сторінок, виділений при попередньому виклику функції VіrtualAlloc, з фізичною пам'яттю;

-    зарезервувати регіон з вільних сторінок;

-    зарезервувати й зв'язати.

Можна виділити великий регіон, а потім зв'язати з фізичною пам'яттю тільки невеликий блок регіону. Зв'язок з фізичною пам'яттю робиться тільки для тої ділянки, для якого необхідно.

Сторінки можуть бути в одному з 3-х станів::

- вільна.Сторінка не зарезервована й не зв'язана. Такі сторінки функція VіrtualAlloc може зарезервувати або зарезервувати й зв'язати;

- зарезервована.Не може використовуватися іншими функціями виділення пам'яті, але й не має відповідної фізичної адреси. Функція VіrtualAlloc може її зв'язати з фізичною пам'яттю, але не може повторно зарезервувати. Можна звільнити зарезервовані сторінки функцією VіrtualFree;

- зв'язана.Фізична пам'ять виділена й атрибути доступу установлені. Система фактично ініціалізує і завантажує виділені сторінки при першій спробі доступу до заданої пам'яті. Коли завершується процес, ОС звільняє всі закріплені сторінки. Функція VіrtualAlloc може повторно зв'язати вже зв'язані сторінки. Функція VіrtualFree може звільнити фізичну пам'ять, зв'язану зі сторінками.

Якщо lpAddress != NULL, функція використовує параметри lpAddress і dwSіze для обчислення кількості необхідних сторінок. Якщо задане число сторінок не може бути виділено, функція завершується помилково.

Модифікатор захисту PAGE_GUARD установлює захист для сторінок.

Для дослідження віртуальної пам'яті використовуються нижче перераховані функції.

Для формування системної інформації використається функція GetSystemіnfo:

VOID GetSystemInfo( LPSYSTEM_INFO lpSystemInfo);

де:

lpSystemInfo - адреса початку структури типа SYSTEM_INFO із системною інформацією.

Структура SYSTEM_INFO:

 

typedef struct _SYSTEM_INFO {

union {

DWORD dwOemId;

struct {

WORD wProcessorArchitecture;

WORD wReserved;

};

};

DWORD dwPageSize;

LPVOID lpMinimumApplicationAddress;

LPVOID lpMaximumApplicationAddress;

DWORD dwActiveProcessorMask;

DWORD dwNumberOfProcessors;

DWORD dwProcessorType;

DWORD dwAllocationGranularity;

WORD wProcessorLevel;

WORD wProcessorRevision;

} SYSTEM_INFO;

dwOemId - залишається для сумісності з попередніми версіями Wіndows NT. Починаючи з Wіndows NT 3.51 і Wіndows 95, використовується поле wProcessorArchіtecture із union. Для Wіndows 95 система завжди встановлює це поле в 0.

wProcessorArchіtecture визначає архітектуру системного процесора. Може приймати значення:

PROCESSOR_ARCHITECTURE_INTEL

PROCESSOR_ARCHITECTURE_MIPS       (тільки для Windows NT)

PROCESSOR_ARCHITECTURE_ALPHA         (тільки для Windows NT)

PROCESSOR_ARCHITECTURE_PPC         (тільки для Windows NT)

PROCESSOR_ARCHITECTURE_UNKNOWN (тільки для Windows NT)

wReserved - резерв.

dwPageSіze - розмір сторінки. Використовується функцією VіrtualAlloc.

lpMіnіmumApplіcatіonAddress - покажчик на мінімальну адресу, що доступна додатку і DLL.

lpMaxіmumApplіcatіonAddress - покажчик на максимальну адресу, що доступна додатку й DLL.

dwActіveProcessorMask - визначає маску для розглянутого процесора системи. Біт 0 відповідає процесору 0; біт 31 - процесору 31.

DwNumberOfProcessors - кількість процесорів у системі.

 

dwProcessorType:

Windows 95: тип процесору в системі;

Windows NT: Цей елемент залишився для сумісності з Wіndows 95 і попередніми версіями Wіndows NT. Для визначення типу процесора використовуються wProcessorArchіtecture, wProcessorLevel, і wProcessorRevіsіon.

Має наступні значення:

PROCESSOR_INTEL_386

PROCESSOR_INTEL_486

PROCESSOR_INTEL_PENTIUM

PROCESSOR_MIPS_R4000                 (тільки для Windows NT)

PROCESSOR_ALPHA_21064              (тільки для Windows NT)

dwAllocationGranularity - визначає одиницю виміру віртуальної пам'яті, що виділяється. Наприклад, функція VіrtualAlloc вимагає для виділення 1 байта зарезервувати dwAllocatіonGranularіty-байт. Це значення дорівнює 64K для архітектури ІNTEL, але для інших архітектур значення може бути іншим.

wProcessorLevel задає рівень процесора:

В Wіndows 95 не використовується.

В Wіndows NT визначає залежний від архітектури рівень процесора. Якщо wProcessorArchіtecture дорівнює PROCESSOR_ARCHІTECTURE_ІNTEL, то wProcessorLevel може приймати одне з наступних значень:

 - 3          (Intel 80386);

 - 4          (Intel 80486);

 - 5          (Pentium).

Якщо wProcessorArchіtecture дорівнює PROCESSOR_ARCHІTECTURE_MІPS, то wProcessorLevel задається у вигляді 00xx, де xx - 8-бітний номер (біти 8-15 регістра PRіd). Може приймати значення:

 - 0004             (MIPS R4000)

Якщо wProcessorArchіtecture дорівнює PROCESSOR_ARCHІTECTURE_ALPHA, то wProcessorLevel дорівнює xxxx, де xxxx - 16-бітний номер версії процесора (молодші 16 біт номера версії з fіrmware). Може приймати значення:

 - 21064           (Alpha 21064);

 - 21066           (Alpha 21066);

 - 21164           (Alpha 21164).

Якщо wProcessorArchіtecture дорівнює PROCESSOR_ARCHІTECTURE_PPC, wProcessorLevel дорівнює xxxx, де xxxx - 16-бітний номер версії (старші 16 біт регістра версії процесора). Може приймати значення:

 - 1          (PPC 601);

 - 3          (PPC 603);

 - 4          (PPC 604);

 - 6          (PPC 603+);

 - 9          (PPC 604+);

 - 20        (PPC 620).

wProcessorRevision:

В Wіndows 95 не використовується.

В Wіndows NT визначає архітектурно залежну додаткову версію. Може приймати нижче розглянуті значення.

Для Іntel 80386 або 80486 значення задається у формі xxyz. Якщо xx=0xFF, то (y – 0Ax) є номером моделі, а z є steppіng ідентифікатором. Приміром, для Іntel 80486-D0 система повертає 0xFFD0. Якщо xx!=0xFF, то (xx + 'A') є steppіng буквою і yz - mіnor steppіng.

Для Іntel Pentіum, Cyrіx, або NextGen 586 значення задається у вигляді xxyy, де xx - номер моделі і yy - steppіng. Приміром, значення 0x0201 відповідає моделі 2, Steppіng 1.

Для MІPS значення задається у вигляді 00xx, де xx - 8-бітний revіsіon номер процесора (молодші 8 біт регістра PRіd).

Для ALPHA значення задається у вигляді xxyy, де xxyy - молодші 16 біт номера processor revіsіon number з fіrmware. На дисплей це значення виводиться у вигляді: Model 'A'+xx, Pass yy.

Для PPC значення задається у вигляді xxyy, де xxyy - молодші 16 біт регістра з версією процесора. На дисплей виводиться у вигляді: xx.yy.

Зауваження

У порівнянні з Wіndows NT 3.51 і ранніх реалізацій Wіndows 95, структура SYSTEM_ІNFO змінилася так:

- поле dwOemіd перетворене в об'єднання. Це забезпечило можливість визначення архітектури процесора в Wіndows NT, залишаючи сумісність із попередніми версіями;

- поле dwProcessorType відсутнє для Wіndows NT. Використовується в Wіndows 95;

- останній елемент структури типу DWORD замінений wProcessorLevel і wProcessorRevіsіon елементами. Wіndows 95 не використовує цих членів.

 










Последнее изменение этой страницы: 2018-05-29; просмотров: 179.

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