You are on page 1of 4

Прізвище: Гончарук

Ім'я: Павло
Група: КН-309
Варіант: 5

Інститут: ІКНІ
Кафедра: САПР
Дисципліна: Технології розподілених систем та паралельних обчислень
Перевірив:Фармага І.В.

ЗВІТ
до лабораторної роботи №1
на тему “Частина 1: Багатопотоковість”

Мета роботи:Одержати навики побудови багатопотокових алгоритмів


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

Короткі теоретичні відомості:

Основне поняття сучасних операційних систем — процес (process). Як і всі загальні


поняття, процес важко визначити. Можна розуміти під процесом виконувану (runnable)
програму, але треба пам'ятати про те, що у процесу єсть декілька станів. Процес може в
будь-який момент перейти до виконання машинного коду іншої програми, а також "заснути"
(sleep) на деякий час, призупинивши виконання програми. Він може бути вивантажений на
диск. Кількість станів процесу і їх особливості залежать від операційної системи.

Всі сучасні операційні системи багатозадачні (multitasking), вони запускають і


виконують зразу декілька процесів. Одночасно може працювати браузер, текстовий
редактор, музичний програвач. На екрані дисплея відкриваються декілька вікон, кожне з
яких пов'язано із своїм працюючим процесом. Якщо на комп'ютері тільки один процессор, то
він переключається з одного процесу на другий, створюючи видимість одночасної роботи.
Переключення відбувається по закінченню одного або декількох "тиків" (ticks). Розмір тику
залежить від тактової частоти процесора і звичайно має порядок 0,01 секунди. Процесам
назначаються різні пріоритети (priority). Процеси з низьким пріоритетом не можуть
перервати виконання процесу з більш високим пріоритетом, вони менше займають процесор,
тому виконуються повільно, як говорять, "на фоні". Самий високий пріоритет у системних
процесів, наприклад, у диспетчера (scheduler), який як раз і займається переключенням
процесора з процесу на процесс. Такі процеси не можна переривати, поки вони не закінчать
роботу, інакше комп'ютер швидко прийде в хаотичний стан.

Індивідуальне завдання:
Варіант 5. Програма моделює обслуговування одного потоку процесів декількома
центральними процесорами комп'ютера без черг. Якщо процес згенерував в той момент,
коли перший процесор зайнятий, процес береться на обробку другим процесором, якщо і цей
процесор зайнятий, запускається третій процесор і т.д. Визначити кількість задіяних
процесорів і відсоток від загальної кількості процесів, які були оброблені кожним
процесором.
Хід роботи:

Код програми:

#include <iostream>
#include<thread>
#include<mutex>
#include<vector>
#include<random>
#include<fstream>
#define NUM_OF_THREAD 8
#define NUM_OF_PROCESS 10
#define MAX_RANDOM 2000
#define TIME_BETWEEN_PROCESS_GENERATING chrono::milliseconds(300)
#define TIME_TO_FINISH_PROCESS chrono::milliseconds(800)
using namespace std;

class MyThread;

class Random
{
public:
void get_random_number(bool& active,int& id)
{
active=true;
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> distr(0, MAX_RANDOM);
this_thread::sleep_for(TIME_TO_FINISH_PROCESS);
cout<<"Generated random int: "<<distr(gen)<<endl;
cout.flush();
active=false;
}
};

class MyThread
{
public:
thread t;
bool active;
int id;
int iteration_number;
Random random;

MyThread(int id)
{
this->id=id;
active=false;
iteration_number=0;
}
void new_thread()
{
iteration_number++;
t = std::thread{&Random::get_random_number,random,ref(active),ref(id)};
t.detach();
}
};

int main() {
vector<MyThread> t;
clock_t begin=clock();
for(int i=0;i<NUM_OF_THREAD;i++)
{
MyThread t1(i+1);
t.push_back(move(t1));
}
for(int i=0;i<NUM_OF_PROCESS;i++)
{
for(int j=0;j<NUM_OF_THREAD;j++)
{
if(!t[j].active)
{
t[j].new_thread();
this_thread::sleep_for(TIME_BETWEEN_PROCESS_GENERATING);
break;
}

}
}
this_thread::sleep_for(chrono::seconds(2));

for(int i=0;i<t.size();i++)
{
cout<<"Processor # "<<t[i].id<<" done "<<t[i].iteration_number<<" task
"<<"This is
"<<(static_cast<double>(t[i].iteration_number)/NUM_OF_PROCESS)*100<<"%"<<endl;
}

return 0;
}

Результат виконання:

Рис.1 Результат виконання програми


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

You might also like