Процеси та потоки

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

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

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

Рік:
2013
Тип роботи:
Лабораторна робота
Предмет:
Системне програмне забезпечення

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

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ Національний університет «Львівська політехніка» Кафедра «Електронні обчислювальні машини»  Лабораторна робота № 1 З дисципліни: «Системне програмне забезпечення» Тема: «Процеси та потоки» Тема: «Процеси та потоки» Мета: Засвоїти поняття «процесів» та «потоків» як основних компонентів сучасних операційних систем. Здобути навики створення, керування та знищення «процесів» та «потоків» в операційній системі Windows. Теоретична частина: В ОС Windows XP реалізована пріоритетна (витісняюча) багатозадачність. Це означає, що ОС може тимчасово припинити виконання однієї програми і перемкнути процесор на виконання іншої. Перемикання відбувається незалежно від бажання кожної з програм, завдяки чому зависання однієї програми не приводить до зависання всієї системи. Щоб процес що-небудь виконав, в ньому потрібно створити потік. Потік (thread) описує послідовність виконання коду усередині процесу. Первинний потік процесу створюється системою автоматично під час створення процесу. Саме він відповідає за виконання коду ехе-файлу, поміщеного в адресний простір процесу. Потоку в системі зіставляється об’єкт ядра “потік”, що використовується для управління потоком. Відповідно, цьому об’єкту також виділяється в системі блок пам’яті, ініціалізований деякою управляючою інформацією, лічильником числа користувачів і дескриптор. У принципі, один процес може містити декілька потоків, і тоді вони “одночасно” виконують код в адресному просторі процесу. Це можливо тому що ОС розподіляє процесорний час не між процесами, а між потоками ОС Windows підтримує 4 класи пріоритетів процесів: idle (простоюючий), normal (нормальний), high (високий) і realtime (реального часу). Програми, що запускаються користувачем, у загальному відносяться до додатків з класом пріоритету normal. Простіше всього для створення нового процесу використовувати виклик WinExec(). При зверненні до цього виклику необхідно повідомити ім’я програми (повний шлях до ехе-файлу) і спосіб відображення вікна програми. Функція визначається таким чином: int WinExec (const char* CmdLine, unsigned int CmdShow) Для того, щоб мати нагоду управляти створеним процесом в додатку слід використовувати виклик CreateProcess(). Функція була визначена таким чином: Коли в додатку викликається CreateProcess(), система створює об’єкт ядра "процес" з початковим значенням лічильника числа BOOL GetExitCodeProcess (HANDLE hProcess, DWORD ExitCode) Функція TerminateProcess() дозволяє завершити будь-який процес. Вона була визначена таким чином: BOOL TerminateProcess (HANDLE hProcess, UINT fuExitCode). Щоб мати нагоду використовувати перераховані функції управління процесом, необхідний відповідний рівень доступу до дескриптора процесу. Цей рівень доступу можна отримати застосувавши функцію OpenProcess(). Ця функція використовується також отримання дескриптора вже створеного процесу по відомому ідентифікатору. Функція визначена таким чином: HANDLE OpenProcess (DWORD dwFlag, DWORD dwProcessId). Якщо ви для розробки своїх програм використовуєте С++, то для використовування стандартною функцією створення потоку в модуль треба додати директиву препроцесора # include <process.h>. Бібліотечна функція створення потоку була визначена таким чином: unsigned long beginthreadex(void *security, unsigned stack_side unsigned (*start_address)(void*), void* arglist, unsigned initflag, unsigned *thrdaddr). Виконання потоку можна припинити і знову відновити. Це може бути потрібно у випадку, якщо первинний потік виконує деякі процедури ініціалізацій глобальних змінних, що використовуються в обох потоках. Припинити виконання потоку можна при його створінні, використовуючи прапор CREATE_SUSPENDED, про що вже згадувалося, або використовуючи функцію SuspendThread(). Функція визначена таким чином: DWORD SuspendThread (HANDLE hThread). Параметр hThread містить дескриптор потоку, чиє виконання треба припинити. У випадку, якщо виклик невдалий, функція повертає 0xFFFFFFFF. Продовжити виконання потоку можна використовуючи функцію ResumeThread(). Функція визначена таким чином: DWORD ResumeThread (HANDLE hThread). Для завершення потоку використовуються виклики _endthreadex() або TerminateThread(). Функція _endthreadex() викликається зсередини потоку, який треба завершити. Вона визначена таким чином: _endthreadex(unsigned int). Ніяких значень функція не повертає, а як параметр передається нуль. Функція TerminateThread() дозволяє завершити будь-який потік. Вона визначена таким чином: BOOL TerminateThread (HANDLE hThread, UINT fuExitCode). Завдання: Варіант – 4 2. Написати функцію потоку, яка як вхідний параметр приймає дескриптор відкритого текстового файлу. Функція повинна здійснювати посимвольне виведення у файл номер процесу, номер потоку та системний час. Передбачити достатню кількість ітерації запису в файл з одної функції потоку. Відкриття файлу слід виконувати до створення потоку, використовуючи функцію FileOpen(), а після завершення роботи з файлом слід викликати функцію FileClose(). 3. Щоб продемонструвати паралельне виконання створеного потоку з первинним потоком процесу, в цикл запису з файлу потрібно додати виклик Sleep(Num), де Num – час в мілісекундах, на яке слід призупинити виконання потоку. Затримку також можна організувати за допомогою лічильника до якогось досить великого числа. 4. Проаналізувати вміст файлу після завершення програми та порівняти записи при активному та пасивному очікуванні. Хід роботи Для виконання лабораторної роботи було прийнято рішення використовувати стандартну програму, яка по замовчуванню інтегрована в операційну систему Winodws тобто блокнот. Результати: Висновок: На даній лабораторній роботі я засвоїв поняття процесів та потоків як основних компонентів сучасних операційних систем. Здобув навики створення, керування та знищення процесів та потоків в операційній системі Windows. Додаток: #include <windows.h> #include <Shellapi.h> #include <iostream> #include <process.h> #include <fstream> #include <time.h> using namespace std; static fstream f; static unsigned __stdcall ThreadFunc(void* num) { for(int i = 0; i < 0x06; i++) { f << GetTickCount() << endl;// запис у файл Sleep(2); } _endthreadex(0);//вбиваємо потік return 0; } int Func_Lab_1 (HANDLE hProc) { time_t current_time; time(&current_time); f.open("D:\EXAMPLE.txt"); f << "Current Date and time is: \n"; f << ctime(&current_time) <<"\n"; f << "Process number: \n"; f <<GetCurrentProcessId()<< "\n"; f << "Number flow: \n"; f <<GetCurrentThreadId(); f.close(); //Відкриваємо редактор ShellExecute (NULL, "open", "notepad.exe","D:\EXAMPLE.TXT", NULL, SW_SHOW); return 0; } void main() { //Відкриваємо редактор ShellExecuteW(0, L"open", L"C:\\Windows\\notepad.exe", 0, 0, SW_RESTORE); cout << "ShellExecute: " << ShellExecuteW(0, L"open", L"C:\\Windows\\notepad.exe", 0, 0, SW_RESTORE) << endl; HANDLE hProc=0;//Тут буде зберігаєтися дескриптор відкритого процесу STARTUPINFOW siStartupInfo;//Тут містяться дані про відкриття процесу PROCESS_INFORMATION piProcessInfo;//Тут зберігаються дані про процес memset(&siStartupInfo, 0, sizeof(siStartupInfo));//"заливаємо" нулями структури для роботи процесу memset(&piProcessInfo, 0, sizeof(piProcessInfo)); siStartupInfo.cb = sizeof(siStartupInfo);//записуємо розмір структури //Запускаємо власний процес з exe-файлу на диску CreateProcessW(L"C:\\Windows\\notepad.exe", 0, 0, 0, false, 0, 0, 0, &siStartupInfo, &piProcessInfo); cout << "CreateProcess: " << CreateProcessW(L"C:\\Windows\\notepad.exe", 0, 0, 0, false, 0, 0, 0, &siStartupInfo, &piProcessInfo) << endl; hProc = OpenProcess(PROCESS_ALL_ACCESS, false ,piProcessInfo.dwProcessId);//"Влазимо" у відкритий нами процеc cout <<"OpenProcess: "<< OpenProcess(PROCESS_ALL_ACCESS, false ,piProcessInfo.dwProcessId)<< endl; //виводимо на екран викликаного процесу Sleep(3000);//Показуємо, що ми на 3 секунди відкрили блокнот cout << "Priority1: " << GetPriorityClass(hProc) << endl; SetPriorityClass(hProc, IDLE_PRIORITY_CLASS); cout << "Priority2: " << GetPriorityClass(hProc)<<"\n" << endl; GetCurrentProcessId();//ідентифікатор процесу cout<<"ProcessId: "<< GetCurrentProcessId()<<"\n"<<endl;//виводимо ідентифікатор процесу TerminateProcess(hProc, NULL);//Успішно "вбиваємо" викликаний процес cout<<"TerminateProcess: "<< TerminateProcess(hProc, NULL)<<"\n"<<endl; Sleep(100);//Чекаємо на "вбивство" процесу CloseHandle(piProcessInfo.hProcess);//закриваємо дескриптор процесу CloseHandle(piProcessInfo.hThread);//закриваємо дескриптор потоків нашого процесу Func_Lab_1 (hProc); ////Потоки HANDLE hThread = NULL; unsigned int ThreadId = NULL; DWORD ThreadExit = NULL; f.open("output.txt", ios::out);//відкриваємо дескриптор файлу hThread=(HANDLE)_beginthreadex(NULL, 0, ThreadFunc, NULL, NULL, &ThreadId); cout <<"_beginthreadex: "<<_beginthreadex(NULL, 0, ThreadFunc, NULL, NULL, &ThreadId)<<"\n"<<endl; cout << "Priority before: " << GetThreadPriority(hThread) << endl;//Дістаємо пріоритет потоку до встановлення SetThreadPriority(hThread, THREAD_PRIORITY_HIGHEST);//Встановлюємо пріоритет потоку cout << "Priority after: " << GetThreadPriority(hThread) << endl;//Дістаємо пріоритет потоку після встановлення Sleep(1000); for(int i = 0; i < 0x06; i++) cout << GetTickCount() << endl; Sleep(1000); //даємо час потоку завершитись GetExitCodeThread(hThread, &ThreadExit); cout<<"\n"<<"GetExitCodeThread:"<<GetExitCodeThread(hThread, &ThreadExit)<<"\n"<<endl; cout << "Exit Code of Thread: " << ThreadExit << endl; f.close(); }
Антиботан аватар за замовчуванням

06.12.2014 17:12-

Коментарі

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

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

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

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

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

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

Admin

26.02.2023 12:38

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