Взаємодія потоків у Windows XP

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
КН
Кафедра:
Інформаційні системи та мережі

Інформація про роботу

Рік:
2008
Тип роботи:
Інші
Предмет:
Системне програмування та операційні системи

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки України Національний університет «Львівська політехніка» Кафедра «Інформаційні системи та мережі» К У Р С О В А Р О Б О Т А з дисципліни «Системне програмування та операційні системи» на тему: «Взаємодія потоків у Windows XP» Львів – 2008 З А В Д А Н Н Я на курсову роботу з дисципліни «Системне програмування та операційні системи» студенту групи КН – 218 Войчишену М.М. Т е м а: «Взаємодія потоків у Windows XP» Завдання: __________________________________________________________ ЗМІСТ ЗАВДАННЯ ТА КАЛЕНДАРНИЙ ПЛАН ЙОГО ВИКОНАННЯ 1. Провести огляд літературних джерел по заданій темі для аналізу методів розв’язування задачі. 26.02  2. Розробити алгоритми розв’язування задачі 26.03  3. Виконати програмну реалізацію розроблених алгоритмів. Вимоги до програми: програма повинна бути реалізована на мовах Intel Assembler/ C/ C++/ C++Builder ; програма повинна працювати під керуванням операційної системи Windows XP; програма повинна мати інтерфейс для вибору режимів її роботи; інтерфейс може бути реалізований мовами C/C++/ C++Builder; Програма повинна демонструвати основні принципи взаємодії потоків у Windows XP на основі семафорів, м’ютексів, монітора, блокування читання-записування, синхронізації за принципом бар’єра; Реалізація курсової роботи може бути виконана вигляді навчальної системи. 30.04  4. Підготувати вхідні дані та виконати реалізацію контрольного прикладу. 14.05  5. Оформити записку до курсової роботи згідно вимог міжнародних стандартів, дотримуючись такого змісту: вступ; формулювання задачі; методи та засоби розв’язування задачі; алгоритм розв’язування задачі; опис програми; технологія програмування, виконання та відлагодження програми; інструкція користувачеві; контрольний приклад та результати роботи програми; висновки; література; додатки. 28.05  ЗАВДАННЯ ПРИЙНЯТО ДО ВИКОНАННЯ: ______________ 13.02.2008 підпис студента Керівник роботи: _________________/Кравець П.О./ Зміст Вступ 3 1. Формулювання задачі 4 2. Методи та засоби розв’язування задачі 5 3. Алгоритм розв’язування задачі 15 4. Опис програми 18 5. Технологія програмування, виконання та відлагодження програми 20 6. Інструкція користувачеві 21 7. Контрольний приклад та аналіз результатів комп’ютерної реалізації програми 23 Висновки 24 Використана література: 25 Додатки 26 Вступ Інформаційні технології, безперечно, являються одним із чинників сучасного інформаційного суспільства. Адже в даний час майже неможливо уявити наше життя без комп’ютерних технологій, не кажучи вже про необхідність його використання в різних аспектах людської діяльності. Одним з етапів розвитку інформаційних технологій був розвиток та впровадження персональних комп’ютерів, а відповідно і операційних систем персональних комп’ютерів. Спочатку ці системи були однозадачними й надавали базовий набір стандартних служб. Подальший розвиток апаратного забезпечення дав змогу використати в таких системах засоби, розроблені для більших систем, насамперед багатозадачність і, як наслідок, координацію задач. У сучасній операційній системі одночасно виконуються код ядра (що належить до його різних підсистем) і код програм користувача. При цьому відбуваються різні дії: одні програми і підсистеми виконують інструкції процесора, інші зайняті введенням-виведенням, ще деякі очікують на запити від користувача або інших застосувань. Сучасні ОС крім багатозадачності можуть підтримувати багатопотоковість, (multithreading), яка передбачає в рамках процесу наявність кількох послідовностей інструкцій (потоків, threads), які для користувача виконуються паралельно, подібно до процесів в ОС. Потоком (потік керування, нитка, thread) називають набір послідовно виконуваних команд процесора, які використовують загальний адресний простір процесу. Оскільки в системі може одночасно бути багато потоків, завданням ОС є організація перемикання процесора між ними і планування їхнього виконання. У багатопроцесорних системах код окремих потоків може виконуватися на окремих процесорах. Метою курсової роботи розробка навчальної системи яка надасть можливість вивчити та закріпити основні принципи взаємодії потоків у Windows XP на основі семафорів, м’ютексів, монітора, блокування читання-записування, синхронізації за принципом бар’єра. 1. Формулювання задачі Під час виконання курсової роботи з дисципліни «Системне програмування та операційні системи» на тему «Взаємодія потоків у Windows XP» повинно бути розроблено навчальну систему, яка б відповідала поставленим вимогам: Програма повинна бути реалізована на мові C++ Builder ; Програма повинна працювати під керуванням операційної системи Windows XP; Програма повинна мати інтерфейс для вибору режимів її роботи; інтерфейс може бути реалізований мовою C++ Builder; Програма повинна забезпечити можливість вивчення основних принципи взаємодії потоків у Windows XP на основі семафорів, м’ютексів, монітора, блокування читання-записування, синхронізації за принципом бар’єра. Програма має забезпечувати простоту в користуванні, легко розповсюджуватися, не потребувати спеціальної підтримки, а також бути надійною в користуванні. Програма реалізована за допомогою мови програмування С++ Builder. Програма повинна забезпечувати економічну ефективність в порівнянні з іншими аналогами. 2. Методи та засоби розв’язування задачі Потоком (потік керування, нитка, thread) називають набір послідовно виконуваних команд процесора, які використовують загальний адресний простір процесу. Під потоком розуміється частина виконуваного коду в Windows процесі, яка може бути регламентована визначеним чином. Витрати обчислювальних ресурсів, пов’язаних із створенням потоку, його підтримкою і управлінням, в ОС значно нижча у порівнянні з аналогічними затратами для процесів, оскільки об’єм інформації окремого потоку значно менший, ніж у процесу. Потоки, які виконуються в рамках процесу паралельно, можуть бути незалежними або взаємодіяти між собою. Потік є незалежним, якщо він не впливає на виконання інших потоків процесу, не зазнає впливу з їхнього боку, та немає з ними жодних спільних даних. Його виконання однозначно залежить від вхідних даних і називається детермінованим. Усі інші потоки є такими, що взаємодіють. Ці потоки мають дані, спільні з іншими потоками (вони перебувають в адресному просторі їхнього процесу). Їх виконання залежить не тільки від вхідних даних, але й від виконання інших потоків, тобто вони є недетермінованими. Результати виконання незалежного потоку завжди можна повторити, чого не можна сказати про потоки, що взаємодіють. Дані, які є загальними для кількох потоків, називають спільно використовуваними даними (shared data). Це - найважливіша концепція багатопотокового програмування. Усякий потік може в будь-який момент часу змінити такі дані. Механізми забезпечення коректного доступу до спільно використовуваних даних називають механізмами синхронізації потоків. Основні причини реалізації взаємодії потоків: Необхідно організовувати спільне використання інформації під час роботи з потоками. Коректна реалізація такої взаємодії та використання відповідних алгоритмів можуть значно прискорити обчислювальний процес на багатопроцесорних системах. У задачах, що вимагають паралельного виконання обчислень та операцій введення-виведення, потоки, що виконують введення-виведення, повинні мати можливість подавати сигнали іншим потокам із завершенням своїх операцій. Подібна організація дає змогу розбивати задачі на окремі виконувані модулі, оформлені як окремі потоки, при цьому вихід одного модуля може бути входом для іншого, а також підвищується гнучкість системи, оскільки окремі модулі можна міняти, не чіпаючи інших. Основні проблеми взаємодії потоків Проблема змагання Розглянемо на найпростішому прикладі, що може відбутися, коли потоки, які взаємодіють, разом використовуватимуть спільні дані без додаткових заходів із забезпечення синхронізації. Уявімо, що при банківської організації системи для обслуговування кожного користувача виділяють окремий потік (чим намагаються підвищити продуктивність системи у разі великої кількості одночасних запитів). Припустимо, що поміщення даних на вклад користувача зводиться до збільшення глобальної змінної total_amount. У цьому разі кожен потік під час зміни вкладу виконує такий най простіший оператор: total_amount = total_amount + new_amount; Виникає запитання: чи можна дати гарантію, що внаслідок роботи із вкладом потік, який відповідає кожному користувачу, буде здатний збільшити значення total_amount на потрібну величину? Насправді цей на перший погляд найпростіший оператор зводиться до послідовності таких дій: отримання поточного значення total_amount із глобальної пам'яті; збільшення його на new_amount і збереження результату в глобальній пам'яті. У всіх інших випадках потрібно забезпечувати захист змін від впливу інша потоків. Це і є основним завданням синхронізації. Поняття критичної секції Розв'язанням проблеми змагання є перетворення фрагмента коду, який спричиняє проблему, в атомарну операцію, тобто в таку, котра гарантовано виконуватиметься цілковито без втручання інших потоків. Такий фрагмент коду називають критичною секцією (critical section): // початок критичної секції total_amount = total_amount + new_amount: // кінець критичної секції Тепер, коли два потоки візьмуться виконувати код критичної секції одночасно, той з них, що почав першим, виконає весь її код цілком до того, як другий почне своє виконання (другий потік чекатиме, поки перший не закінчить виконання коду критичної секції). У результаті підсумку гарантовано матимемо в нашій програмі послідовність подій за варіантом 2, і змагання не відбудеться ніколи. Розглянемо властивості, які повинна мати критична секція. Взаємного виключення (mutual exclusion): у конкретний момент часу код критичної секції може виконувати тільки один потік. Прогресу: якщо кілька потоків одночасно запросили вхід у критичну секцію, один із них повинен обов'язково у неї ввійти (вони не можуть всі заблокувати один одного). Обмеженості очікування: процес, що намагається ввійти у критичну секцію, рано чи пізно обов'язково в неї ввійде. Найпростішим розв'язанням такої задачі було б заборонити переривання на час виконання коду критичної секції. Такий підхід, хоча й розв'язує задачу в принципі, на практиці не може бути застосовуваний, оскільки внаслідок зациклення або аварії програми у критичній секції вся система може залишитися із заблокованими перериваннями, а отже, у непрацездатному стані. Блокування Раціональнішим розв'язанням є використання блокувань (locks). Блокування - це механізм, який не дозволяє більш як одному потокові виконувати код критичної секції. Використання блокування зводиться до двох дій: запровадження (заблокування, функція acquire_lock()) і зняття блокування (розблокування, функція release_lock()). У разі заблокування перевіряють, чи не було воно вже зроблене іншим потоком, і якщо це так, цей потік переходить у стан очікування, інакше він запроваджує блокування і входить у критичну секцію. Після виходу із критичної секції потік знімає блокування. acquire_lock(lock): // критична секція release_lock(lock); Так реалізовують властивість взаємного виключення, звідси походить інша назва для блокування - м'ютекс (mutex, скорочення від mutual exclusion). Базові механізми синхронізації потоків Механізмами синхронізації є засоби операційної системи, які допомагають розв'язувати основне завдання синхронізації - забезпечувати координацію потоків, котрі працюють зі спільно використовуваними даними. Якщо такі засоби - це мінімальні блоки для побудови багатопотокових програм, їх називають синхронізаційними примітивами. Синхронізаційні механізми поділяють на такі основні категорії: універсальні, низького рівня, які можна використовувати різними способами (семафори); прості, низького рівня, кожен з яких пристосований до розв'язання тільки однієї задачі (м'ютекси та умовні змінні); універсальні високого рівня, виражені через прості; до цієї групи належить концепція монітора, яка може бути виражена через м'ютекси та умовні змінні; високого рівня, пристосовані до розв'язання конкретної синхронізаційної задачі (блокування читання-записування і бар'єри). Розглянемо різні механізми і дамо оцінку перевагам, які має кожен з них, а також можливі їхні недоліки. Семафори Семафор — це спільно використовуваний невід'ємний цілочисловий лічильник, для якого задано початкове значення і визначено такі атомарні операції. Зменшення семафора (down): якщо значення семафора більше від нуля, його зменшують на одиницю, якщо ж значення дорівнює нулю, цей потік переходить у стан очікування доти, поки воно не стане більше від нуля (кажуть, що потік «очікує на семафорі» або «заблокований на семафорі»). Цю операцію називають також очікуванням — wait. Ось її псевдокод: void down (semaphore_t sem) { if (sem > 0) sem--; else sleep(); } Збільшення семафора (up): значення семафора збільшують на одиницю; коли при цьому є потоки, які очікують на семафорі, один із них виходить із очікування і виконує свою операцію down. Якщо на семафорі очікують кілька потоків, то внаслідок виконання операції up його значення залишається нульовим, але один із потоків продовжує виконання (у більшості реалізацій вибір цього потоку буде випадковим). Цю операцію також називають сигналізацією — post. Ось її псевдокод: void up (semaphore_t sem) { sem++; if (waiting_threads()) wakeup (some_thread); } Фактично значення семафора визначає кількість потоків, що може пройти через цей семафор без блокування. Коли для семафора задане нульове початкове значення, то він блокуватиме всі потоки доти, поки якийсь потік його не «відкриє», виконавши операцію up. Операції up і down можуть бути виконані будь-якими потоками, що мають доступ до семафора. М'ютекси Поняття м'ютекса багато в чому збігається з поняттям блокування. М'ютексом називають синхронізаційний примітив, що не допускає виконання деякого фрагмента коду більш як одним потоком. Фактично м'ютекс є реалізацією блокування на рівні ОС. М'ютекс, як і випливає з його назви, реалізує взаємне виключення. Його основне завдання - блокувати всі потоки, які намагаються отримати доступ до коду, коли цей код уже виконує деякий потік. М'ютекс може перебувати у двох станах: вільному і зайнятому. Початковим станом є «вільний». Над м'ютексом можливі дві атомарні операції. Зайняти м'ютекс (mutex_lock): якщо м'ютекс був вільний, він стає зайнятим, і потік продовжує своє виконання (входячи у критичну секцію); якщо м'ютекс був зайнятий, потік переходить у стан очікування (кажуть, що потік «очікує на м'ютексі», або «заблокований на м'ютексі»), виконання продовжує інший потік. Потік, який зайняв м'ютекс, називають власником м'ютекса (mutex owner): mutex_lock (mutex_t mutex) { if (mutex.state == free) { mutex.state - locked; mutex.owner = this_thread; } else sleep(); } Звільнити м'ютекс (mutex_unlock): м'ютекс стає вільним; якщо на ньому очікують кілька потоків, з них вибирають один, він починає виконуватися, займає м'ютекс і входить у критичну секцію. У більшості реалізацій вибір потоку буде випадковим. Звільнити м'ютекс може тільки його власник. Ось псевдокод цієї операції: mutex_unlock (mutex_t mutex) { if (mutex.owner != this_thread) return error; mutex.state = free; if (waiting_threads()) wakeup (some_thread); } Основною відмінністю м'ютексів від двійкових семафорів (семафори цього виду ми використовували для блокування), є те, що звільнити м'ютекс може тільки його власник, тоді як змінити значення семафора може будь-який потік, котрий має до нього доступ. Ця відмінність досить суттєва і робить реалізацію взаємних виключень за допомогою м'ютексів простішою (з коду завжди ясно, який потік може змінити стан м'ютекса). Умовні змінні та концепція монітора Поняття умовної змінної Умовною змінною називають синхронізаційний примітив, який дає змогу організувати очікування виконання умови всередині критичної секції, заданої м'ютексом. Умовна змінна завжди пов'язана із конкретним м'ютексом і даними, захищеними цим м'ютексом. Для умовної змінної визначено такі операції. Очікування (wait). Додатковим вхідним параметром ця операція приймає м'ютекс, який повинен перебувати в закритому стані. Виклик wait відбувається в ситуації, коли не виконується деяка умова, потрібна потоку для продовження роботи. Внаслідок виконання wait потік (позначатимемо його Tw) припиняється (кажуть, що він «очікує на умовній змінній»), а м'ютекс відкривається (ці дві дії відбуваються атомарно). Так інші потоки отримують можливість увійти в критичну секцію і змінити там дані, які вона захищає, можливо, виконавши умову, потрібну потоку Тw. На цьому операція wait не завершується - її завершить інший потік, викликавши операцію signal після того, як умову буде виконано. Сигналізація (signal). Цю операцію потік (назвемо його ТS) має виконати після того, як увійде у критичну секцію і завершить роботу з даними (виконавши умову, яку очікував потік, що викликав операцію wait). Ця операція перевіряє, чи немає потоків, які очікують на умовній змінній, і якщо такі потоки є, переводить один із них (Tw) у стан готовності (цей потік буде поновлено, коли відповідний потік TS вийде із критичної секції). Внаслідок поновлення потік Tw завершує виконання операції wait — блокує м'ютекс знову (поновлення і блокування теж відбуваються атомарно). Якщо немає жодного потоку, який очікує на умовній змінній, операція signal не робить нічого, і інформацію про її виконання в системі не зберігають. Широкомовна сигналізація (broadcast) відрізняється від звичайної тим, що переведення у стан готовності і, зрештою, поновлення виконують для всіх потоків, які очікують на цій умовній змінній, а не тільки для одного з них. Отже, виконання операції wait складається з таких етапів: відкриття м'ютекса, очікування (поки інший потік не виконає операцію signal або broadcast), закриття м'ютекса. По суті, це перша неатомарна операція, визначена для синхронізаційного примітива, але така відсутність атомарності цілком контрольована (завжди відомо, де потік Tw перейшов у стан очікування і що його з цього стану виведе). Поняття монітора Монітором називають набір функцій, які використовують один загальний м'ютекс і нуль або більше умовних змінних для керування паралельним доступом до спільно використовуваних даних відповідно до певних правил. Функції цього набору називають функціями монітора. Ось правила, яких слід дотримуватися у разі реалізації монітора. Під час входу в кожну функцію монітора потрібно займати м'ютекс, під час виходу - звільняти. Отже, у кожний момент часу тільки один потік може перебувати всередині монітора (під яким розуміють сукупність усіх його функцій). Під час роботи з умовною змінною (і під час очікування, і під час сигналізації) необхідно завжди вказувати відповідний м'ютекс. Не можна працювати з умов ними змінними, якщо м'ютекс незайнятий. Під час перевірки на виконання умови очікування потрібно використати цикл, а не умовний оператор. Ідея монітора була вперше запропонована в 1974 році відомим ученим у галузі комп'ютерних наук Ч. А. Хоаром. Монітор часто розуміють як високорівневу конструкцію мови програмування (як приклад такої мови звичайно наводять Java), а саме як набір функцій або методів класу, всередині яких автоматично зберігається неявний загальний м'ютекс разом із операціями очікування і сигналізації. Насправді, як ми бачимо, концепція монітора може ґрунтуватися на базових примітивах — м'ютексах і умовних змінних — і не повинна бути обмежена якоюсь однією мовою. Блокування читання-записування М'ютекси є засобом, який захищає спільно використовувані дані від будь-якого одночасного доступу з боку кількох потоків — будь то читання чи зміна. Насправді нам не завжди потрібен такий однозначний захист, наприклад, для певного типу задач хотілося б розрізняти читання спільно використовуваних даних та їхню модифікацію (для того, щоб, скажімо, дозволяти читання кільком потокам одночасно, а модифікацію - тільки одному). Для розв'язання такої задачі використовують блокування читання-записування (read-write locks). Блокування читання-записування — це синхронізаційний примітив, для якого визначені два режими використання: відкриття для читання і відкриття для записування. При цьому повинні виконуватися такі умови: будь-яка кількість потоків може відкривати таке блокування для читання, коли немає жодного потоку, що відкрив його для записування; блокування може відкриватися для записування тільки за відсутності потоку, що відкрив його для читання або для записування. Простіше кажучи, читати дані може будь-яка кількість потоків одночасно за умови, що ніхто ці дані не змінює; змінювати дані можна тільки тоді, коли їх ніхто не читає і не змінює. Такі блокування корисні для даних, які зчитуються частіше, ніж модифікуються (наприклад, більшість СУБД реалізує блокування такого роду для забезпечення доступу до бази даних). Синхронізація за принципом бар'єра Іноді буває зручно розбити задачу (наприклад, складний розрахунок) на кілька послідовних етапів, при цьому виконання наступного етапу не може розпочатися без цілковитого завершення попереднього. Якщо на кожному етапі роботу розподілити по окремих потоках, які паралельно виконуватимуть кожен свою частину, виникає запитання: яким чином дочекатися завершення всіх потоків попереднього етапу до початку наступного? Звичайне використання thread_join() тут не підходить, тому що приєднати можна якийсь конкретний потік, а не цілий набір потоків. Для розв'язання цього завдання запропоновано концепцію спеціального синхронізаційного об'єкта бар'єра. Бар'єр - це блокування, яке зберігають доти, поки кількість потоків, що очікують, не досягне деякого наперед заданого числа, після чого всі ці потоки продовжують своє виконання. Так, якщо наприкінці етапу задачі поставити бар'єр, він буде утримувати потоки від продовження, поки вони всі не завершать роботу цього етапу. Ось псевдокод прикладу використання бар'єра: barrier_t barrier_step: // бар'єр етапу void thread_fun() { // функція потоку, розбита на етапи int res: stepl(); // виконання дій етапу 1 res = barrier_wait(barrier_step): // очікування завершення етапу 1 if (res == -1) stepl_done(); step2(); // виконання дій етапу 2 res - barrier_wait(barrier_step): // очікування завершення етапу 2 1f (res == -1) step2_done(); // тощо } // n - кількість потоків для виконання поетапної задачі void run () { thread_t threads[n]; barrier_init(barrier_step, n); II бар'єр для n потоків for (i=0; і<n; і++) threads[i] = thread_create(thread_fun); // створюємо n потсоків for (i=0; i<n; i++) thread_join(threads[i]); // очікуємо завершення n потоків } 3. Алгоритм розв’язування задачі Алгоритм – послідовність дій, які необхідно виконати для оброблення сукупності початкових даних і здобуття відповідних результатів. Алгоритм повинен мати такі властивості: Скінченність ( кожен алгоритм має бути скінченим ): Результативність (обов’язкове здобуття результату після реалізації алгоритму); Формальність (отримання результатів не вникаючи в суть); Визначеність (кожна команда алгоритму має бути чіткою та зрозумілою); Масовість (можливість застосування певного алгоритму до цілого класу однотипних задач); Зрозумілість. Програма – реалізований певною мовою програмування алгоритм, призначений для його автоматичного виконання. Алгоритм даної програми буде мати наступний вигляд: Програма побудована таким чином, що доступ до всіх складових забезпечується на головній формі. Я видно з рисунку 1 з головного вікна можна перейти на теоретичну частину або на тестування. Теоретична частина являє собою теоретичні відомості по темі „Взаємодія потоків у Windows XP”, а тестування дає можливість перевірити вивчений матеріал. На рисунку 2 показано алгоритму роботи тестування, спочатку відбувається введення та реєстрація користувача, якщо такі дії виконанні розпочинається тест і генерується перше питання, ознайомившись з питанням користувач відзначає вірну відповідь і підтверджує її. Далі відбувається генерація наступного питання, при якій здійснюється перевірка на, чи не повторюється питання, а також перевірка часу і чи тест, ще не закінчився, якщо ні то відбувається генерація питання, якщо так то підрахунок оцінки і запис результатів в файл і закінчення тестування. На рисунку 3 приведено алгоритм роботи редактора тестів. Спочатку відбувається зчитування питань з файлу, їх редагування, а потім збереження їх в файл. 4. Опис програми Назва проекту Book. Програма запускається за допомогою exe файлу. Програма виконана у вигляді навчальної системи і призначена для викладу повної інформації по темі „Взаємодія потоків у Windows XP”. Програма описує основні принципи взаємодії потоків у Windows XP на основі семафорів, м’ютексів, монітора, блокування читання-записування, синхронізації за принципом бар’єра. Програма реалізована з використанням середовища візуального програмування C++ Builder – це графічна автоматизована оболонка над об’єктно-орієнтованою мовою програмування С++. Інтегроване середовище C++ Builder забезпечує швидкість візуальної розробки, продуктивність повторно використовуваних компонент в поєднанні з потужністю мовних засобів C++, вдосконаленими інструментами і різномасштабними засобами доступу до баз даних. Логічна структура програми. Програма здійснює зв’язок з фалами в яких збережені теоретичні відомості. Відповідно, під час виконання програма здійснює звертання до цих файлів і відображає їх зміст. Також при використанні тестування відбувається виклик програми Test, з допомогою якої можлива перевірка знань. Також відбувається збереження результатів. При виклику програми тестування відбувається завантаження питань та варіантів відповідей, з файлу, який попередньо був створений з використанням редактора тестів. При роботі з редактором тестів відбувається введення питань та відповідей. Для цього використовується структура даних zapus, яка має такий вигляд: struct zapus { String put,var1,var2,var3,var4,var5; bool vid1,vid2,vid3,vid4,vid5; byte nomer; }; Вхідними даними при використані програми є відомості про користувача, який проходить тестування, адже він вводить відомості про себе. Вихідними даними є результати тестування. Програмні засоби – Microsoft Windows XP SP2-SP3, Borland C++ Builder 6. Для стабільної роботи програми комп’ютер повинен відповідати таким мінімальним характеристикам: процесор з тактовою частотою 1000МГц, 128 Мбайт оперативної пам’яті, Windows XP, маніпулятор „миша”. 5. Технологія програмування, виконання та відлагодження програми Вибраною технологією програмування є середовища візуального програмування C++ Builder , що є графічною автоматизованою оболонкою над об’єктно-орієнтованою мовою програмування С++. Технологія роботи у середовищі C++ Builder базується на ідеях об’єктно-орієнтованого та візуального програмування. Ідея об’єктно-орієнтованого програмування полягає в інкапсуляції (об’єднані) даних і засобів їх опрацювання (методів) у тип, який називається класом. Конкретною зміною кожного класу і є об’єкт. Прикладом об’єктів можуть бути елементи керування у вікні: кнопки, списки, текстові поля, тощо.  Рис. 4. Середовище програмування C++ Builder Виконання програми здійснюється за допомогою використання основних компонентів середовища програмування C++ Builder. Вікно середовища містить палітру компонентів (Component Palette), з якої можна переносити компоненти на форму і змінювати його властивості. Таким чином створюється інтерфейс проекту, а далі відбувається редагування коду програми, забезпечуючи роботу кожного компоненту. Виявлення помилок відбувалося в процесі розробки проекту під час компілювання програми, та видалення їх з програми. 6. Інструкція користувачеві Для виконання програми необхідно запустити файл Book.exe на виконання. Після цього перед користувачем з’явиться вікно в якому користувачеві надано можливість вибрати одну з трьох кнопок: „Теорія” забезпечить перехід у вікно із змістом питань, які розглядаються в даному підручнику (рисунок 6), кнопка „Тестування” забезпечує перехід на програму тестування, яка дає можливість перевірити знання по вивченому матеріалі (перед початко тестування необхідно в каталог Book, скопіювати файл з запитаннями test.tst, який був створений за допомогою редактора тестів), а також кнопка „Вихід”, яка дає можливість виходу з програми. При вивчені теоретичного матеріалу є можливість постійного звертання до змісту питань, також перехід на попередню сторінку і вихід з теорії, тобто повернення на головне вікно програми.  Рис. 5. Зображення головного вікна  Рис. 6. Вікно з теоретичним матеріалом При проходженні тестування користувач заповняє дані про себе, після чого відбувається його реєстрація і запуск самого тестування. Користувачу відведено певний ліміт часу. Після проходження тестування результати зберігаються в файл rezultat.txt.  Рис.7. Вікно тестування 7. Контрольний приклад та аналіз результатів комп’ютерної реалізації програми При проведені тестування програми не було виявлено дефектів в роботі та нестандартних ситуацій. При запуску програми з’являється головне вікно показане на рисунку 5, далі можливий перехід на теоретичну частину(рис.6) чи тестування (рис. 7). Під час проходження тестування користувачеві запропоновано запитання та варіанти відповідей, які користувач обирає та підтверджує (Рис. 8). Після завершення тестування, було представлено інформацію про кількість правильних відповідей, та оцінку(Рис.9). Результат тестування збережено до файлу  Рис. 8. Проходження тестування  Рис. 9. Повідомлення про оцінку Висновки В результаті виконання курсової роботи було розроблено навчальну систему по темі „Взаємодія потоків у Window XP”, яка включає в себе електронний підручник, а також тест, який дозволяє перевірити засвоєний матеріал. Також розроблено редактор тестів, який дає можливість створювати файл з запитаннями та модифікувати його. Було опрацьовано теоретичний матеріал по даній темі. Недоліками можна відзначити послідовний порядок відображення запинь під час тестування. Дана навчальна система дає можливість вивчити основні принципи взаємодії потоків у Windows XP на основі семафорів, м’ютексів, монітора, блокування читання-записування, синхронізації за принципом бар’єра. Даний підручник має суттєво спростити вивчення даного матеріалу оскільки інформація в ньому виглядає біль наочно, легше сприймається і більш зручна у використанні Перевагами є можливість швидкого поширення, домашнього використання (що є суттєвою перевагою, адже не потрібно використовувати великий список паперових посібників). Дана програма направлена на підвищення рівня освіти користувача, полегшення сприймання матеріалу. Використана література: Кравець П.О. Методичні вказівки до курсової роботи з дисципліни «Системне програмування та операційні системи». Шеховцов В.А. Операційні системи. К.: BHV, 2005. Таненбаум Э. Операционные системы. – СПб.: Питер, 2002. Глинський Я. М., Анохін В. Є., Ряжська В. А., С++ і С++Builder. Навч. посібн. 2-е вид. – Львів: Деол, СПД Глинський, 2004. Андрей Тендюк, Алексей Туманов, Григорий Ящук. КА Шаг, 2001 Бьярн Страустрап, Справочное руководство по C++. Библиотека М.Мошкова http://www.winnetmag.com/Articles/Index.cfm?ArticleID=303 http://www.techno.edu.ru/db/msg/14754.html Додатки Код основного вікна Books.cpp #include <vcl.h> #pragma hdrstop #include "Unit2.h" #include "Unit3.h" #include "Books.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::SpeedButton1Click(TObject *Sender) { //зкриття програми Form1->Close(); } //--------------------------------------------------------------------------- void __fastcall TForm1::SpeedButton2Click(TObject *Sender) { // відкриття теоретичного матеріалу Form1->Hide(); Form2->ShowModal(); Form1->Show(); } //--------------------------------------------------------------------------- void __fastcall TForm1::N1Click(TObject *Sender) { Form3->Show(); } //--------------------------------------------------------------------------- void __fastcall TForm1::SpeedButton3Click(TObject *Sender) { // запус тестування WinExec("Test/test.exe",SW_RESTORE); } //--------------------------------------------------------------------------- Код вікна роботи з теорією //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <vcl.h> #pragma hdrstop #include <string.h> #include <cstring.h> #include <stdio.h> #include <conio.h> #include <dir.h> #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "SHDocVw_OCX" #pragma resource "*.dfm" TForm2 *Form2; //--------------------------------------------------------------------------- __fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm2::N3Click(TObject *Sender) { Form2->Close(); } //--------------------------------------------------------------------------- void __fastcall TForm2::N2Click(TObject *Sender) { CppWebBrowser1->GoBack(); } //--------------------------------------------------------------------------- void __fastcall TForm2::FormCreate(TObject *Sender) { // відкриття файлу для читання char mi[100]; strcpy(mi,"X:\\"); mi[0]='A'+getdisk(); getcurdir(0,mi+3); String s(mi); s=s+"/Теорія/Зміст"+".htm"; wchar_t startt[100]; s.WideChar(startt,100); CppWebBrowser1->Navigate(startt); } //--------------------------------------------------------------------------- void __fastcall TForm2::N1Click(TObject *Sender) { // перехід на зміст char mi[100]; strcpy(mi,"X:\\"); mi[0]='A'+getdisk(); getcurdir(0,mi+3); String s(mi); s=s+"/Теорія/Зміст"+".htm"; wchar_t startt[100]; s.WideChar(startt,100); CppWebBrowser1->Navigate(startt); } //--------------------------------------------------------------------------- Код вікна редактора тестів //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <fstream.h> #include <
Антиботан аватар за замовчуванням

19.02.2013 21:02-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!