Лабораторні роботи

Site: Державний університет "Житомирська політехніка" - Освітній портал
Course: Системне програмування
Book: Лабораторні роботи
Printed by: Guest user
Date: Wednesday, 20 January 2021, 10:53 AM

Description

1. Лабораторна робота №1

Тема: "Процеси та потоки"

Взаємодія між процесами. 
Розподіл даних між процесами. 
Робота з файлами які відображуються у пам'ять.

 Завдання 1

Необхідно написати дві програми (три), які будуть мати спільні дані  та одночасно до них звертатися.

Існує кілька механізмів реалізації спільного доступу до даних різних процесів.

Скористаємося одним з них, найбільш зручним - проектуванням файлу в пам'ять.

Одна програма буде сортувати дані у файлі, а інша відображати вміст цього файлу. Працювати обидва процеси будуть одночасно. Третя програма буде створювати (або заповнювати по новому) масив випадкових чисел.

 

Створіть файл data.dat. У ньому мають бути записані числа, згенеровані випадковим чином. Кількість чисел - 20-30 штук. Діапазон значень: від 10 до 100. (Це саме числа, а не символьні рядки зберігають ASCII коди цифр !!!)

 

Програма №1. "Сортування даних" (консольна)

Беремо за основу програму "Hello windows"
Включаємо обробку події натискання клавіші, і відстежуємо в ньому натискання пробілу. Якщо користувач натиснув пробіл, значить починаємо сортування даних.
Виконуємо проектування файлу в пам'ять. Використовуємо для цього створений файл data.dat. В результаті отримаємо доступ до даних як до звичайного одновимірного масиву.
Виконуємо сортування масиву, будь-яким з методів сортування. Вставте 1-но секундну затримку для кожної ітерації сортування масиву, це дозволить потім наочніше побачити процес сортування.
По закінченню сортування, програма виводить у вікно, рядок «Робота завершена».
 

Програма №2. «Виведення файлу даних у вікно» (віконна)


Виконуємо проектування файлу в пам'ять. Використовуємо для цього створений файл data.dat. В результаті отримаємо доступ до даних як до звичайного одновимірного масиву. Цей же файл проектує в пам'ять попередня програма.
Створюємо таймер на 0.5 секунди. При отриманні повідомлення від таймера, виконуємо висновок всього масиву в вікно. Передбачте коректний перевивід даних у вікно, без накладень. У вікно виводиться не числа з масиву, а рядки одного і того ж символу, наприклад «*», в кількості, що дорівнює числу з масиву.
 

Запускаємо на виконання обидві програми одночасно. Коли друга програма запустилася і виконує висновок даних у вікно (виводить поки одну й ту ж саму картинку кожні пів секунди), натискаємо пробіл в першій програмі і вона починає сортувати масив. При цьому, так як вони дані беруть з одного і того ж файлу (обидві проектували його собі на згадку), то перша вносить зміни переставляючи дані при сортуванні, а друга виводить з себе у вікно і ми бачимо хід процесу сортування. Тимчасову затримку в першій програмі можна при потребі збільшити.

 

Ці дві програми демонструють можливість організації спільного доступу процесів до одних і тих самих даних. Так само демонструється механізм проектування файлу в пам'ять, як один з найкращих методів доступу до файлу.

 

Завдання 2.

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

Для організації такої синхронізації потрібно використати об'єкт ядра ОС mutex або semaphor, або інший синхронізуючий об'єкт, а також функції очікування (наприклад, WaitForSinglJbject()).

Також обов'язковим є використання обробки виняткових ситуацій в роботі вище описаних трьох програм. Бо, некоректна робота будь якої з трьох, викличе неправильну роботу інших, через блокування спільних даних.

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

Додаткове завдання.

Написати четверту програму (консольну), яка буде одночасно працювати, та намагатися відсортувати той самий масив в іншому напрямку та іншим відомим методом сортування.

Завдання підвищеної складності.

