Многонишкови програми
1. Необходимост от разглеждането им.
Преди два месеца, колегата Avatara написа следното:
"Изчетох внимателно всичко написано.
Искам да запитам някой може ли да ми обясни как се обработват "многонишкови процеси" в
C++?
Предварително благодаря за съдействието."
Считам, че въпросът е интересен и си заслужава да го обособим в отделна тема. Сега вече ще бъдем по - свободни и може да я развием след много допълнително четене на литература. Предлагам следното :
а/ да се даде необходимата теоритична постановка;
б/ да се посочат реални проблеми от нашата практика, които изискват многонишковост;
в/ да се представят работещи решения на такива проблеми, като се използват различни езици за програмиране;
г/ всичко написано да е достатъчно ясно и просто обяснено, за да може да се разбира от ученици и учители с по - малък опит в програмирането.
Следва въведение в проблема :
2.Многозадачност и многонишковост
a/ Многозадачност (многопроцесност)
Под управлението на Windows е възможно едновременно да :
-слушаме музика;
-теглим файл по Интернет;
-да въвеждаме текст.
Тези три действия се изпълняват от три различни програми ( процеси), които работят едновременно, макър че компютъртът разполага с един процесор. Разпределянето на процесорното време между отделните процеси ( задачи ) се управлява от операционната система.
б/ Многонишковост.
В едно приложение понякога се налага да се изпълняват операции, отнемащи много време ( при дълбока рекурсия, при работа с големи обеми от данни). Докато те се изпълняват потребителският интерфейс на отговаря, тъй като приложението вече е поела съответната времеотнемаща операция. В такива случаи потребителят трябва да бъде известяван за статуса на извършваната работа и при необходимост да допуска потребителска намеса. Този и други подобни проблеми се решават чрез реализиране на многонишковост.
Една програма е поредица от инструкции. Те образуват една нишка (thread). Ако искаме да намерим решение на горния проблем е необходимо да поставим дългите изчисления в една нишка, а потребителския интерфейс – в друга. След това да осигурим периодичност в изпълнението на инструкциите от двете нишки.
По този начин се вижда, че многонишковостта е подобна на многозадачността. Разликата е, че управлението на многозадачността се решава от операционната система, а за управлението на нишките следва да се осигури от програмиста.
Друг пример: Ако искаме да напишем една програма, която да проследява поотделно действията на двама играчи, в програмата ще трябва да има две нишки – по една за всеки играч. Така в програмата ще трябва да се обособят две редици от инструкции.Такава програма се нарича многонишкова (multithread). Чрез управление на нишките ще се разпредели процесорното време между двамата играчи и те ще останат с впечатлението, че имат едновременне достъп. Причината е , че процесорът се предоставя на всяка нишка за някакъв определен интервал от време. След изтичането му, активната нишка се прекъсва и управлението се предава на следващата чакаща нишка. Този тип прекъсвания са известни като софтуерни прекъсвания – те са предварително планирани.
3.Същност на нишките (threads)
( като основен източник на информация по проблема ползваме Глава 17. от книгата на Светлин Наков – Програмиране в .NET; автори на разлежданата глава са Александър Русев и Иван Митев)
Тук ще обобщим казаното по – горе:
-нишките съществуват в едно приложение, т.е. приложението се състои от една или повече нишки ( не бива да са много, защото трудно ще се управляват);
-нишките предоставят възможност на процесора да изпълнява няколко подзадачи (подалгоритми, подпрограмиа) едновременно;
-паралелното изпълнение се симулира чрез постоянно превключване между подзадачите през много кратки интервали от време;
-всяка нишка изпълнява една подзадача ( програмен код), като за кратко време става активна (ангажира процесора) и след това го освобождава и предоставя на следващата чакаща нишка.
-тъй като процесорът е един, създадените нишки се подреждат в опашка и в нея изчакват следващото си активиране;
-при попадане на нишка в опашката, се запомня инструкцията от нейната последователност, която ще бъде първоизпълнена при следващото активиране.
Надявам се, че написаното от мен е разбираемо.