NET, Преглед на многопоточност

Има няколко причини за използването на многопоточност. Да предположим, че приложението се опитва да осъществи достъп до сървър в мрежата, което може да отнеме известно време. Малко вероятно е да искате потребителският интерфейс да бъде блокиран поради това и потребителят просто е трябвало да изчака момента за връщане на отговора от сървъра. Потребителят може да извърши някои други действия в този момент или дори да отмени заявката, изпратена до сървъра. В такива ситуации използването на многопоточност е от полза.

За всички дейности, които изискват изчакване, като достъп до файл, база данни или мрежа, може да се стартира нова нишка, позволяваща едновременно изпълнение на други задачи. Многопоточността може да помогне, дори ако има само интензивни задачи за обработка. Множество нишки на един и същ процес могат да бъдат изпълнени едновременно от различни процесори или, по-често в наши дни, различни ядра на един и същ многоядрен процесор.

Разбира се, трябва да знаете спецификата на едновременното изпълнение на множество нишки. Тъй като те се изпълняват по едно и също време, могат да възникнат проблеми, когато имат достъп до едни и същи данни. За да се предотврати това, трябва да се внедрят механизми за синхронизация.

В приложение, което се изпълнява на сървъра, една нишка винаги чака заявка от клиента и затова се извиква нишка на слушателя. При получаване на заявка, тя незабавно я препраща към отделна работна нишка, който след това продължава да взаимодейства със самия клиент. След това нишката на слушателя незабавно се връща към своите задължения в очакване на следващата заявка от следващия клиент.

Всеки процес се състои от ресурси като дескриптори на прозорци, дескриптори на файлове и други обекти на ядрото, има разпределена област във виртуална памет и съдържа поне една нишка. Нишките са планирани за изпълнение от операционната система. Всяка нишка има приоритет, брояч на инструкции, който сочи към мястото в програмата, където се извършва обработката, и стек, в който се съхраняват локални променливи на нишката. Стекът на всяка нишка изглежда различно, но паметта за програмния код и купчината се споделят между всички нишки, които функционират в рамките на един процес.

Това позволява на нишките в рамките на един и същ процес да комуникират бързо помежду си, тъй като всички нишки в даден процес имат достъп до една и съща виртуална памет. Това обаче усложнява нещата, тъй като позволява на множество нишки да модифицират една и съща област на паметта.

Основите на многопоточността

Има два вида мултитаскинг: базиран на процес и базиран на нишки. В това отношение е важно да се разберат разликите между тях. Процесът е отговорен за управлението на ресурси, като виртуална памет и дескриптори на Windows, и съдържа поне една нишка. Наличието на поне една нишка е необходимо за изпълнението на всяка програма. Следователно многозадачността, базирана на процеса, е средство, чрез което две или повече програми могат да работят паралелно на компютър.

Разликите в многозадачността, базирана на процеси и базирана на нишки, могат да бъдат обобщени, както следва: многозадачността, базирана на процеса, е организирана за паралелно изпълнение на програми, а многозадачността, базирана на нишки, е за паралелно изпълнение на отделни части на една програма.