Керування процесами та потоками для опрацювання рядків символів

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

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

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

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

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

Міністерство освіти і науки України Національний університет «Львівська політехніка» Кафедра «Інформаційні системи та мережі» К У Р С О В А Р О Б О Т А з дисципліни «Системне програмування та операційні системи» на тему: «Керування процесами та потоками для опрацювання рядків символів» З А В Д А Н Н Я На курсову роботу з дисципліни «Системне програмування та операційні системи» Тема: «Керування процесами та потоками для опрацювання рядків символів» Зміст завдання 1. Провести огляд літературних джерел по заданій темі для аналізу методів розв’язування задачі.  2. Методи та засоби розв’язування задачі.  3. Виконати програмну реалізацію розроблених алгоритмів Вимоги до програми: Написати програму для керування процесами та потоками для обчислення добутку матриць дійсних чисел A[n][m] та B[m][p] програмна реалізація повинна складатися з трьох частин: програма на мові Intel Assembler для планування резидентних процесів під керуванням MS DOS. Програма повинна складатись з менеджера, який керує спеціалізованими резидентними процесами для: введення даних; реалізації операцій перетворень даних; введення результатів обчислень. Кількість резидентних процесів (>3) визначається функціональними особливостями розв’язуваної задачі. Передбачити можливість перевірки наявності та вивантаження резидентів з оперативної пам’яті; програма на мові С/С++ для планування потоків під керуванням Windows або Linux. Потоки мають виконувати дії, ідентичні діям резидентних процесів MSDOS. Одно процесорна програма на асемблері або С/С++ для контрольної перевірки правильності обчислень. програма повинна мати інтерфейс для вибору режимів її роботи; інтерфейс може бути реалізований мовами С/С++; керування режимами роботи програми виконати за допомогою клавіатури та миші.  4. Підготувати вхідні дані та виконати реалізацію контрольного приладу.  5. Оформити записку до курсової роботи згідно з вимогами Міжнародних стандартів, дотримуючись такого змісту: вступ; формулювання задачі; методи та засоби розв’язування задачі; алгоритм розв’язання задачі; опис програми технологія програмування, виконання та від лагодження програми; інструкція користувачеві; контрольний приклад та результат роботи програми; висновки; література; додатки;   Завдання прийнято до виконання: __________ Керівник роботи: __________ Кравець П. О. Зміст Вступ……………………………………………………………………………...4 ст. 1. Формулювання задачі……………………………………………………5 ст. 2. Методи розв’язування задачі……………………………………………6 ст. 3. Алгоритми розв’язування задачі …………………………………….....10 ст. 4. Програма та її опис……………………………………………………….12 ст. 5. Технологія програмування………………………………………………17 ст. 6. Інструкція користувачеві………………………………………………..18 ст. 7. Контрольний приклад та аналіз результатів комп`ютерної реалізації програми…………………………………………………………….21 ст. Висновки………………………………………………………………………...22 ст. Література……………………………………………………………………….23 ст. Додаток 1. Текст програми на мові Assembler для планування резидентних процесів під керуванням MC DOS …………………………………………………………………….25 ст. Додаток 2. Текст програми на мові C/C++ для планування потоки під керуванням Windows …………………………………………………………………………………...…...33 ст. Додаток 3. Текст програми на мові C для перевірки правильності результатів……..37 ст. Вступ Дана курсова робота полягає у написанні трьох програм: на мові Intel Assembler (для планування резидентних процесів), на мові С/С++ (для планування потоків), та програма на С/С++ для перевірки результатів виконань двох інших програм. Такі програми (крім останньої) дозволяють виконувати обчислення, обробку даних паралельно з роботою інших потоків/процесів. На даний момент паралельне виконання розрахунків є актуальним. Асемблер - це загальноприйнята назва транслятора з автокоду. Асемблер переводить початкову програму, написану на автокоді, в переміщувану програму на мові машинній. Оскільки асемблер здійснює трансляцію на мову завантажувача, при завантаженні програми необхідне налаштування умовних адрес, тобто адрес, значення яких залежать від розташування даної програми в пам'яті ЦВМ і від її зв'язків з іншими незалежно трансльованими програмами. У простому випадку асемблер переводить одну пропозицію початкової програми в один об'єкт (команду, константу) модуля завантаження (т. з. трансляція «один в один»). При цьому взаємне розташування об'єктів у модулі завантаження і, зрештою, в пам'яті машини визначається порядком пропозицій у початковій програмі на автокоді й повністю залежить від програміста. Асемблер виконує і допоміжні функції як-от: підготовка до друку документів необхідної форми, реєстрація зв'язків даної програми з іншими програмами і т. д. Для цієї мети в автокодах передбачаються команди асемблера, які не породжують об'єктів в робочій програмі й призначені тільки для вказівки допоміжних дій асемблера. Трансляція зазвичай вимагає двох переглядів початкової програми: при першому перегляді здійснюється розподіл пам'яті й привласнення значень символічним іменам; при другому — формується робоча програма у вигляді модуля завантаження. В процесі трансляції асемблер проводить повний синтаксичний контроль початкової програми, забезпечуючи при цьому достатньо точну діагностику помилок за місцем і характером. 1. Формулювання задачі Написати програму для керування процесами та потоками для обчислення добутку обчислення добутку матриць дійсних чисел A[n][m] та B[m][p]. Програмна реалізація складатися з трьох частин: Програма на мові Intel Assembler для планування резидентних процесів під керуванням MS DOS. Програма повинна складатись з менажера, який керує спеціалізованими резидентиними процесами для: ведення даних; реалізації операції перетворення даних; виведення результатів обчислення. Кількість резидентних процесів (> 3) визначаються функціональними особливостями розв’язуванням задачі. Передбачити можливість наявності та вивантаження резидентів з оперативної пам’яті; Програма на C/C++ для планування потоків під керуванням Windows або Linux. Потоки мають виконувати дії ідентичні діям резидентних процесів в MS DOS. Однопроцесна програма на Assembler або C/C++ для контрольної перевірки правильних обчислень. Програма має інтерфейс для вибору режимів її роботи, інтерфейс може бути реалізований мовами C/C++ ; керуваннями режимами роботи програми виконати за допомогою клавіатури та миші. 2. Методи і засоби розв’язання задачі TASM - програмний пакет компанії Borland, призначений для розробки програм на мові асемблера для архітектури x16. Крім того, TASM може працювати спільно з трансляторами з мов високого рівня фірми Borland – такими як Turbo C і Turbo Pascal. Як і інші програмні пакети серії Turbo, Турбо Асемблер більше не підтримується. TASM до цього часу використовується для навчання програмуванню на Асемблері під архітектуру x16. Багато хто вважає його дуже зручним і продовжує його використовувати, розширюючи набором додаткових макросів. Пакет TASM поставляється разом з компонувальником Turbo Linker і породжує код, який можна налагоджувати за допомогою Turbo Debugger. За замовчуванням TASM працює в режимі сумісності з іншим поширеним асемблером - Microsoft Macro Assembler, тобто TASM вміє транслювати вихідний код, розроблений під MASM. Крім того, TASM має режим IDEAL, що поліпшує синтаксис мови і розширює його функціональні можливості. Варто зауважити, що TASM – це лише компілятор (програма, яка перетворює вихідний код в машинний код, зрозумілий центральному процесору) і лінкер чи компонувальник (програма, яка виконує компонування - приймає на вхід один або кілька об'єктних модулів і збирає з них виконуваний модуль). TASM не містить редактора коду. Для написання коду програми необхідно використати текстовий редактор. Можна використовувати стандартний редактор тексту корпорації Microsoft – блокнот. Процес повної компіляції має виглядати так: 1.Компіляція: У командному рядку * - C: \ Tasm> Tasm.exe / l / zi ім'я файлу (розширення – .Asm)<ENTER> Після виконаних дій з'явиться файл з тим же ім'ям, але з розширенням – .Obj. Ключ /l означає, що крім файлу з розширенням .Obj згенерує файл з розширенням .Lst, що містить лістинг програми. Ключ /zi поміщає в об'єктний файл повну інформацію для подальшого налагодження з використанням всіх можливостей Turbo Debuggera. 2.Лінкування: Лінкування – процес об'єднання та /або перетворення об'єктних (-ого) файлів (файлу) (з розширенням .OBJ) у виконуваний файл (.EXE або .COM) У командному рядку * - C: \ Tasm \> Tlink.exe /v ім'я файлу (розширення – .Obj)+<ENTER> Зауваження: Ключ v необхідно писати з маленької літери. Після виконаних дій з'явиться файл з тим же ім'ям, але виконавчий (розширення – Exe). 3.Налагодження: Налагодження (трасування) – пошук і виправлення ділянок програми, які некоректно працюють. У командному рядку * - C: \ Tasm \> Td.exe ім'я файлу (розширення – .Exe)+<ENTER> Після виконаних дій TD запуститься в режимі Module. Функції Win32 API для планування, керування потоками Для написання програми для даної курсової роботи потрібно буде використати дві функції, що керують потоками (чи можуть бути використані для роботи з потоками). Це функції CreateThread та WaitForSingleObject[4]. Функція CreateThread створює потік. Параметри цієї функції наведені в таблиці 1. Таблиця 1. Параметри функції CreateThread № Тип Опис  1. LPSECURITY_ATTRIBUTES Вказівник на структуру захисту  2. DWORD Розмір стеку  3. LPTHREAD_START_ROUTINE Вказівник на функцію, яка повинна виконуватися (те, що буде виконувати потік)  4. LPVOID Вказівник, який передається в якості аргументу в потік.  5. DWORD Параметр, який показує, в якому стані уде потік після виконання функції.  6. LPDWORD Вказівник на змінну типу DWORD, яка отримує ідентифікатор нового потоку.   Функція WaitForSingleObject в даному випадку використовується, щоб «дочекатися» завершення роботи потоку. В таблиці 2 описані її параметри. Таблиця 2. Опис параметрів функції WaitForSingleObject № Тип Опис  1. HANDLE Ідентифікатор потоку.  2. DWORD Кількість мілісекунд.  Дана функція чекає завершення роботи потоку. Перший параметр – ідентифікатор потоку, закінчення якого потрібно дочекатися, а другий – кількість мілісекунд – максимальний час, який функція WaitForSingleObject буде чекати, після цього програма буде виконуватися далі. Якщо за заданий період часу потік не завершить своє виконання, то програма передасть управління далі, незважаючи на потік, тобто, другий параметр визначає максимальний час очікування завершення потоку. Перехоплення переривання та обробники переривань Оскільки MS DOS є однозадачною операційною системою, то одночасне виконання декількох програм реалізувати складно, чи навіть неможливо. Але є спосіб швидкої активації програми. Для цього програму потрібно залишити у пам’яті після завершення роботи, така програма називається резидентною. Щоб активізувати (передати керування програмі) потрібно написати обробник переривання, та прив’язати його до номера вибраного переривання. Обробник переривання – це дальня процедура, в нашому випадку повинна бути написана на мові Intel Assembler. Прив’язка обробника переривання до номера вибраного переривання здійснюється в два етапи: збереження адреси попереднього обробника, та встановлення адреси потрібного нам обробника переривань. Частину першого кроку реалізовує функція DOS 35h, опис якої наведений у таблиці 3. Таблиця 3. Опис функції DOS 35h Вхід AH Номер функції – 35h.   AL Номер переривання.  Вихід BX Зміщення.   ES Сегментна адреса.   Результати потрібно зберегти у змінну, щоб потім можна було повернути старий обробник переривань. Функція DOS 25h встановлює потрібний обробник переривань. Опис функції – у таблиці 5. Таблиця 5. Опис функції DOS 25h Вхід АН Номер функції – 25h.   AL Номер переривання.   DX Зміщення.   DS Сегментна адреса.  З допомогою таких функцій можна перехопити переривання, наприклад від клавіатури (INT 09h), після чого при натисканні кнопок. Чи комбінації кнопок керування буде передане на потрібну, нам, ділянку оперативної пам’яті. Резидентні програми Щоб зробити програму резидентною потрібно використати функцію DOS 31h (INT 21 - переривання) , або переривання INT В таблиці 6 описані вхідні дані для функції DOS 31h. Таблиця 6. Опис вхідних даних функції DOS 31h Вхід AH Номер функції - 31h.   AL Код повернення.   DX Розмір пам’яті у параграфах необхідної для збереження резидентної програми.   3. Алгоритм розв’язання задачі. Існує багато алгоритмів знаходження добутку двох матриць, алгоритмів розв’язку поставленої задачі, для побудови ефективної програми я використав алгоритм заснований на математичній формулі, що обчислює добуток двох матриць, це загальна формула, що широко застосовується вона має вигляд:  Формула показує, що кожен елемент матриці С – це є сума добутків елементів і-го рядка матриці А на відповідні елементи j-го стовпця матриці В. Основний принцип алгоритму, що заснований на цій формулі – це використання трьох вкладених циклів for, перший цикл містить змінну і, яка відповідає за номер рядка елемента, другий цикл містить змінну j, що відповідає за номер стовпця, третій цикл містить спеціальну змінну k, що використовується для фіксації певного рядка матриці А при подальшій зміні стовпців матриці В, тобто перший рядок матриці А множиться почергово на всі стовпці матриці В, потім другий рядок і так до останнього. Нижче буде наведена блок-схема, що описує основний алгоритм роботи даної програми, цей алгоритм реалізований в простій однопроцесній програмі:  Рисунок 1. Блок-схема- графічна реалізація алгоритму програми 4. Програма та її опис Назва програми:Kurs.exe. Призначення програми: Написати програму для керування процесами та потоками для обчислення добутку двох матриць . Мови програмування, на яких написана програма: Мова Асемблера – це мова програмування, яка використовує символьну форму машинної мови із залученням деяких можливостей мов високого рівня. Розробка програми на мові асемблера включає кілька етапів. 1) Підготовка початкового тексту програми; 2) Асемблювання програми(отримання об’єктного коду); 3) Компоновка програми(отримання виконуваного файлу); 4) Відладка програми(знаходження помилок). Ці етапи циклічно повторюються. Текст програми на мові асемблера записується в один або кілька файлів, імена файлів і їх розширення можуть бути будь-які, прийнято для файлів які містять програми мовою асемблера прийнято використовувати розширення *.asm. Для файлів визначених констант і повних типів розширення *.inc. Ці файли є текстовими їх можна набрати в будь-якому текстовому редакторі. Можна також використати інтегровані середовища для розробки програм, при програмуванні зручно виділяти один каталог для збереження всіх файлів програми і звідти запускати всі необхідні програми для підготовки, асемблювання та компонування програми. При використанні стандартних редакторів тексту, редаговані тексти треба зберігати у вигляді звичайних файлів у форматі ASCII, це означає, що ці файли треба зберігати без додаткових символів, ці символи часто вставляють в текст різні спеціалізовані редактори, наприклад WORD. Підготовлений текст мови асемблер є початковим для спеціальних програм, які називаються асемблерами, далі програма асемблера. Задача програми асемблера перетворити текст програми у форму двійкових команд, останні можуть вже бути виконанні мікропроцесором. Після асемблювання дістають так звані файли об’єктних модулів, які мають відповідні розширення *.obj. Для отримання об’єктних файлів необхідного виконати відповідну програму асемблера masm фірми Microsoft, або tasm фірми Borland. В обох випадках після команди вказується ім’я файлу : masm prog1.asm, tasm prog1.asm. Така форма команди є мінімальною, крім цієї форми можна використовувати іншу форму задаючи перед іменем файлу опції або ключі. Якщо програма складається з декількох файлів, то їх асемблювання проводиться незалежно один від одного, хоча отримані об’єктні файли представлені вже в двійковій формі запускати їх на виконання не можливо. Текст програми може знаходитись в декількох файлах, змінні які описані в цих файлах можуть використовуватися спільно, якщо такі файли асемблюються окремо, то не можливо дістати повну інформацію, для того, щоб генерувати виконавчий код. Тому процес підготовки програми обов’язково включає в себе етап компоновки. На цьому етапі визначають всі невідомі, при окремому асемблювані, адреси всіх змінних або функцій, які використовуються спільно. Процес об’єднання об’єктних модулів в один файл виконується спец. програмою, яка називається компоновщиком. Це може бути програма link фірми Microsoft, або tlink фірми Borland, отримуваний виконуваний файл має розширення *.exe, або *.com. Компановщику треба передати імена відповідних об’єктних файлів. Після компонування отримується виконуваний файл, він отримує ім’я файла, який стоїть перший у відповідній команді. За винятком початкових простих програм практично всі програми на мові асемблера мають потребу в відладці. Для відладки можна використовувати різні відладчики, наприклад tg386-Turbo Debuger фірми Borland. Сучасні відладчики дозволяють в процесі відладки контролювати значення регістрів загального призначення, а також значення змінних і змінювати їх в процесі відладки, можна переглядати зміст різних ділянок пам’яті, можна контролювати виконання покроково, або розставляти точки зупинки. Дуже зручно користуватись для підготовки тексту програми редакторами ІС, такі можливості передбачають практично всі виробники сучасних асемблерів. ІС мають суттєву перевагу, так як дають доступ до довідкової інформації. Вони дозволяють також зразу асемблювати та компонувати набрані тексти і провести його відладку. Потім знову можна повернутись до його редагування, при цьому складається ілюзія роботи з однією програмою. Слід відмітити, що відладчики вбудовані в ІС мають дещо обмежені можливості. Програма на мові Intel Assembler може складатися із одного або декількох сегментів. Сегментом програми називається та її частина, що складається із команд чи даних, розміри яких не перевищують 64 Кбайт. Існує три основних сегменти програми: сегмент стеку; сегмент коду; сегмент даних. Сегмент стеку – ділянка пам’яті, відведена під стек. Потрібно пам’ятати, що навіть якщо ви в своїй програмі не використовуєте стек, в програмі треба описати сегмент стеку. Це необхідно в міру того, що стек програми використовує операційна система при опрацюванні переривань, які виникають в процесі роботи програми. Сегмент коду – це сегмент, в якому знаходяться команди. Це основний сегмент програми, аналог функції MAIN у мові програмування С чи С++, з якої починається виконання програми. Сегмент даних – це сегмент, в якому знаходяться дані, що використовуються у програмі. Мова програмування асемблер дозволяє змінювати структуру програми як завгодно, наприклад, заносити дані в сегмент коду, розбивати код на будь-яку кількість сегментів або взагалі використовувати тільки один сегмент для всієї програми. Логічна структура програми: логічна структура даної програми складається з трьох частин, тобто трьох програм – це програма написана на С++ з використанням потоків,проста однопроцесна програма на С++ та програма написана на мові Intel Assembler. Перша програма має назву kurs.exe, друга - kurswork.exe і третя - kursasm.asm. Вхідні дані: вхідними даними для програми дійсні та цілі числа, що вводяться почергово, за допомогою консольного введення чи з використанням об’єктів C++ Builder. Вихідні дані: вихідними даними є дійсні та цілі числа організовані у вигляді таблиці або матриці. Програмні засоби, необхідні для реалізації програми: Завдяки особливостям мови програмування Assembler для використання даної програми не потрібно ніяких особливих програмних засобів. Після створення ехе-файлу, програму можна запускати у операційній системі Windows. Також дана програма працює під керівництвом операційної системи MSDOS. А оскільки більшість користувачів використовують саме такі операційні системи можна вважати, що дана програма є мобільною, тобто без значних змін виконується на різних комп’ютерах. Правда компілювання програми відбувалося з допомогою використання оновленої версії середовища Асемблеру, а зокрема – VGM Assembler 1.0. Для реалізації необхідна ОС Windows 9x\Me\2000\xp\Vista\7 або MS-DOS. Компілятор BORLAND C++ v3.1 з інтегрованим компілятором TASM. Технічні засоби: Розроблена у цій курсовій роботі програма може бути переміщена на будь-який комп’ютер, завдяки переносним засобам інформації. Комп’ютер на якому ми хочемо використовувати програму повинен бути укомплектований монітором, клавіатурою або мишкою, системним блоком, на якому обов’язково повинен працювати, або флоппі-дисковод, або CD-ROM, або CD-RW. Також, для того, аби користувач мав змогу скопіювати дану програму на свій комп’ютер йому знадобиться ≈200 КБ на жорсткому диску. ОС Windows 9x\Me\2000\xp\Vista\7 або MS-DOS. Компілятор BORLAND C++ v3.1 з інтегрованим компілятором TASM. Отож, якщо користувач має усі вище перераховані технічні засоби, він може користуватися програмою, розробленою протягом курсової роботи. 5. Технологія програмування Технологія програмування: Для того аби програма була написана доступно для будь-яких програмістів, які можливо цікавитимуться нею та й для власного швидшого орієнтування у ній, необхідно спланувати структуру, яка була б чіткою і зрозумілою. Отож, ми повинні чітко розділити пункти виконання програми і розбити їх по підпрограмах, які виконуватимуть ці кроки. Кроки, які виконуватимуться декілька раз і кожного разу у інших випадках, найвигідніше буде спланувати як окрему підпрограму. Також планувати як окрему підпрограму слід ті дії, які є елементами складних підпрограм і при їх описі у підпрограмі може заплутатися програміст, що у свою чергу може призвести до неправильного функціонування програми. Також одним з основних є сама організація написання підпрограм. Підпрограми повинні бути написані з певними відступами. Дужки, що відкрилися повинні закритися з таким самим відступом. Відповідно ті функції, які розміщені всередині іншої повинні друкуватися з більшим відступом або на рівні дужок, які відкриваються. Для того, щоб було легше орієнтуватися у тексті програми імена змінних і підпрограм повинні відповідати діям або функціям які вони виконують. Також для кращого розуміння дій, які виконуються у даній програмі необхідно встановлювати коментарі, а перед початком підпрограми в коментарях описати точне призначення підпрограми. Технологія виконання програми: щоб виконати дану програму потрібно знайти один з трьох файлів з розширенням .ехе – це kurs.exe, kurswork. exe, kursasm.exe, виділити його за допомогою клавіатури та натиснути клавішу Enter або відкрити його за допомогою подвійного клацання «мишкою». Технологія відлагодження програми: Якщо використовувати технологію програмування, яка описана вище, то при відлагодженні не повинно виникнути жодних ускладнень. Для успішного написання програми її відлагодження повинно відбуватися покроково. Тобто після того, як ми написали якусь частину програми (це може бути підпрограма) ми виконуємо компіляцію, знаходимо помилки і виправляємо їх. Ми повинні пам’ятати, що ті помилки, які показує компілятор, не завжди стосуються саме тих частин на які він вказує. Причина може виявитися у попередніх операторах. Також ми повинні пам’ятати, що компілятор не показує логічних помилок , які ми створюємо. Тому перед запуском програми необхідно перевірити нашу програму на наявність таких помилок. У таких випадках нам допомагає попередньо розроблений алгоритм розв’язування задачі. При відлагоджені програми для даної курсової, завдяки простоті алгоритму знаходження добутку матриць не було виявлено серйозних помилок, які могли б вплинути на результат виконання програми. Були виявлені незначні помилки такі, як: відсутність «;» після виразу, не закриті цикли, не оголошені змінні. 6. Інструкція користувачеві Для кращого розуміння принципу роботи даної програми інструкція користувачеві буде надана на основі програм, що були написані на мові С++, це програма з використанням потоків та проста однопроцесна програма. Програма з використанням потоків має простий та зрозумілий інтерфейс – це одна з переваг програмування в середовищі Builder C++. Після запуску програми ми отримаєм наступне вікно:  Рисунок 2. Вікно програми Користувач може ввести розмірність матриці з одним єдиним обмеженням: розмір матриці не повинен перевищувати розмір матриці, що має 6 стовпців та 6 рядків, тобто розмір 6 на 6. Для того, щоб змінити розмірність матриці необхідно натиснути кнопку «Оновити розмір матриці». Щоб здійснити обчислення добутку матриць потрібно натиснути «Обчислити добуток матриць». Щоб отримати результат обчислень необхідно натиснути «Вивести результат». Щоб отримати інформацію про автора програми натисніть «Про програму». Для того, щоб вийти з програми потрібно натиснути кнопку «Вийти з програми». Після натиснення кнопки «Обчислити добуток матриць» користувач отримає наступне повідомлення:  Рисунок 3 Після введення даних вікно програми буде виглядати так:  Рисунок 4 Після виведення результату ми отримаєм наступне:  Рисунок 5 7.Контрольний приклад та аналіз результатів комп`ютерної реалізації програми Для перевірки правильності роботи програми для контрольного прикладу використаєм просту однопроцесну програму, що використовує консольне введення та виведення, ця програма була написана в середовищі програмування Borland C++ 3.1. Для того, щоб виконати програму потрібно відкрити файл kurswork.exe. Після виконання його, внесення вхідних даних, що були використані в попередньому прикладі ми отримаєм такий результат:  Як бачимо програма працює правильно і швидко, що є основним аспектом роботи програми для користувача. Програма дозволяє не затрачати багато часу на отримання потрібних результатів, що сприяє ефективній організації праці користувача. Робота даної програми не займає великої кількості пам’яті, що є вигідним для користувача. Інтерфейс програми є зручним і доступним для кожного і не викликає особливих проблем при користуванні програмою. Висновки Я написав три програми, одна з яких планує потоки, інша резидентні процеси, а третя – перевіряє результат виконання двох інших. Всі три програми працюють над однією задачею, знайти всі входження однієї стрічки в іншу, та замінити на третю стрічку. Недоліки цих програм – програми не вирішують важливих проблем, чи не полегшують життя людям, але у програмах застосовуються дієві алгоритми для досягнення цілей. Також, одна з програм може розміщуватися в пам’яті як завгодно довго (в MS DOS), поки працює комп’ютер, і виклик такої програми можливий в будь-який час роботи користувача, що є дуже зручно. Список літератури 1. Зубков В. С. Assembler для DOS, Windows и UNIХ. – ДМК, 1999 2. Кравець П. О. Системне програмування та операційні системи. Частина 1. – видавництво національного університету «Львівська політехніка», 2007 3. Кравець П. О. Системне програмування та операційні системи. Частина 2. – видавництво національного університету «Львівська політехніка», 2007 4. Харт Дж. В. Системное программирование в среде Win32. – Вильямс, 2001 5.Фролов А, Фролов Г, MS-DOS для программиста - Диалог-МИФИ, 1995 6. Автор невідомий, Windows API, - 2001-2003, посилання: http://progs.biz/winapi/winapi/winapi01.aspx Додаток 1. Текст програми для планування резидентних процесів під керуванням MS DOS на мові Turbo Assembler .model small .data m equ 4 k equ 2 n equ 4 xmat dw m*k dup(0) ymat dw k*n dup(0) buffer db m*n*20 dup(0) result dw m*n*2 dup (0) marker db (0) f_input db "input.dat",0 f_output db "output.dat",0 inhandle dw ? outhandle dw ? buffersize dw ? err_open db "couldn't open file !","$" err_creat db "couldn't create the file","$" err_write db "couldn't write the file","$" err_close db "couldn't write the file","$" msg db "Press any key to continue...","$" ;---------------------------------------------------------------------------- .code main: mov ax,@data mov ds,ax call open call read mov di,offset buffer mov si,offset xmat mov cl,m*k call asciitobin mov cl,k*n mov si,offset ymat call asciitobin call matrixmul call bintoascii call creatfile call writefile mov bx,inhandle call closefile mov bx,outhandle call closefile mov dx,offset buffer call err_msg mov dx,offset msg call err_msg mov ah,07h int 21h mov ah,4ch int 21h ;----------------------------------------------------------------------------- open proc near mov ah,3dh mov al,0 mov dx,offset f_input int 21h jc o_error mov inhandle,ax jmp o_exit o_error: mov dx,offset err_open call err_msg o_exit: ret open endp ;------------------------------------------------------------------------------ err_msg proc near mov ah,9h int 21h ret err_msg endp ;------------------------------------------------------------------------------ read proc near mov ah,3fh mov bx,inhandle mov cx,m*n*20 mov dx,offset buffer int 21h ret read endp ;------------------------------------------------------------------------------ asciitobin proc near mov bh,0 mov bp,10d next: mov ax,0 here: mov bl,[di] cmp bl,20h je there sub bl,30h mul bp add ax,bx inc di jmp here there: mov word ptr[si],ax inc di add si,2 dec cl jnz next add di,2 ret asciitobin endp ;------------------------------------------------------------------------------ matrixmul proc near mov si,0 mov di,0 mov cl,m lp2: mov ch,n mov bx,0 lp1: call vectormul mov result[di],ax mov result[di+2],dx add di,4 add bx,2 dec ch jnz lp1 add si,k*2 dec cl jnz lp2 ret matrixmul endp ;-------------------------------------------------- vectormul proc near push si push bx push cx push bp push di mov bp,0 mov di,0 mov cl,k lp: mov ax,xmat[si] mul ymat[bx] add bp,ax adc di,dx add si,2 add bx,2*n dec cl jnz lp mov ax,bp mov dx,di pop di pop bp pop cx pop bx pop si ret vectormul endp ;------------------------------------------------- bintoascii proc near mov si,offset marker sub si,4 mov bx,10 mov cl,m*n mov bp,sp lp4: mov ax,word ptr[si] mov dx,word ptr[si+2] mov ch,0 lp3: div bx add dx,30h push dx inc ch mov dx,0 or ax,ax jnz lp3 push cx sub si,4 dec cl jnz lp4 ;------------------------------------------------------ ; storeing in buffer section ;------------------------------------------------------ mov di,offset buffer mov bl,m mov dx,0 lp7: mov bh,n lp6: pop cx lp5: pop ax mov [di],al inc di inc dx dec ch jnz lp5 mov byte ptr[di],20h inc di inc dx dec bh jnz lp6 mov byte ptr[di],0dh mov byte ptr[di+1],0ah add di,2 add dx,2 dec bl jnz lp7 mov byte ptr[di],'$' mov buffersize,dx mov sp,bp ret bintoascii endp ;------------------------------------------------- creatfile proc near mov ah,3ch mov cx,0 mov dx,offset f_output int 21h jc c_error mov outhandle,ax jmp c_exit c_error: mov dx,offset err_creat call err_msg c_exit: ret creatfile endp ;------------------------------------------------- writefile proc near mov ah,40h mov bx,outhandle mov cx,buffersize mov dx,offset buffer int 21h jnc w_exit mov dx,offset err_write call err_msg w_exit: ret writefile endp ;------------------------------------------------------------------------------ closefile proc near mov ah,3eh int 21h jnc cl_exit mov dx,offset err_close call err_msg cl_exit: ret closefile endp ;------------------------------------------------------------------------------ end main Додаток 2. Текст програми для планування потоків під керуванням Windows на мові C++ //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- int n=2,m=2; // variables int i,j,z; float sum; float res[5][5]; HANDLE T1,T2,T3; //handles for threads DWORD WINAPI ReSize(LPVOID) // Funtcion for thread(T1) which change number of colls and rovs { if((n<6)&&(m<6)) { Form1->s1->RowCount=n; Form1->s1->ColCount=m; Form1->s2->RowCount=m; Form1->s2->ColCount=n; Form1->s3->RowCount=n; Form1->s3->ColCount=n; } else {ShowMessage("Помилка – кількість рядків має бути менша 6");} } DWORD WINAPI Calculate(LPVOID) { for(i=0;i<n;i++) {for(j=0;j<n;j++){ sum=0; for(z=0;z<m;z++) { sum+=StrToFloat(Form1->s1->Cells[z][i])*StrToFloat(Form1->s2->Cells[j][z]); } res[i][j]=sum; }} } DWORD WINAPI PrintData(LPVOID) { for(i=0;i<n;i++){ for(j=0;j<n;j++){ Form1->s3->Cells[j][i]=res[i][j]; }} } void __fastcall TForm1::Button1Click(TObject *Sender) { n=StrToFloat(Edit1->Text); // Read data from Edits m=StrToFloat(Edit2->Text); T1 = CreateThread(NULL,0,ReSize,NULL,0,NULL); //Run thread WaitForSingleObject(T1,100); //Wait for thread end } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { T2 = CreateThread(NULL,0,Calculate,NULL,0,NULL); //Run thread WaitForSingleObject(T2,
Антиботан аватар за замовчуванням

15.05.2013 16:05-

Коментарі

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

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

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

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

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

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

Admin

26.02.2023 12:38

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