МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ ЛЬВІВСЬКА ПОЛІТЕХНІКА
КУРСОВА РОБОТА
з дисципліни:
«Системне програмне забезпечення»
на тему:
«Утиліта збору та відображення інформації про процеси»
Львів – 2016
АНОТАЦІЯ
В курсовій роботі була розроблена утиліта збору та відображення інформації про процеси які виконуються в операційній системі.
Вона дозволяє переглядати задачі, які виконуються, а також процеси ОС.
Програма була розроблена за допомогою Visual Studio 2013 і працює на базі платформи .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.5. Розробка вузла перегляду задач…………………………………………..20
3.6 Розробка граф схеми алгоритму перегляду задач....……………………..20
4.Опис інтерфейсу та інструкції користувача. ……………………………...25
5. Тестування……………………………………………………………………..28
5.1 Виявлення помилок відображення процесівв…28
Висновок …………………………………………………………………………30
Список літератури……………………………………………………………….31
Додатки……………………………………………………………………………3
Додаток А. Лістинг програми2
Завдання на курсову роботу
Розробити програму моніторингу програм та процесів ОС Windows з наступними функціями:
Переглядати список виконуваних програм.
Переглядати список процесів.
Програма повинна використовувати стандартні бібліотеки класів платформи .NET і WinApi функції.
Вступ
У сучасній операційній системі одночасно виконуються код ядра (що належить до його різних підсистем) і код програм користувача. При цьому відбуваються різні дії: одні програми і підсистеми виконують інструкції процесора, інші зайняті введенням-виведенням, ще деякі очікують на запити від користувача або інших застосувань. Для спрощення керування цими діями в системі доцільно виділити набір елементарних активних елементів і визначити інтерфейс взаємодії ОС із цими елементами. Коли активний елемент системи зв'язати із програмою, що виконується, ми прийдемо до поняття процесу.
Під процесом розуміють абстракцію ОС, яка об'єднує все необхідне для виконання однієї програми в певний момент часу.
Програма — це деяка послідовність машинних команд, що зберігається на диску, в разі необхідності завантажується у пам'ять і виконується. Можна сказати, що під час виконання програму представляє процес.
Однозначна відповідність між програмою і процесом встановлюється тільки в конкретний момент часу: один процес у різний час може виконувати код декількох програм, код однієї програми можуть виконувати декілька процесів одночасно.
Для успішного виконання програми потрібні певні ресурси. До них належать:
• ресурси, необхідні для послідовного виконання програмного коду (передусім процесорний час);
• ресурси, що дають можливість зберігати інформацію, яка забезпечує виконання програмного коду (регістри процесора, оперативна пам'ять тощо).
Процесом називають сукупність одного або декількох потоків і захищеного адресного простору, у якому ці потоки виконуються.
На відміну від процесів потоки розпоряджаються загальною пам'яттю. Дані потоку не захищені від доступу до них інших потоків за умови, що всі вони виконуються в адресному просторі одного процесу. Це надає додаткові можливості для розробки застосувань, але ускладнює програмування.
Захищений адресний простір процесу задає абстракцію виконання коду на окремій машині, а потік забезпечує абстракцію послідовного виконання команд на одному виділеному процесорі.
Таку технологію називають відображенням, у пам'ять (memory mapping).
Огляд методів управління процесами Windows.
Протягом існування процесу його виконання може бути багаторазово перерване і продовжене. Для того, щоб відновити виконання процесу, необхідно відновити стан його операційного середовища. Стан операційного середовища відображається станом регістрів і програмного лічильника, режимом роботи процесора, покажчиками на відкриті файли, інформацією про незавершені операції введення-виведення, кодами помилок виконуваних даним процесом системних викликів і т.д. Ця інформація називається контекстом процесу.
Для того щоб ОС могла керувати процесами, вона повинна мати всю необхідну для цього інформацією. З цією метою на кожний процес заводиться дескриптор процесу.
Дескриптор - спеціальна інформаційна структура, яка заводиться на кожний процес (описувач завдання, блок управління завданням).
У загальному випадку дескриптор містить наступну інформацію:
Ідентифікатор процесу.
Тип (або клас) процесу, який визначає для супервізора деякі правила надання ресурсів.
Пріоритет процесу.
Зміну стану, яка визначає, в якому стані знаходиться процес (готовий до роботи, в стані виконання, очікування пристрої введення-виведення і т.д.)
Захищену область пам'яті (або адресу такої зони), в якій зберігаються поточні значення регістрів процесора, якщо процес переривається, не закінчивши роботи. Ця інформація називається контекстом завдання.
Інформацію про ресурси, якими володіє процес і / або має право користуватися (покажчики на відкриті файли, інформація про незавершені операції введення / виводу і т.п.).
Місце (або його адреса) для організації спілкування з іншими процесами.
Параметри часу запуску (момент часу, коли процес має активізуватися, і періодичність цієї процедури).
У разі відсутності системи управління файлами - адреса завдання на диску в її початковому стані і адреса на диску, куди вона вивантажується з оперативної пам'яті, якщо її витісняє інша.
Дескриптор процесу в порівнянні з контекстом містить більш оперативну інформацію, яка повинна бути легко доступна підсистемі планування процесів. Контекст процесу містить менш актуальну інформацію і використовується операційною системою тільки після того, як прийнято рішення про відновлення перерваного процесу.
Дескриптори, як правило, постійно розташовуються в оперативній пам'яті з метою прискорити роботу супервізора, який організовує їх у списки (черги) і відображає зміну стану процесу переміщенням відповідного описувача з одного списку в інший.
Для кожного стану (за винятком стану виконання для однопроцесорній системи) ОС веде відповідний список завдань, що знаходиться в цьому стані. Однак для стану очікування може бути не один список, а стільки, скільки різних видів ресурсів можуть викликати стан очікування.
Наприклад, станів очікування завершення операції введення / виведення може бути стільки, скільки пристроїв введення / виводу міститься в системі.
Процеси і потоки
Щоб підтримувати мультипрограмування, ОС повинна визначити і оформити для себе ті внутрішньо одиниці роботи, між якими буде поділятися процесор і інші ресурси комп'ютера. В даний час у більшості ОС визначені два типи одиниць роботи:
Процес (більш велика одиниця роботи).
Потік (нитка або тред) - більш дрібна одиниця роботи, яку вимагає для свого виконання процес.
Коли говорять про процеси, то тим самим хочуть відзначити, що ОС підтримує їх відособленість: у кожного процесу є своє віртуальний адресний простір, кожному процесу призначаються свої ресурси - файли, вікна та ін. Така відособленість потрібна для того, щоб захистити один процес від іншого , оскільки вони, спільно використовуючи всі ресурси обчислювальної системи, конкурують один з одним.
У загальному випадку процеси просто ніяк не пов'язані між собою і можуть належати навіть різним користувачам, що розділяють одну обчислювальну систему. Іншими словами, у разі процесів ОС вважає їх абсолютно незв'язаними і незалежними. При цьому саме ОС відповідає за конкуренцію між процесами щодо ресурсів.
Для підвищення швидкодії процесів є можливість задіяти внутрішній паралелізм у самих процесах.
Наприклад, деякі операції, що виконуються додатком, можуть вимагати для свого виконання досить тривалого використання ЦП. У цьому випадку при інтерактивній роботі з додатком користувач змушений довго чекати завершення замовленої операції і не може управляти додатком до тих пір, поки операція не виконається до самого кінця. Такі ситуації зустрічаються досить часто, наприклад, при обробці великих зображень в графічних редакторах. Якщо ж програмні модулі, які виконують такі тривалі операції, оформляти у вигляді самостійних «підпроцесів» (потоків), які будуть виконуватися паралельно з іншими «підпроцесами», то у користувача з'являється можливість паралельно виконувати декілька операцій в рамках однієї програми (процесу).
Можна виділити наступні відмінності потоків від процесів:
ОС для потоків не повинна організовувати повноцінну віртуальну машину.
Потоки не мають своїх власних ресурсів, вони розвиваються в тому ж віртуальному адресному просторі, можуть користуватися тими ж файлами, віртуальними пристроями та іншими ресурсами, що і даний процес.
Єдине, що потокам необхідно мати, - це процесорний ресурс. У однопроцесорній системі потоки поділяють між собою процесорний час так само, як це роблять звичайні процеси, а в багатопроцесорної системі можуть виконуватися одночасно, якщо не зустрічають конкуренції з-за звернення до інших ресурсів.
Загальний огляд диспетчерів задач
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.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.5. Розробка вузла перегляду задач.
Даний вузол повинен вибирати тільки ті процеси, які відображаються на панелі задач.
3.6 Розробка граф схеми алгоритму перегляду задач.
Рис. 8 Граф-схема алгоритму відображення списку задач
Блок 1- Початок роботи вузла
Блок 2 – Отримання всіх процесів
Блок 3 – Перевірка чи є ще процеси
Блок 4 – Перевірка чи заданий процес є задачею
Блок 5 – Відображення задачі
Блок 6 – Завершення роботи вузла.
Щоб перевірити чи вказаний процес є задачею використовується наступний параметр:
prc.MainWindowTitle != ""
4.Опис інтерфейсу та інструкції користувача.
Рис. 12 Головне вікно програми
В програмі присутні наступні функції:
Перегляд виконуваних програм.
Загальні відомості про ОС та користувача.
Отримання загальної кількості процесів.
Перегляд процесів
Отримання загальної кількості процесів.
Щоб отримати доступ до процесів в даній курсові роботі я використовую функції, які вже описані в C# - GetProcesses(), які повертають назву процесів.
5. Тестування
Відлагодження програми відбувається на основі спеціально створених тестів за допомогою автоматизованого відлагоджувача який присутній в середовищі Ms Visual Studio 2013, в покроковому режимі перевіряється значення потрібних змінних і вмістиме потрібних структур даних. За допомогою breakpoints відбувається запинка виконання програми в тих місцях де відбулася логічна помилка або в місцях визначених студентом.
5.1 Виявлення помилок відображення процесів, задач, сервісів і драйверів.
До помилок на цьому етапі відносяться помилки програмного коду, який супроводжується некоректним відображенням даних. Як видно з рисунку всі дані відображаються коректно:
Рис. 14 Вікно програми з коректно відображеними даними
5.2 Виявлення помилок створення нового процесу.
Висновок
Підчас створення програмного продукту я навчився навичкам роботи з процесами і їх керуванням.
На початкових стадіях розробки було проведено аналіз задачі проекту та розроблено граф схеми роботи програмного продукту. Наступні етапи проектування, використовуючи загальнотеоретичні положення сформульовані на ранніх стадіях синтезу, реалізовували проект на програмному рівні.
У курсовій роботі була розроблена утиліта відображення процесів, які виконуються в ОС. Також було проведене тестування всіх модулів, яке підтвердило, що весь код який міг призвести до помилок опрацьований і дозволяє працювати програмі коректно.
Під час виконання курсової роботи було успішно засвоєно методи розробки системних програм, а зокрема програми керування процесами і задачами.
Список літератури
В. Зиборов 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.Runtime.InteropServices;
using System.Diagnostics;
using System.Management;
namespace ShowProcess
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Tasks();
Procceses();
}
private void Tasks()
{
label1.Text = ("Назва комп’ютера: " + Environment.MachineName + "\nІм’я користувача: " + Environment.UserName +
"\nВерсія ОС: " + Environment.OSVersion);
Process[] allProc = Process.GetProcesses();
string[] paths = new string[allProc.Length];
int i = 0;
listView1.Items.Clear();
listView1.GridLines = false;
listView1.Columns.Add("Програма", 400);
listView1.Columns.Add("Статус", 100);
foreach (Process prc in allProc)
{
if (prc.MainWindowTitle != "")
{
ListViewItem lwi = new ListViewItem(new[] { prc.MainWindowTitle, "Запущений" });
listView1.Items.Add(lwi);
paths[i] = prc.StartInfo.UserName;
}
}
}
private void Procceses()
{
int i = 0;
Process[] allProc = Process.GetProcesses();
listView2.Items.Clear();
listView2.GridLines = false;
listView2.Columns.Add("Процес", 100);
listView2.Columns.Add("Користувач", 85);
listView2.Columns.Add("ЦП", 0);
listView2.Columns.Add("Пам'ять", 70);
listView2.Columns.Add("Коментар", 140);
ListViewItem lwi;
Process newPrc = new Process();
foreach (Process prc in allProc)
{
newPrc = SetUserName(prc);
try
{
lwi = new ListViewItem(new[] { newPrc.ProcessName, newPrc.StartInfo.UserName, "", (newPrc.WorkingSet64 / 1024).ToString() + " Кб", newPrc.MainModule.FileVersionInfo.FileDescription });
listView2.Items.Add(lwi);
i++;
}
catch { }
}
label2.Text = ("Кількість процесів: " + Convert.ToString((i)));
}
private Process SetUserName(Process proc)
{
ManagementObjectSearcher Processes = new ManagementObjectSearcher( "SELECT * FROM Win32_Process WHERE ProcessId = " + proc.Id.ToString());
foreach (ManagementObject process in Processes.Get())
{
string[] OwnerInfo = new string[2];
process.InvokeMethod("GetOwner", (object[])OwnerInfo);
proc.StartInfo.UserName = string.Format("{0}", OwnerInfo[0]);
}
return proc;
}
}
}