Організувати роботу усіх чотирьох вищеописаних програм на різних робочих станціях локальної мережі але з відображенням одного того самого файлу даних. Для цього потрібно розібратися, як зробити видимим об'єкт "відображений файл" у локальній мережі.

Лабораторна робота №1 "Процеси та потоки"

Взаємодія між процесами. 
Розподіл даних між процесами. 
Робота з файлами які відображуються у пам'ять.

 

Необхідно написати дві програми (три), які будуть мати спільні дані  та одночасно до них звертатися.

Існує кілька механізмів реалізації спільного доступу до даних різних процесів.

Скористаємося одним з них, найбільш зручним - проектуванням файлу в пам'ять.

Одна програма буде сортувати дані у файлі, а інша відображати вміст цього файлу. Працювати обидва процеси будуть одночасно. Третя програма буде створювати (або заповнювати по новому) масив випадкових чисел.

 

Створіть файл data.dat. У ньому мають бути записані числа, згенеровані випадковим чином. Кількість чисел - 20-30 штук. Діапазон значень: від 10 до 100. (Це саме числа, а не символьні рядки зберігають ASCII коди цифр !!!)

 

Програма №1. "Сортування даних"

Беремо за основу програму "Hello windows"
Включаємо обробку події натискання клавіші, і відстежуємо в ньому натискання пробілу. Якщо користувач натиснув пробіл, значить починаємо сортування даних.
Виконуємо проектування файлу в пам'ять. Використовуємо для цього створений файл data.dat. В результаті отримаємо доступ до даних як до звичайного одновимірного масиву.
Виконуємо сортування масиву, будь-яким з методів сортування. Вставте 1-но секундну затримку для кожної ітерації сортування масиву, це дозволить потім наочніше побачити процес сортування.
По закінченню сортування, програма виводить у вікно, рядок «Робота завершена».
 

Програма №2. «Висновок файлу даних у вікно»


Виконуємо проектування файлу в пам'ять. Використовуємо для цього створений файл data.dat. В результаті отримаємо доступ до даних як до звичайного одновимірного масиву. Цей же файл проектує в пам'ять попередня програма.
Створюємо таймер на 0.5 секунди. При отриманні повідомлення від таймера, виконуємо висновок всього масиву в вікно. Передбачте коректний перевивsд даних у вікно, без накладень. У вікно виводиться не числа з масиву, а рядки одного і того ж символу, наприклад «*», в кількості, що дорівнює числу з масиву.
 

Запускаємо на виконання обидві програми одночасно. Коли друга програма запустилася і виконує висновок даних у вікно (виводить поки одну й ту ж саму картинку кожні пів секунди), натискаємо пробіл в першій програмі і вона починає сортувати масив. При цьому, так як вони дані беруть з одного і того ж файлу (обидві проектували його собі на згадку), то перша вносить зміни переставляючи дані при сортуванні, а друга виводить з себе у вікно і ми бачимо хід процесу сортування. Тимчасову затримку в першій програмі можна при потребі збільшити.

 

Ці дві програми демонструють можливість організації спільного доступу процесів до одних і тих самих даних. Так само демонструється механізм проектування файлу в пам'ять, як один з найкращих методів доступу до файлу.

 

Завдання 2.

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

Для організації такої синхронізації потрібно використати об'єкт ядра ОС мутекс або семафор, або інший синхронізуючий об'єкт, а також функції очікування (наприклад, WaitForSinglJbject()).

Також обов'язковим є використання обробки виняткових ситуацій в роботі вище описаних трьох програм. Бо, некоректна робота будь якої з трьох, викличе неправильну роботу інших, через блокування спільних даних.

Додаткове завдання.

Написати четверту програму, яка буде одночасно працювати, та намагатися відсортувати той самий масив в іншому напрямку та іншим відомим методом сортування.

Завдання підвищеної складності.

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

2. Лабораторна робота №2

