Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Кафедра «Інформаційні системи та мережі»
К У Р С О В А Р О Б О Т А
з дисципліни «Системне програмування та операційні системи»
на тему:
«Керування процесами та потоками для опрацювання рядків символів»
З А В Д А Н Н Я
На курсову роботу з дисципліни «Системне програмування та операційні системи»
Тема: «Керування процесами та потоками для опрацювання рядків символів»
Зміст завдання
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,