Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
PAGE 3
МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
МЕТОДИЧНІ ВКАЗІВКИ
з курсу «ОПЕРАЦІЙНІ СИСТЕМИ»
до ЛАБОРАТОРНОЇ РОБОТИ № 4
“Багатопотокове програмування в сучасних ОС”.
для студентів спеціальностей:
6.170101 «Безпека інформаційних і комунікаційних систем»,
6.170103 «Управління інформаційною безпекою»
Львів 2013
Методічні вказівки до лабораторної роботи №4 за курсом «Операційні системи» для студентів спеціальностей: 6.170101 «Безпека інформаційних і комунікаційних систем», 6.170103 «Управління інформаційною безпекою». / Укл. А.Е. Лагун, Ю.М. Костів, С.С. Войтусік - Львів: НУ «ЛП», 2013р.
Укладачі: А.Е. Лагун к.т.н., доцент кафедри «Безпеки інформаційних технологій»;
Ю.М. Костів асистент кафедри «Безпеки інформаційних технологій» ;
С.С. Войтусік к. ф. м. н., ст. викл. Кафедри «Безпеки інформаційних технологій».
Мета: ознайомлення з поняттям багатопотоковості в сучасних операційних системах,
отримання практичних навичок створення багатопотокових застосувань в середовищі Visual Studio C#.
Теоретичні відомості
Як відомо [1] потоком (потік керування, нитка, thread) називають набір послідовно виконуваних команд процесора, які використовують загальний адресний простір процесу. Оскільки в системі може одночасно бути багато потоків, завданням ОС є організація перемикання процесора між ними і планування їхнього виконання. У багатопроцесорних системах код окремих потоків може виконуватися на окремих процесорах.
Багатопотоковими називають програми, які одночасно виконують різні чи однотипні завдання, використовуючи при тому декілька потоків.
Розглянемо яким чином можна оптимізувати програми, використовуючи багатопоточність.
Але не завжди можна розпаралелити задачу. Не завжди є в тому сенс. Наприклад, якщо у нас є один потік даних і його необхідно обробляти в певному порядку, і при цьому без результатів попередньої обробки даних наступну операцію виконувати не можна, то в такій програмі створення додаткових потоків нічого нам не дасть.
Потоки не повинні заважати один одному і повинні використовувати ефективно ресурси системи, в якій вони працюють.
Управління багатопотоковістю.
Управління багатопотоковістю здійснює планувальник потоків, цю функцію CLR зазвичай делегує операційній системі. Планувальник потоків гарантує, що активним потокам виділяється відповідний час на виконання, а потоки, які очікують або блоковані, наприклад, на очікуванні ексклюзивної блокування, або користувача введення - не споживають часу CPU.
На однопроцесорних комп'ютерах планувальник потоків використовує квантування часу - швидке перемикання між виконанням кожного з активних потоків. Це призводить до непередбачуваного поведінки, коли кожна послідовність виконання потоків відповідає кванту часу, виділеного потоку. У Windows XP типове значення кванта часу - десятки мілісекунд - вибрано як суттєво більшу, ніж витрати CPU на перемикання контексту між потоками (декілька мікросекунд).
На багатопроцесорних комп'ютерах багатопотоковість реалізована як комбінація квантування часу і справжнього паралелізму, коли різні потоки виконують код на різних CPU. Необхідність квантування часу все одно залишається, так як операційна система повинна обслуговувати як свої власні потоки, так і потоки інших додатків.
Кажуть, що потік витісняється, коли його виконання призупиняється через зовнішні фактори типу квантування часу. У більшості випадків потік не може контролювати, коли і де він буде витіснений.
Потоки і процеси.
Всі потоки однієї програми логічно містяться в межах процесу - модуля операційної системи, в якому виповнюється додаток.
У деяких аспектах потоки і процеси схожі - наприклад, час поділяється між процесами, що виконуються на одному комп'ютері, так само, як між потоками одного C #-додатки. Ключове відмінність полягає в тому, що процеси повністю ізольовані один від одного. Потоки поділяють пам'ять (купу) з іншими потоками цього ж додатка. Завдяки цьому один потік може постачати дані у фоновому режимі, а інший - показувати ці дані по мірі їх надходження.
Використання потоків.
Типовий додаток з багатопоточністю виконує тривалі обчислення у фоновому режимі. Головний потік продовжує виконання, в той час як робочий потік виконує фонову задачу. У додатках Windows Forms, коли головний потік зайнятий тривалими обчисленнями, він не може обробляти повідомлення клавіатури і миші, і додаток перестає відгукуватися. З цієї причини слід запускати віднімають багато часу завдання в робочому потоці, навіть якщо головний потік в цей час демонструє користувачеві модальний діалог з написом "Працюю ... Будь ласка, чекайте ", так як програма не може перейти до наступної операції, поки не закінчена поточна. Таке рішення гарантує, що програма не буде позначено операційною системою як "Не відповідає", спокушаючи користувача з горя прикінчити процес. Знову ж, у цьому випадку модальний діалог може надати кнопку "Скасувати", так як форма продовжує отримувати повідомлення, поки завдання виконується у фоновому потоці. Клас BackgroundWorker напевно стане в нагоді при реалізації такої моделі. У разі додатків без UI, наприклад, служб Windows, багатопотоковість має сенс, якщо виконувана завдання може зайняти багато часу, оскільки потрібно очікування відповіді від іншого комп'ютера (сервера додатків, сервера баз даних або клієнта). Запуск такого завдання в окремому робочому потоці означає, що головний потік негайно звільняється для інших завдань.
Інше застосування багатопотоковість знаходить в методах, що виконують інтенсивні обчислення. Такі методи можуть виконуватися швидше на багатопроцесорних комп'ютерах, якщо робоче навантаження рознесена по декількох потоках (кількість процесорів можна отримати через властивість Environment.ProcessorCount).
Додаток, створений на C # можна зробити багатопотоковим двома способами: або явно створюючи додаткові потоки і керуючи ними, або використовуючи можливості неявного створення потоків .NET Framework - BackgroundWorker, пул потоків, потоковий таймер, Remoting-сервер, Web-служби або додаток ASP.NET. У двох останніх випадках альтернативи багатопотоковості не існує. Однопотоковий web-сервер не просто поганий, він просто неможливий! На щастя, у випадку серверів додатків, що не зберігають стан (stateless), багатопотоковість реалізується зазвичай досить просто, складності можливі хіба що в синхронізації доступу до даних в статичних змінних.
Недоліки багатопотоковості.
Багатопотоковість разом з перевагами має і свої недоліки. Самий головний з них - значне збільшення складності програм. Складність збільшують не додаткові потоки самі по собі, а необхідність організації їх взаємодії. Від того, наскільки ця взаємодія є навмисною, залежить тривалість циклу розробки, а також кількість важко вловимих помилок у програмі. Таким чином, потрібно або підтримувати дизайн взаємодії потоків простим, або не використовувати багатопотоковість взагалі.
Крім того, надмірне використання багатопотоковості забирає ресурси і час CPU на створення потоків і перемикання між потоками. Зокрема, коли використовуються операції читання / запису на диск, більш швидким може виявитися послідовне виконання завдань в одному або двох потоках, ніж одночасне їх виконання в декількох потоках. Далі буде описана реалізація черги Постачальник / Споживач, що надає таку функціональність.
Засоби роботи з багатопотоковістю.
Для роботи з багатопотоковістю середовище .NET надає нам цілий простір імен System.Threading. У даному просторі імен міститься велика кількість різних типів. Для початку нам вистачить класу Thread, який якраз і знаходиться в даному просторі імен. У даного класу є багато корисних для роботи з потоками методів і властивостей, наприклад:
Start() - починає виконання потоку
Suspend() - призупиняє потік
Resume() - відновлює работу потоку
Priority властивість, що визначає приорітет потоку
Для того що б почати працювати з потоками створимо в середовищі Visual Studio C# консольне застосування, підключимо простір імен System.Threading, додавши в початок файлу з кодом наступну директиву:
using System.Threading;
Таким чином виконання наступного коду буде виводити на консоль напис «Тестовий потік №1» до тих пір поки не буде перерване натисканням будь-якої клавіші.
class ThreadClass
{
public void writestring()
{
while (true)
{
Console.WriteLine("Тестовий потік №1");
}
}
}
class Program
{
static void Main(string[] args)
{
ThreadClass tc = new ThreadClass();
Thread firstthread = new Thread(new ThreadStart(tc.writestring));
firstthread.Start();
}
}
Рис.1.
В методі main() створюється екземпляр класу ThreadClass. Далі ми створюємо об'єкт типу Thread і передаємо йому як параметр делегат ThreadStart що містить посилання на метод writestring(). Роботу з делегатам можна нагадати розглянувши наступні джерела [2,3]. Ну і останньою строчкою у нас запускається потік за допомогою методу Start().
У наведеному прикладі ми не бачимо наочно роботи потоку, але змінивши приклад наступним чином а саме, додавши ще один потік, який буде виводити рядок " Тестовий потік №2":
class ThreadClass
{
public void writestring()
{
while (true)
{
Console.WriteLine("Тестовий потік №1");
Thread.Sleep(1000);
}
}
public void writestring2()
{
while (true)
{
Console.WriteLine("Тестовий потік №2");
Thread.Sleep(1000);
}
}
}
class Program
{
static void Main(string[] args)
{
ThreadClass tc = new ThreadClass();
Thread firstthread = new Thread(new ThreadStart(tc.writestring));
Thread secondthread = new Thread(new ThreadStart(tc.writestring2));
firstthread.Start();
secondthread.Start();
}
}
Рис.2.
В даному лістінгу додали ще один метод writestring2(). Необхідно звернути увагу на рядок "Thread.Sleep (1000)", який з'явився в обох методах. Метод Sleep() "призупиняє" потік для наочносі на час вказаний в якості параметра (в мілісекундах). У прикладі ми призупиняємо потік на 1 секунду. У методі main() теж відбулися деякі зміни пов'язані з запуском нового потоку. Запустивши програму, ви побачите, що на екрані з'являється то рядок " Тестовий потік №1", то " Тестовий потік №2", причому в досить довільному порядку. Довільність пов'язана з тим, що на вашому комп'ютері запущена не тільки ваша програма, а багато інших, тому процесору доводиться "відволікатися" і на виконання інших завдань. Приорітет виконання потоку можна змінити за допомогою наступної стрічки:
Thread.CurrentThread.Priority = ThreadPriority.Highest;
Зі зміною приоритету треба бути уважним, так як необережне його підвищення може «підвісити систему». Додаткову інформацію по програмуванню багатопотокових задач в C# можна знайти в [2-4].
Табл.1 Варіанти завдань
№ вар. |
Кількість потоків |
Завдання |
1 |
2 |
Сума 2-х матриць (9х9). |
2 |
3 |
Сума 2-х матриць (3х3). |
3 |
3 |
Добуток 2-х матриць (3х3). |
4 |
4 |
Добуток 2-х матриць (3х3). |
5 |
3 |
Добуток 2-х матриць (4х4). |
6 |
2 |
Добуток 2-х матриць (4х4). |
7 |
5 |
Добуток 2-х матриць (5х5). |
8 |
7 |
Сума 2-х матриць (7х7). |
9 |
4 |
Сума 2-х матриць (7х7). |
10 |
3 |
Сума 2-х матриць (3х3). |
11 |
2 |
Сума 2-х матриць (3х3). |
12 |
5 |
Добуток 2-х матриць (7х7). |
13 |
4 |
Добуток 2-х матриць (3х3). |
14 |
7 |
Добуток 2-х матриць (4х4). |
15 |
5 |
Добуток 2-х матриць (4х4). |
16 |
7 |
Добуток 2-х матриць (5х5). |
17 |
4 |
Сума 2-х матриць (7х7). |
18 |
5 |
Сума 2-х матриць (7х7). |
19 |
8 |
Сума 2-х матриць (3х3). |
20 |
4 |
Добуток 2-х матриць (3х3). |
21 |
7 |
Добуток 2-х матриць (9х9). |
Література.
2. http://blog.nguen.net/post251-multythreading.html
3. http://msdn.microsoft.com/ru-ru/library/ms173178%28v=vs.100%29.aspx
4. http://rsdn.ru/article/dotnet/CSThreading1.xml