МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НУ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра ЕОМ
КУРСОВА РОБОТА
з предмету “ Системне програмне забезпечення ”
на тему:
“Диспетчер задач”
АНОТАЦІЯ
В курсовій роботі була розроблена програма «Диспетчер задач», вона дозволяє переглядати задачі, запустити нову задачу, переглядати список процесів, список сервісів Windows і список драйверів, а також виконувати операції завершення роботи в Windows. Також у вікні процесів програма дозволяє завершувати процеси і виводити про них інформацію.
Програма була розроблена за допомогою Visual Studio 2010 і працює на базі платформи .NET з використанням WinApi функцій.
ЗМІСТ
Завдання на курсову роботу ……………………………………………………4
Вступ………………………………………………………………………………5
1. Огляд методів управління процесами Windows.…………..…………….7
2. Загальний огляд диспетчерів задач………………………………………10
2.1. Диспетчер задач Windows…………………………………………………10
2.2 Process Explorer...…………………………………………………………...12
2.3 Process Lasso………………………………………………………………...13
2.4 RAM Saver Pro………………………………………………………………14
3. Розробка диспетчера завдань …………………………………………….15
3.1. Розробка вузла перегляду процесів………………………………………16
3.2 Розробка граф схеми алгоритму вузла перегляду процесів………………16
3.3. Розробка вузла перегляду сервісів………………………………………..18
3.4 Розробка граф схеми алгоритму вузла перегляду сервісів………………..18
3.5. Розробка вузла перегляду задач…………………………………………..20
3.6 Розробка граф схеми алгоритму перегляду задач....……………………..20
3.7. Розробка вузла відображення драйверів………………………………...21
3.8 Розробка граф схеми алгоритму вузла перегляду драйверів……………..21
3.9. Розробка вузла запуску нового процесу…………………………………23
3.10 Розробка граф схеми алгоритму вузла запуску нового процесу …………23
3.11. Розробка вузла видалення процесу………………………………………..24
3.12 Розробка граф схеми алгоритму вузла “Видалення процесу”……………24
4.Опис інтерфейсу та інструкції користувача. ……………………………...25
5. Тестування……………………………………………………………………..28
5.1 Виявлення помилок відображення процесів, задач, сервісів і драйверів…28
5.2 Виявлення помилок створення нового процесу…………………………….29
5.3. Виявлення помилок видалення нового процесу……………………………29
Висновок …………………………………………………………………………30
Список літератури……………………………………………………………….31
Додатки……………………………………………………………………………32
Завдання на курсову роботу
Розробити програму моніторингу процесів, служб, драйверів Windows з наступними функціями:
Переглядати список задач
Переглядати список процесів
Запускати новий процес
Зупиняти запущений
Виводити список сервісів
Виводити список драйверів
Програма повинна використовувати стандартні бібліотеки класів платформи .NET і WinApi функції.
Вступ
У сучасній операційній системі одночасно виконуються код ядра (що належить до його різних підсистем) і код програм користувача. При цьому відбуваються різні дії: одні програми і підсистеми виконують інструкції процесора, інші зайняті введенням-виведенням, ще деякі очікують на запити від користувача або інших застосувань. Для спрощення керування цими діями в системі доцільно виділити набір елементарних активних елементів і визначити інтерфейс взаємодії ОС із цими елементами. Коли активний елемент системи зв'язати із програмою, що виконується, ми прийдемо до поняття процесу.
Під процесом розуміють абстракцію ОС, яка об'єднує все необхідне для виконання однієї програми в певний момент часу.
Програма — це деяка послідовність машинних команд, що зберігається на диску, в разі необхідності завантажується у пам'ять і виконується. Можна сказати, що під час виконання програму представляє процес.
Однозначна відповідність між програмою і процесом встановлюється тільки в конкретний момент часу: один процес у різний час може виконувати код декількох програм, код однієї програми можуть виконувати декілька процесів одночасно.
Для успішного виконання програми потрібні певні ресурси. До них належать:
• ресурси, необхідні для послідовного виконання програмного коду (передусім процесорний час);
• ресурси, що дають можливість зберігати інформацію, яка забезпечує виконання програмного коду (регістри процесора, оперативна пам'ять тощо).
Процесом називають сукупність одного або декількох потоків і захищеного адресного простору, у якому ці потоки виконуються.
На відміну від процесів потоки розпоряджаються загальною пам'яттю. Дані потоку не захищені від доступу до них інших потоків за умови, що всі вони виконуються в адресному просторі одного процесу. Це надає додаткові можливості для розробки застосувань, але ускладнює програмування.
Захищений адресний простір процесу задає абстракцію виконання коду на окремій машині, а потік забезпечує абстракцію послідовного виконання команд на одному виділеному процесорі.
Таку технологію називають відображенням, у пам'ять (memory mapping).
Огляд методів управління процесами Windows.
Протягом існування процесу його виконання може бути багаторазово перерване і продовжене. Для того, щоб відновити виконання процесу, необхідно відновити стан його операційного середовища. Стан операційного середовища відображається станом регістрів і програмного лічильника, режимом роботи процесора, покажчиками на відкриті файли, інформацією про незавершені операції введення-виведення, кодами помилок виконуваних даним процесом системних викликів і т.д. Ця інформація називається контекстом процесу.
Для того щоб ОС могла керувати процесами, вона повинна мати всю необхідну для цього інформацією. З цією метою на кожний процес заводиться дескриптор процесу.
Дескриптор - спеціальна інформаційна структура, яка заводиться на кожний процес (описувач завдання, блок управління завданням).
У загальному випадку дескриптор містить наступну інформацію:
Ідентифікатор процесу.
Тип (або клас) процесу, який визначає для супервізора деякі правила надання ресурсів.
Пріоритет процесу.
Зміну стану, яка визначає, в якому стані знаходиться процес (готовий до роботи, в стані виконання, очікування пристрої введення-виведення і т.д.)
Захищену область пам'яті (або адресу такої зони), в якій зберігаються поточні значення регістрів процесора, якщо процес переривається, не закінчивши роботи. Ця інформація називається контекстом завдання.
Інформацію про ресурси, якими володіє процес і / або має право користуватися (покажчики на відкриті файли, інформація про незавершені операції введення / виводу і т.п.).
Місце (або його адреса) для організації спілкування з іншими процесами.
Параметри часу запуску (момент часу, коли процес має активізуватися, і періодичність цієї процедури).
У разі відсутності системи управління файлами - адреса завдання на диску в її початковому стані і адреса на диску, куди вона вивантажується з оперативної пам'яті, якщо її витісняє інша.
Дескриптор процесу в порівнянні з контекстом містить більш оперативну інформацію, яка повинна бути легко доступна підсистемі планування процесів. Контекст процесу містить менш актуальну інформацію і використовується операційною системою тільки після того, як прийнято рішення про відновлення перерваного процесу.
Дескриптори, як правило, постійно розташовуються в оперативній пам'яті з метою прискорити роботу супервізора, який організовує їх у списки (черги) і відображає зміну стану процесу переміщенням відповідного описувача з одного списку в інший.
Для кожного стану (за винятком стану виконання для однопроцесорній системи) ОС веде відповідний список завдань, що знаходиться в цьому стані. Однак для стану очікування може бути не один список, а стільки, скільки різних видів ресурсів можуть викликати стан очікування.
Наприклад, станів очікування завершення операції введення / виведення може бути стільки, скільки пристроїв введення / виводу міститься в системі.
Процеси і потоки
Щоб підтримувати мультипрограмування, ОС повинна визначити і оформити для себе ті внутрішньо одиниці роботи, між якими буде поділятися процесор і інші ресурси комп'ютера. В даний час у більшості ОС визначені два типи одиниць роботи:
Процес (більш велика одиниця роботи).
Потік (нитка або тред) - більш дрібна одиниця роботи, яку вимагає для свого виконання процес.
Коли говорять про процеси, то тим самим хочуть відзначити, що ОС підтримує їх відособленість: у кожного процесу є своє віртуальний адресний простір, кожному процесу призначаються свої ресурси - файли, вікна та ін. Така відособленість потрібна для того, щоб захистити один процес від іншого , оскільки вони, спільно використовуючи всі ресурси обчислювальної системи, конкурують один з одним.
У загальному випадку процеси просто ніяк не пов'язані між собою і можуть належати навіть різним користувачам, що розділяють одну обчислювальну систему. Іншими словами, у разі процесів ОС вважає їх абсолютно незв'язаними і незалежними. При цьому саме ОС відповідає за конкуренцію між процесами щодо ресурсів.
Для підвищення швидкодії процесів є можливість задіяти внутрішній паралелізм у самих процесах.
Наприклад, деякі операції, що виконуються додатком, можуть вимагати для свого виконання досить тривалого використання ЦП. У цьому випадку при інтерактивній роботі з додатком користувач змушений довго чекати завершення замовленої операції і не може управляти додатком до тих пір, поки операція не виконається до самого кінця. Такі ситуації зустрічаються досить часто, наприклад, при обробці великих зображень в графічних редакторах. Якщо ж програмні модулі, які виконують такі тривалі операції, оформляти у вигляді самостійних «підпроцесів» (потоків), які будуть виконуватися паралельно з іншими «підпроцесами», то у користувача з'являється можливість паралельно виконувати декілька операцій в рамках однієї програми (процесу).
Можна виділити наступні відмінності потоків від процесів:
ОС для потоків не повинна організовувати повноцінну віртуальну машину.
Потоки не мають своїх власних ресурсів, вони розвиваються в тому ж віртуальному адресному просторі, можуть користуватися тими ж файлами, віртуальними пристроями та іншими ресурсами, що і даний процес.
Єдине, що потокам необхідно мати, - це процесорний ресурс. У однопроцесорній системі потоки поділяють між собою процесорний час так само, як це роблять звичайні процеси, а в багатопроцесорної системі можуть виконуватися одночасно, якщо не зустрічають конкуренції з-за звернення до інших ресурсів.
2. Загальний огляд диспетчерів задач
2.1. Диспетчер задач Windows
Диспетчер завдань в операційних системах сімейства Microsoft Windows - утиліта для виводу на екран списку запущених процесів і споживаних ними ресурсів (зокрема статус, процесорний час і споживана оперативна пам'ять). Також є можливість деякої маніпуляції процесами.
Windows Task Manager в Windows NT можна викликати, одночасно натиснувши клавіші Ctrl+Shift+Esc. У Windows NT і в Windows XP існує відоміша комбінація клавіш - Ctrl+Alt+Del. Диспетчер завдань можна також запустити в командному рядку, ввівши ім'я його виконуваного файлу (taskmgr.exe) або вибравши відповідний пункт в контекстному меню панелі завдань.
Рис. 1 Вікно диспетчера задач Windows
Диспетчер завдань - вбудована в операційну систему утиліта. Вона містить вкладки:
Додатки. Дозволяє перемкнутися в потрібне застосування, або завершити його.
Процеси. Різноманітні дані про усі запущені в системі процеси, можна завершувати, міняти пріоритет, задавати відповідність процесорам (у багатопроцесорних системах)
Служби (починаючи з Vista). Відомості про усі служби Windows.
Швидкодія. Графіки завантаження процесора (процесорів), використання оперативної пам'яті.
Мережа (відсутній у разі відсутності активних мережевих підключень). Графіки завантаження мережевих підключень.
Користувачі (тільки у режимі адміністратора). Маніпулювання активними користувачами.
Рис. 2 Вкладка «Швидкодія» диспетчера задач Windows
2.2 Process Explorer
Розробник: Sysinternals
Один з найбільш відомих аналогів Диспетчера завдань. Process Explorer в режимі реального часу проводить постійний моніторинг всіх запущених в системі процесів. Для кожного процесу програма відображає докладну інформацію:
- Використання пам'яті;
- Відсоток завантаження процесора;
- Власник процесу;
- Родинні відносини між процесами у вигляді дерева;
- Список бібліотек, використовуваних обраним процесом;
- Використовувані протоколи TCP / IP;
- Розташування виконуваного файлу.
Крім того, Process Explorer дозволяє закривати процеси, встановлювати їх пріоритет, а також шукати DLL, використовувані процесами.
Рис. 3 Вікно програми Process Explorer
2.3 Process Lasso
Розробник: Bitsum Technologies
Основним завданням цієї програми є автоматичний розподіл циклів центрального процесора. Завдяки цьому поліпшується реактивність операційної системи при сильному завантаженні CPU. Process Lasso може звільняти ресурси для процесів за рахунок зниження пріоритетів процесів, яким потрібно багато циклів.
Програма дозволяє:
- Встановлюватися пріоритети;
- Відображати активні і взагалі всі процеси;
- Показувати завантаження процесора і кількість потоків;
- Встановлювати максимальну кількість копій процесу в системі;
- Завершувати процеси;
- Створювати правила персонально для кожної програми;
- Вести балки протоколювання всіх виконуваних процесів.
Рис. 4 Вікно програми Process Lasso
2.4 RAM Saver Pro
Розробник: WinTools Software Engineering
Інструмент для оптимізації оперативної пам'яті, а також її очищення та моніторингу. RAM Saver Pro може звільняти оперативну пам'ять для додатків. Програма веде статистику використання пам'яті, причому може відображати її як в числовому, так і в графічному вигляді. Відзначимо і функцію тестування пам'яті, запобігання витоку пам'яті в погано оптимізованих додатках, дефрагментацію системної пам'яті для швидкого доступу до неї, приміщення невикористовуваних бібліотек і драйверів в swap-файл для звільнення пам'яті, примусова очищення буфера обміну і багато інших корисних.
У плані роботи з процесами RAM Saver Pro не представляє великих можливостей - лише відображення імен процесів, шляхів до виконуваних файлів і розміру використовуваної пам'яті. І ще можливість завершення процесу.
Рис. 5 Вікно програми RAM Saver Pro
3. Розробка диспетчера завдань
Дана програма має такі основні функціональні вузли:
- Перегляд усіх процесів.
- Перегляд Задач.
- Перегляд Сервісів
- Перегляд драйверів системи
- Запуск нового процесу на виконання.
- Видалення процесу.
Вузол «Процеси» звертається до системи, отримує список всіх процесів, а також визначає процесорний час і пам’ять, які займає процес, а також користувача з якого запущений процес.
Вузол «Додатки» з списку процесів вибирає ті процеси, які відображаються на панелі задач.
Вузол «Сервіси» звертається до системи, отримує список всіх сервісів і їх опис.
Вузол «Драйвери» звертається до системи і отримує список всіх драйверів і визначає їх тип.
Вузол “Запуск нового процесу на виконання”– запускає процес отримавши адрес до виконуваного файлу.
Вузол “Видалення процесу” – видаляє процес, шляхом видалення вказівника на об’єкт процесу.
3.1. Розробка вузла перегляду процесів.
Вибір всіх процесів передбачає звернення до системи Windows за допомогою стандартних класів платформи .NET і отримання списку всіх процесів, а також даних про процесорний час і використання пам’яті.
3.2 Розробка граф схеми алгоритму вузла перегляду процесів.
Особливостями даного алгоритму є методика обчислення процесорного часу.
Рис 6. Граф-схема вузла перегляду процесів
Блок 1 – Початок роботи вузла
Блок 2 – Отримання всіх процесів.
Блок 3 – Перевірка чи в масиві ще є процеси.
Блок 4 – Обчислення часу процесора, який використовує даний процес.
Блок 5 – Отримання значення пам’яті, яку займає даний процес.
Блок 6 – Отримання користувача, від якого запущений процес.
Блок 7 – Відображення зібраних даних для користувача.
Блок 8 – Завершення роботи вузла.
Для того щоб отримати список всіх процесів використовується функція стандартного класу .NET
Process[] proc = Process.GetProcesses();
Процесорний час обчислюється за допомогою наступних конструкцій:
TimeSpan ts = pc.TotalProcessorTime;
long pt = ts.Subtract(_TotalProcessSpan[pc.Id.ToString()]).Ticks;
long c = pt / (timer1.Interval * 100);
total += c;
_TotalProcessSpan[pc.Id.ToString()] = ts;
Пам’ять, яку займає процес отримується з властивості WorkingSet64
Користувач від якого був запущений процес визначається за допомогою функції:
InvokeMethod("GetOwner", ob)
3.3. Розробка вузла перегляду сервісів.
Вибір всіх сервісів передбачає звернення до системи Windows за допомогою стандартних класів платформи .NET і отримання списку всіх сервісів.
3.4 Розробка граф схеми алгоритму вузла перегляду сервісів.
Рис. 7 Граф-схема алгоритму відображення списку сервісів
Блок 1 – Початок роботи вузла
Блок 2 – Отримання всіх сервісів.
Блок 3 – Перевірка чи в масиві ще є сервіси.
Блок 4 – Отримання назви сервісу.
Блок 5 – Отримання опису сервісу.
Блок 6 – Отримання шляху виконуваного файлу сервісу.
Блок 7 – Відображення зібраних даних для користувача.
Блок 8 – Завершення роботи вузла.
Для отримання списку всіх сервісів використовується запит WMI
ManagementObject mo = new ManagementObject("Win32_Service.Name='" + svc.ServiceName + "'");
mo.Get();
Для отримання інших даних використовуються наступні параметри:
mo["StartName"]
mo["Description"]
mo["PathName"]
3.5. Розробка вузла перегляду задач.
Даний вузол повинен вибирати тільки ті процеси, які відображаються на панелі задач.
3.6 Розробка граф схеми алгоритму перегляду задач.
Рис. 8 Граф-схема алгоритму відображення списку задач
Блок 1- Початок роботи вузла
Блок 2 – Отримання всіх процесів
Блок 3 – Перевірка чи є ще процеси
Блок 4 – Перевірка чи заданий процес є задачею
Блок 5 – Відображення задачі
Блок 6 – Завершення роботи вузла.
Щоб перевірити чи вказаний процес є задачею використовується наступний параметр:
prc.MainWindowTitle != ""
3.7. Розробка вузла відображення драйверів.
Вибір всіх драйверів передбачає звернення до системи Windows за допомогою стандартних класів платформи .NET і отримання списку всіх драйверів.
3.8 Розробка граф схеми алгоритму вузла перегляду драйверів.
Рис. 9 Граф-схема алгоритму відображення списку драйверів
Блок 1 – Початок роботи вузла
Блок 2 – Отримання всіх драйверів.
Блок 3 – Перевірка чи в масиві ще є драйвер.
Блок 4 – Отримання назви драйвера.
Блок 5 – Отримання типу драйвера.
Блок 6 – Отримання статусу драйвера.
Блок 7 – Відображення зібраних даних для користувача.
Блок 8 – Завершення роботи вузла.
Щоб отримати список всіх драйверів використовується:
ServiceController[] devices = ServiceController.GetDevices();
Щоб отримати інші дані використовується наступний код:
svc.DisplayName
case ServiceType.Adapter: lv.SubItems.Add("Сервіс пристрою."); numAdapter++; break;
case ServiceType.FileSystemDriver: lv.SubItems.Add("Драйвер файлової системи, ядра пристрою."); numFileSystem++; break;
case ServiceType.InteractiveProcess: lv.SubItems.Add("Сервіс, може взаємодіяти з Робочим столом."); numRecognizer++; break;
case ServiceType.KernelDriver: lv.SubItems.Add("Драйвер ядра пристрою."); numKernel++; break;
case ServiceType.RecognizerDriver: lv.SubItems.Add("Драйвер файлової системи. Визначає системні файли."); break;
case ServiceType.Win32OwnProcess: lv.SubItems.Add("Програма Win32, містить одну логічну службу."); break;
case ServiceType.Win32ShareProcess: lv.SubItems.Add("Програма Win32, містить декілька логічних служб."); break;
case ServiceControllerStatus.Running: lv.SubItems.Add("Працює"); break;
case ServiceControllerStatus.Stopped: lv.SubItems.Add("Зупинений"); break;
3.9. Розробка вузла запуску нового процесу
Даний вузол повинен надавати можливість запуску нового процесу шляхом вибору виконуваного файлу і передачу параметрів для запуску.
3.10 Розробка граф схеми алгоритму вузла запуску нового процесу
Рис. 10 Граф-схема алгоритму створення нового процесу
Блок 1 – Початок роботи вузла “запуск нової задачі”.
Блок 2 – Отримання шляху до виконавчого файлу .
Блок 3 – Завантаження процеса в пам'ять.
Блок 4 – Виконання процеса.
Блок 5 – Завершення процесу додавання нової задачі.
Щоб запустити новий процес використовується наступна функція:
try
{
prog = textBox1.Text.Remove(textBox1.Text.IndexOf(" "));
arg = textBox1.Text.Remove(0, textBox1.Text.IndexOf(" "));
}
catch {
prog = textBox1.Text;
}
Process.Start(prog, arg);
3.11. Розробка вузла видалення процесу.
Даний вузол повинен забезпечити вибір процесу, який потрібно видалити. Отримати доступ до процесу, через його ідентифікатор. Видалити процес з пам’яті.
3.12 Розробка граф схеми алгоритму вузла “Видалення процесу”.
Рис. 11 Граф-схема алгоритму закриття процесу
Блок 1- Початок вузла “Видалення процеса”.
Блок 2 – Отримання доступу до пам’яті
Блок 3 – Доступ до відповідного процеса
Блок 4 – Видалення процеса
Блок 5 – Видалення процеса з списку відображення
Блок 6 – Завершення роботи вузла видалення.
Щоб видалити процес потрібно використати наступний блок коду:
int i = listView1.SelectedIndices[0];
string id = listView1.Items[i].Name;
Process prc = Process.GetProcessById(Convert.ToInt32(id));
prc.Kill();
ProcessListRemove(Process.GetProcesses());
4.Опис інтерфейсу та інструкції користувача.
Програма «Диспетчер задач» можна запустити з виконавчого файлу Procservwin.exe.
Рис. 12 Головне вікно програми
В редакторі присутні наступні функції:
Отримання доступу до процесів, сервісів і служб
Запустити нову програму
Видалити процес
Переглянути список процесів,додатків,служб і драйверів
Перейти до процесу
Щоб отримати доступ до процесів, сервісів і служб в даній курсові роботі я використовую функції, які вже описані в C# - GetProcesses(), GetServices(), GetDevices(), які повертають назву процесів, назву сервісів і назву драйверів
відповідно .
Дане вікно містить 4 вкладки, для відображення основної інформаці:
Вкладка Додатки
Процеси
Сервіси
Драйвери
На вкладці «Додатки» знаходяться дві функціональні кнопки:
Добавити
Перейти
Щоб додати нову програму потрібно, натиснути кнопку “Добавити”
Рис. 13. Вікно запуску нового процесу
Це реалізовано шляхом передачі адреси виконавчого файлу в відповідне поле:
private void button2_Click(object sender, EventArgs e)
{
Process.Start(textBox1.Text);
Form2.ActiveForm.Close();
}
Щоб переглянути зв'язок між задачами і процесами потрібно виділити потрібну задачу зі списку задач і натиснути кнопку “перейти”.Це виконано шляхом отримання списку задач і використання додаткової змінної title, яка приймає значення назви задачі з списку задач і порівнюючи цю змінну з MainWindowTitle яка отримує назву задач, які відповідають процесам з списку процесів.
Це реалізовано наступним кодом
Process[] processes = Process.GetProcesses();
Process temp_prc = processes[0];
foreach (Process prc in processes)
{
if (prc.MainWindowTitle == title)
{
temp_prc = prc
break;
}
}
for (int j = 0; j < listView1.Items.Count; j++)
{
if (temp_prc.ProcessName == listView1.Items[j].SubItems[0].Text)
{
listView1.Items[j].Selected = true;
break;
}
}
5. Тестування
Відлагодження програми відбувається на основі спеціально створених тестів за допомогою автоматизованого відлагоджувача який присутній в середовищі Ms Visual Studio 2010, в покроковому режимі перевіряється значення потрібних змінних і вмістиме потрібних структур даних. За допомогою breakpoints відбувається запинка виконання програми в тих місцях де відбулася логічна помилка або в місцях визначених студентом.
5.1 Виявлення помилок відображення процесів, задач, сервісів і драйверів.
До помилок на цьому етапі відносяться помилки програмного коду, який супроводжується некоректним відображенням даних. Як видно з рисунку всі дані відображаються коректно:
Рис. 14 Вікно програми з коректно відображеними даними
5.2 Виявлення помилок створення нового процесу.
До помилок на цьому етапі відносяться помилки неправильного введення імені виконуваного файлу. Така ситуація виявляється і видається відповідне повідомлення і програма продовжує коректно працювати.
Рис. 15 Вікно попередження про помилку
5.3. Виявлення помилок видалення нового процесу
До помилок на цьому етапі відносяться помилки вибору відповідного процесу. На цьому етапі особливих помилок не було виявлено, все працює коректно.
Висновок
Підчас створення програмного продукту я навчився навичкам роботи з процесами і їх керуванням.
На початкових стадіях розробки було проведено аналіз задачі проекту та розроблено граф схеми роботи програмного продукту. Наступні етапи проектування, використовуючи загальнотеоретичні положення сформульовані на ранніх стадіях синтезу, реалізовували проект на програмному рівні.
У курсовій роботі був розроблений «Диспетчер задач» з можливістю роботи з процесами, задачами, службами і драйверами операційної системи Windows. Також було проведене тестування всіх модулів, яке підтвердило, що весь код який міг призвести до помилок опрацьований і дозволяє працювати програмі коректно.
Під час виконання курсової роботи було успішно засвоєно методи розробки системних програм, а зокрема програми керування процесами і задачами.
Список літератури
В. Зиборов Visual C# 2010 на примерах
Системное программное обеспечение / А.В.Гордеев, А.Ю.Молчанов.
Э. Троелсен Язык программирования C# 2010 и платформа .NET 4.0
Колисниченко Секреты, настройка и оптимизация реестра Windows 7
Дж.Донован. Системное программирование.
Додатки
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
using System.Management;
using System.ServiceProcess;
using System.Runtime.InteropServices;
namespace Procservwin
{
internal sealed partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//====================================
private bool TICK;
private Dictionary<string, string> _FilePath = new Dictionary<string, string>();
private Dictionary<string, TimeSpan> _TotalProcessSpan = new Dictionary<string, TimeSpan>();
private Dictionary<string, string> _FileDescription = new Dictionary<string, string>();
private Dictionary<string, string> _ServicesDescription = new Dictionary<string, string>();
#region
//методи для драйверів
private void DeviceListAdd()
{
int numAdapter = 0;
int numFileSystem = 0;
int numKernel = 0;
int numRecognizer = 0;
listView3.Items.Clear();
ServiceController[] devices = ServiceController.GetDevices();
foreach (ServiceController svc in devices)
{
ListViewItem lv = new ListViewItem(svc.DisplayName);
switch (svc.ServiceType)
{
case ServiceType.Adapter: lv.SubItems.Add("Сервіс пристрою."); numAdapter++; break;
case ServiceType.FileSystemDriver: lv.SubItems.Add("Драйвер файлової системи, ядра пристрою."); numFileSystem++; break;
case ServiceType.InteractiveProcess: lv.SubItems.Add("Сервіс, може взаємодіяти з Робочим столом."); numRecognizer++; break;
case ServiceType.KernelDriver: lv.SubItems.Add("Драйвер ядра пристрою."); numKernel++; break;
case ServiceType.RecognizerDriver: lv.SubItems.Add("Драйвер файлової системи. Визначає системні файли."); break;
case ServiceType.Win32OwnProcess: lv.SubItems.Add("Програма Win32, містить одну логічну службу."); break;
case ServiceType.Win32ShareProcess: lv.SubItems.Add("Програма Win32, містить декілька логічних служб."); break;
}
switch (svc.Status)
{
case ServiceControllerStatus.Running: lv.SubItems.Add("Працює"); break;
case ServiceControllerStatus.Stopped: lv.SubItems.Add("Зупинений"); break;
default: lv.SubItems.Add("Проміжний стан"); break;
}
listView3.Items.Add(lv);
svc.Close();
}
toolStripStatusLabel7.Text = string.Format("Драйверів всього : Апаратних {0} | Файлових {1} | Інтерактивних {2} | Ядра пристрою {3}", numAdapter, numFileSystem, numRecognizer, numKernel);
}
#endregion
#region
//метод для сервісів
private void ServiceListReset()
{
_ServicesDescription.Clear();
listView2.Items.Clear();
toolStripStatusLabel6.Text = "Список сервісів";
}
private void ServiceListAdd(ServiceController[] services, ServiceControllerStatus status, bool all)
{
foreach (ServiceController svc in services)
{
if (svc.Status == status || all)
{
if (!listView2.Items.ContainsKey(svc.ServiceName))
{
ListViewItem lv = new ListViewItem(svc.ServiceName);
lv.Name = svc.ServiceName;
lv.SubItems.Add(svc.DisplayName);
ManagementObject mo = new ManagementObject("Win32_Service.Name='" + svc.ServiceName + "'");
mo.Get();
lv.SubItems.Add(mo["StartName"].ToString());
if (!_ServicesDescription.ContainsKey(svc.ServiceName))
{
string desc = mo["Description"] as string;
if (desc != null)
_ServicesDescription.Add(svc.ServiceName, desc);
}
string pathName = mo["PathName"] as string;
lv.SubItems.Add(pathName != null ? pathName : string.Empty);
listView2.Items.Add(lv);
}
}
if (all)
svc.Close();
}
}
private void ServiceListRemove(ServiceController[] svc, ServiceControllerStatus status, bool all)
{
List<string> tsv = new List<string>();
foreach (ServiceController sv in svc)
{
if (sv.Status == status || all)
tsv.Add(sv.ServiceName);
sv.Close();
}
if (tsv.Count == listView2.Items.Count) return;
List<string> tlv = new List<string>();
foreach (ListViewItem lv in listView2.Items)
if (!tsv.Contains(lv.Name))
tlv.Add(lv.Name);
foreach (string s in tlv)
{
listView2.Items.RemoveByKey(s);
if (_ServicesDescription.ContainsKey(s))
_ServicesDescription.Remove(s);
}
}
#endregion
#region
//методи для процесів
private void ProcListReset()
{
_FileDescription.Clear();
_FilePath.Clear();
_TotalProcessSpan.Clear();
listView1.Items.Clear();
toolStripStatusLabel1.Text = "Процесів : ";
toolStripStatusLabel2.Text = "Завантаження ЦП : ";
toolStripStatusLabel3.Text = "Дескрипторів : ";
toolStripStatusLabel4.Text = "Потоків : ";
toolStripStatusLabel5.Text = "Пам'ять : ";
}
//список завдань
private void Tasks()
{
Process[] allProc = Process.GetProcesses();
listView4.Items.Clear();
foreach (Process prc in allProc) //отримання завдань
{
if (prc.MainWindowTitle != "")
{
ListViewItem lwi = new ListViewItem(new[] { prc.MainWindowTitle, "Запущений" });
listView4.Items.Add(lwi);
}
}
}
//добавити процес в список процесів
private void ProcessListAdd(Process[] proc)
{
Dictionary<string, string> duser = new Dictionary<string, string>();
ManagementClass mcp = new ManagementClass("Win32_Process");
object[] ob = new object[2];
try
{
foreach (ManagementObject mo in mcp.GetInstances())
{
mo.InvokeMethod("GetOwner", ob);
string vuser = ob[0] as string;
if (vuser != null)
duser.Add(mo["ProcessId"].ToString(), vuser);
}
}
catch { }
foreach (Process pc in proc)
{
try
{
pc.Refresh();
if (!listView1.Items.ContainsKey(pc.Id.ToString()))
{
string id = null;
string pname = null;
string user = null;
try
{
id = pc.Id.ToString();
pname = pc.ProcessName;
if (duser.ContainsKey(id))
user = duser[id];
if (!_FilePath.ContainsKey(id))
{
_FilePath.Add(id, pc.MainModule.FileName);
pc.MainModule.Dispose();
}
}
catch (System.ComponentModel.Win32Exception) { }