Тема: Виконання дій у системі за допомогою скриптів.

 Корисні посилання:

  1. https://uk.wikipedia.org/wiki/VBScript
  2. https://uk.wikipedia.org/wiki/%D0%9F%D0%B0%D0%BA%D0%B5%D1%82%D0%BD%D0%B8%D0%B9_%D1%84%D0%B0%D0%B9%D0%BB
  3. https://rsdn.org/article/winshell/NTCommandProcessor.xml
  4. http://www.cyberforum.ru/cmd-bat/thread671323.html
  5. http://microsin.net/adminstuff/windows/bat-files-programming.html

 Завдання

Написати пакетний файл який:

  1. Має аргументи командного рядка: Аргумент1, Аргумент2, Аргумент3, Аргумент4, Аргумент5, Аргумент6.

    Приклад виклику(і це тільки приклад, ваш виклик буде виглядати по іншому:

          lab.cmd lab.log d:\baza xx.exe d:\archive 192.168.1.2 500

    де:

    lab.cmd -
    назва вашого файла скрипта 
    lab.log  - назва вашого log файлу
    d:\baza -
    шлях до файлів які підлягають регулярному архівуванню
    xx.exe - назва процесу який потрібно завершити
    d:\archive - шлях, по якому необхідно записати архів
    192.168.1.2 -
    IP адреса комп'ютера, який потрібно вимкнути
    500 -
    розмір log файлу, який не має бути перевищеним.

  2. Перевіряє чи існує файл, ім’я якого завдано у Аргумент1.
  3. Якщо не існує, то створює його. Це буде log файл скрипта.
  4. Дописує у цей файл :
    • поточну дату та час;
    • «Файл з ім’ям Аргумент1 відкрито або створено».
  5. Отримати час з NTP серверу та встановити його  поточним. Записати оновлений час у log.
  6. Виводить у log список усіх запущених процесів.
  7. Завершує процес, з ім’ям Аргумент3. Інформує в log.
  8. Видаляє усі файли за шляхом Аргумент2, які мають розширення .TMP, або їх ім’я починається на «temp».
  9. Інформацію про виконані дії записує у log файл. Вказати кількість видалених файлів.
  10. Стискає усі файли які залишилися за шляхом Аргумент2 у архів .zip. Ім’я архіву – поточна дата та час.
  11. Переписує створений архів у папку за шляхом Аргумент4.
  12. Перевіряє чи є файл з архівом за минулий день. Інформує у log.Якщо нема, інформує на email.
  13. Інформацію про виконані дії записує у log файл.
  14. Перевіряє, чи є за шляхом Аргумент4, архіви, старші 30 днів, та якщо є, то видаляє. Інформує в log.
  15. Перевіряє чи є підключення до Internet, та інформує в log.
  16. Перевірити чи є в локальній мережі комп’ютер з IP аргумент5, та якщо є, то завершити його роботу. Інформувати в log.
  17. Отримує список комп’ютерів в мережі та записує отриману інформацію у log.
  18. Перевіряє, якщо один з комп’ютерів, зі вказаними IP адресами у файлі ipon.txt не присутній в мережі, інформує в log та на email.
  19. Перевіряє, якщо розмір поточного log файлу більший за Аргумент6, то інформує в log та на email.
  20. Перевіряє кількість вільного та зайнятого місця на усіх дисках в системі та пише цю інформацію в log.
  21. Записати результат виконання команди systeminfo у файл “systeminfo+поточна дата-час.txt”.
  22. Встановіть запуск вашого скрипту, регулярно, періодично.
  23. Описати у звіті кожну використану внутрішню та зовнішню команду зі всіма параметрами.

 

 

3. Лабораторна робота №3

Створення утіліти «DiskInfo»

У даній лабораторній работі, використовуючи виклики системних функцій, отримати інформацію про дискову підсистему:

  1. Список усіх логічних дисків в системі.
  2. Отримати тип кожного диску присутнього в системі, та дати пояснення для кожного типу диску.
  3. Отримати інформацію про диски в системі та про файлові системи Які Використовують на них.
  4. Отримати інформацію про зайнятості та вільне місце на кожному з дисків.
  5. Отримати інформацію про системну пам'ять.
  6. Отримати інформацію про Назву комп'ютера
  7. Отримати Назву поточного користувача
  8. Отримати інформацію про поточний системний каталог, Тимчасовий каталог, поточний робочий каталог.
  9. Для обраних каталогу на диску, Включити спостереження за змінами, продемонструвати відслідковування більше однієї зміни. Зміни записувати в лог файл.

10.

 

Переліг деяких функцій, які можуть бути використанні при виконанні лабораторної роботи:

 

GetLogicalDrives

 

Функція GetLogicalDrives повертає число-бітову маску в якій зберігаються всі

доступні диски.

DWORD GetLogicalDrives (VOID);

параметри:

Ця функція не має параметрів.

 

GetDriveType

 

Функція GetDriveType повертає тип диска (removable, fixed, CD-ROM,

RAM disk, або network drive).

 

UINT GetDriveType (LPCTSTR lpRootPathName);

 

параметри:

lpRootPathName

 

[In] Покажчик на не нульовий стоку в якій зберігається ім'я

головною директорії на диску. Зворотний слеш повинен бути присутнім!

Якщо lpRootPathName одно NULL, то функція використовує поточну директорію.

 

Значення, що повертається:

Функція повертає тип диска. Можуть бути такі значення:

 

значення Опис

DRIVE_UNKNOWN Чи не відомий тип.

DRIVE_NO_ROOT_DIR Чи не правильний шлях.

DRIVE_REMOVABLE Знімний диск.

DRIVE_FIXED Фіксований диск.

DRIVE_REMOTE Віддалений або network диск.

DRIVE_CDROM CD-ROM диск.

DRIVE_RAMDISK RAM диск.

 

GetVolumeInformation

 

Функція GetVolumeInformation повертає інформацію про файлову систему і

дисках (директоріях).

 

BOOL GetVolumeInformation (

LPCTSTR lpRootPathName, // ім'я диска (директорії) [in]

LPTSTR lpVolumeNameBuffer, // назва диска [out]

DWORD nVolumeNameSize, // довжина буфера назви диска [in]

LPDWORD lpVolumeSerialNumber, // серіальний номер диска [out]

LPDWORD lpMaximumComponentLength, // максимальна довжина фийла [out]

LPDWORD lpFileSystemFlags, // опції файлової системи [out]

LPTSTR lpFileSystemNameBuffer, // ім'я файлової системи [out]

DWORD nFileSystemNameSize // довжина буфера імені файл. сист. [In]

);

 

Значення, що повертається:

Якщо функція викликана правильно, то вона повертатися не нульове значення (TRUE).

Якщо функція викликана не правильно, то вона повертає 0 (FALSE).

приклад:

char VolumeNameBuffer [100];

char FileSystemNameBuffer [100];

unsigned long VolumeSerialNumber;

 

GetDiskFreeSpaceEx

 

Функція GetDiskFreeSpaceEx видає інформацію про доступному місці на диску.

 

BOOL GetDiskFreeSpaceEx (

LPCTSTR lpDirectoryName, // ім'я диска (директорії) [in]

PULARGE_INTEGER lpFreeBytesAvailable, // доступно для використання (байт) [out]

PULARGE_INTEGER lpTotalNumberOfBytes, // максимальний обсяг (в байтах) [out]

PULARGE_INTEGER lpTotalNumberOfFreeBytes // вільно на диску (в байтах) [out]

);

 

Значення, що повертається:

Якщо функція викликана правильно, то вона повертатися не нульове значення (TRUE).

Якщо функція викликана не правильно, то вона повертає 0 (FALSE).

приклад:

DWORD FreeBytesAvailable;

DWORD TotalNumberOfBytes;

DWORD TotalNumberOfFreeBytes;

 

GlobalMemoryStatus

 

Функція GlobalMemoryStatus повертає інформацію про використовуваної системою пам'яті.

 

VOID GlobalMemoryStatus (

LPMEMORYSTATUS lpBuffer // покажчик на структуру MEMORYSTATUS

);

 

typedef struct _MEMORYSTATUS {

DWORD dwLength; // довжина структури в байтах

DWORD dwMemoryLoad; // завантаження пам'яті в процентах

SIZE_T dwTotalPhys; // максимальна кількість фізичної пам'яті в байтах

SIZE_T dwAvailPhys; // вільна кількість фізичної пам'яті в байтах

SIZE_T dwTotalPageFile; // макс. кол. пам'яті для програм в байтах

SIZE_T dwAvailPageFile; // вільне кол. пам'яті для програм в байтах

SIZE_T dwTotalVirtual; // максимальна кількість віртуальної пам'яті в байтах

SIZE_T dwAvailVirtual; // вільна кількість віртуальної пам'яті в байтах

} MEMORYSTATUS, * LPMEMORYSTATUS;

 

Значення, що повертається:

Ця функція не повертає параметрів

 

GetComputerName, GetUserNameA

 

Функція GetComputerName повертає NetBIOS ім'я локального комп'ютера.

 

BOOL GetComputerName (

LPTSTR lpBuffer, // ім'я локального комп'ютера (довжина буфера дорівнює MAX_COMPUTERNAME_LENGTH + 1) [out]

LPDWORD lpnSize // розмір буфера (краще поставити MAX_COMPUTERNAME_LENGTH + 1) [out / in]

);

 

Функція GetUserName повертає ім'я поточного Юзера.

 

 

GetSystemDirectory, GetTempPath, GetWindowsDirectory, GetCurrentDirectory

 

Функція GetSystemDirectory повертає шлях до системної директорії.

 

UINT GetSystemDirectory (

LPTSTR lpBuffer, // буфер для системної директорії [out]

UINT uSize // розмір буфера [in]

);

 

Значення, що повертається:

Ця функція повертає розмір буфера для системної директорії не вмикаючи нульового

значення в кінці, якщо вона викликана правильно.

Якщо функція викликана не правильно, то вона повертає 0.

 

 

Функція GetTempPath повертає шлях до директорії, відведеної для тимчасових файлів.

 

DWORD GetTempPath (

DWORD nBufferLength, // розмір буфера [in]

LPTSTR lpBuffer // буфер для тимчасової директорії [out]

);

 

Значення, що повертається:

Ця функція повертає розмір буфера для системної директорії не вмикаючи нульового

значення в кінці, якщо вона викликана правильно.

Якщо функція викликана не правильно, то вона повертає 0.

 

 

Функція GetWindowsDirectory повертає шлях до Windows директорії.

 

UINT GetWindowsDirectory (

LPTSTR lpBuffer, // буфер для Windows директорії [out]

UINT uSize // розмір буфера [in]

);

 

Значення, що повертається:

Ця функція повертає розмір буфера для системної директорії не вмикаючи нульового

значення в кінці, якщо вона викликана правильно.

Якщо функція викликана не правильно, то вона повертає 0.

 

 

Функція GetCurrentDirectory повертає шлях до поточної директорії.

 

DWORD GetCurrentDirectory (

DWORD nBufferLength, // розмір буфера [in]

LPTSTR lpBuffer // буфер для поточної директорії [out]

);

 

Значення, що повертається:

Ця функція повертає розмір буфера для системної директорії не вмикаючи нульового

значення в кінці, якщо вона викликана правильно.

Якщо функція викликана не правильно, то вона повертає 0.

 

Відстеження змін на диску

 

HANDLE FindFirstChangeNotification (

LPCTSTR lpPathName, // шлях до каталогу

BOOL bWatchSubtree, // прапор управління

DWORD dwNotifyFilter // прапори подій

);

 

Ми створили покажчик на об'єкт каталогу, аудит якого будемо проводити FindFirstChangeNotification (), а потім чекаємо повідомлення від каталогу WaitForSingleObject при його отриманні виводимо повідомлення на екран і закриваємо покажчик FindCloseChangeNotification ().

BOOL FindCloseChangeNotification (

HANDLE hChangeHandle // покажчик на об'єкт

);

Якщо потрібно стежити постійно, наприклад, щоб вести LOG файл, то потрібно викликати функцію:

BOOL FindNextChangeNotification (

HANDLE hChangeHandle // покажчик на об'єкт

);

Для отримання інформації про наступне подію. Ця функція переводить об'єкт в первинний стан і їм можна користуватися в подальшому для виявлення повідомлень. Якщо Ви уважно подивилися код, то побачили, що функція FindFirstChangeNotification () не отримує повідомлення, а тільки створює об'єкт, якому ці повідомлення будуть надіслані.

 

 

Корисні посилання:

https://books.google.com.ua/books?id=AjCJijSyKkoC&pg=PA221&lpg=PA221&dq=%D1%81%D0%B1%D0%BE%D1%80+%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D1%96%D0%B8+%D0%BE+%D0%B4%D0%B8%D1%81%D0%BA%D0%B5&source=bl&ots=0OGbt9zBd3&sig=ACfU3U3n5g-RoPOV8Iot8n-2_km12OXTsg&hl=uk&sa=X&ved=2ahUKEwiamvb025LhAhVyAhAIHfvaARwQ6AEwBHoECAYQAQ#v=onepage&q=%D1%81%D0%B1%D0%BE%D1%80%20%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D1%96%D0%B8%20%D0%BE%20%D0%B4%D0%B8%D1%81%D0%BA%D0%B5&f=false

 

http://www.firststeps.ru/mfc/winapi/r.php?110

 

http://www.frolov-lib.ru/books/bsp/v26/ch5_7.htm

 

http://www.frolov-lib.ru/books/bsp/v26/index.html

 

MBR, GPT

https://habr.com/ru/post/327572/

 

https://habr.com/ru/post/347002/

 

https://computerinfo.ru/kak-uznat-gpt-ili-mbr/

 

4. Лабораторна робота №4

Системний реєстр

Мета: Вивчити призначення та методи роботи з системним реєстром Windows.

Завдання.

1. Вивчити призначення та структуру системного реєстру.

2. Вивчити призначення та методи роботи з утилітою RegEdit.

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

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

5. Додати програмно до автозавантаження програм для поточного користувача завантаження програми WinWord або іншої.

6. Вивести список повторно, та показали що зареєстрована програма є у списку.

7. Вивести список усіх завдань, які зареєстровані у планувальнику задач системи. Інформації отримати з відповідного розділу реєстру, як для усіх користувачів так і для поточного користувача.

8. Зробити програмно копію будь якого розділу реєстру у файл відповідного формату .reg

9. За допомогою текстового редактора створити REG файл, за допомогою якого в реєстр у відповідний розділ буде внесено інформацію про асоціацію відкриття файлів .ttt програмою notepad.

10. Описати усі виконані дії у звіті.

5. Лабораторна робота №5

Динамічно зв'язувані бібліотеки.

Мета: Вивчення роботи з DLL.

1. Написати програмний продукт, який буде мати об'єктно-орієнтовану архітектуру. Обов'язкове створення та реалізація двох класів. Перший - інтерфейс, другий - обчислення.

2. Кожен клас має розташовуватися в окремій DLL.

3. DLL яка реалізує інтерфейс має завантажуватися разом з основною програмою.

4. DLL яка реалізує обчислення має завантажуватися пізніше, вже під час роботи програмного продукту, за вимогою користувача. А також після використання відвантажуватися з пам'яті. Перед завантаженням необхідно перевірити чи є вже бібліотека у пам'яті.

5. Підключити та використати будь які функції для прикладу, будь яку не власну бібліотеку.

6. При реалізації класу обчислень, використати алгоритм повного перебору, або сортування qsort, та використати породження багатьох потоків. Вивчити поведінку системи при граничному використанні пам'яті та породжених потоків. Показати графіки використання ресурсів. Проаналізувати залежності в них.