Повеќе нишки

## Вовед

Оперативен систем (ОС) претставува системски софтвер кој е посредник помеѓу апликативниот софтвер (корисничките програми) од една страна , и хардверот на компјутерскиот систем, од друга страна.
Според Таненбаум (2007) сите софтверски програми кои работат на компјутерот, понекогаш вклучувајќи го и ОС (оперативниот систем) се организирани во број од секвенцијални процеси или накратко процеси. Процесот е програма што се егзекутира, вклучувајќи ги моменталните вредности на бројачот, регистрите и променливите.
Драстично поедноставено, нишка е патеката која процесот ја следи за време на извршувањето. Денешните оперативните системи работат во средина со повеќе нишки.  
Традиционално, патеките се извршуваат во една насока, односно една нишка. Ова практика ќе ја направела продукцијата на денешниот софтвер невозможна поради потребата на брзина која е потребна за да програмите извршуваат повеќе задачи и настани во исто време. Традиционалниот пристап работи добро со традиционалните игри како шах, меѓутоа во новата ера повеќезадачните програми, каде што повеќе настани мора да се извршуваат паралелно, традиционалниот пристап се покажува како бескорисен. 
Повеќезадачноста е способноста на оперативниот систем да извршува повеќе од еден програм истовремено. Иако велиме дека повеќезадачност претставува работење на повеќе програми истовремено буквално тоа на еден обработувач не може да се изврши. Обработувачот преминува од една во друга програма толку брзо така што на луѓето им изгледа дека се извршуваат истовремено.

Повеќе-нишки укажува на способноста на оперативниот систем да подржи повеќе еднакви патеки на извршување во единечен процес.

На следнава слика (Слика 1) се прикажани процеси со една нишка на левата страна, и процеси со повеќе нишки на десната страна.

## Одлики на повеќе нишки
### Предности на повеќе нишки

Како предности на користење повеќе нишки се сметаат следниве:
Повеќе нишки му дозволуваат на процесот да продолжи да работи иако некои нишки во процесот стагнираат, работи на долги процеси или чекаат интеракција со корисникот. Како на пример, користење на аларм на дигитален часовник, нишката за следење на времетo продолжува додека алaрмот се огласува или додека друг чека да се активира. Сите нишки имаат ист адресен простор така да тие имаат исти глобални променливи, имаат пристап до стековите на другите нишки во истиот процес, споделуваат деца-процеси, сигнали, аларми, отворени податотеки и друго. Предностите на повеќе нишки се дуплираат како што се зголемува бројот на достапни обработувачи спротивно на единствена нишка каде што само еден обработувач е користен. Во архитектурата на мултиобработувачот извршувањето на нишки може да се дистрибуира на повеќе обработувачи паралелно што овозможува зголемена ефикасност.

Исто така според Вилиам Сталингс се наведуваат и следниве позитивни страни од повеќе-нишки:
*Потребно е пократко време за да се создаде нова нишка во постоечки процес, отколку да се создаде нов процес
*Потребно е пократко време за да се поништи нишка
*Потребно е пократно време за да се контролира префрлањето помеѓу две нишки во ист процес отколку помеѓу процеси.
*Нишките овозможуваат полесно комуницирање помеѓу различни траги на извршување. Споделувањето на истиот кориснички адресен простор овозможува придодна комуникација но процесната комуникација бара специјална поддршка од оперативниот систем.
Така, ако постои функција која треба да биде имплементирана како збир од поврзани единици на извршување, поефикасно е да се направи тоа како збирка на нишки отколку колекција на одделни процеси.

### Предизвици – Слабости

Како секоја нова програмерска интервенција, кога се користи концептот на повеќе нишки, програмерот мора да ги има предвид потенцијалните предизвици кои ги презентира.

**Системски повици** – едно од прашањата за кои треба да се имаат предвид е како системскиот повик се справува со нишките содржани во процес којшто се дуплицира. Дали нишките исто така се дуплицираат или дуплицираните процеси содржат само единечна нишка? Некои Јуникс (Unix) системи ги обезбедуваат двата начини на дуплицирање.

**Поништување** – Постојат ситуации кога е потребно некоја нишка да се поништи пред да ја заврши својата задача. Овој тип на поништување се нарекува “Поништување на нишка”. Да замислиме игра на шах, каде што повеќе потези се евалуирани преку различни нишки за да може да се најде најкраткиот пат за победа засновано на можни идни потези. Во такво сценарио, бидејќи истовремено се извршуваат сите нишки,  кога една нишка ќе најде патека за победа , останатите нишки можат да бидат поништени бидејќи веќе е најден најкраткиот пат до шах-мат. При поништување на “таргетираната” нишка , постојат два пристапи. Еден е асинхроно (анг. Asynchronous) поништување каде што една нишка терминирајќи друга може да доведе до така наречени ресурси “сирачиња” , бидејќи нишката не добила шанска да ги ослободи. И вториот пристап е одложено поништување (анг. Deferred cancellation) каде секоја нишка постојано проверува дали треба да терминира и ако може, тоа да го направи на тој начин што ќе ги ослободи системските ресурси користени од нишката која ќе се терминира.

**Справување со сигнали** – Јуникс (анг. UNIX) системите користат сигнали за да водат записи од настани коишто мора да ја следат истата патека, како што е прикажано во Фигура 1, независно од типот дали се синхрони или асинхрони.

ФИГУРА 1: Патека на извршување на настан
* Создавање
**Се случува настан
**Се создаде сигнал
*Достава
**Прати го новиот сигнал на Процесот.
*Вршење
**Сигналот се прима
**Се справува со сигналот

“Нелегален пристап до меморија” или “делење со 0” акциите произведуваат синхрони сигнали пратени процесот којшто е причинител на операцијата. Асинхроните сигнали се тие коишто се примаат како резултат од надворешни настани како команди на тастатурата како  која терминира процес, кои се типично пратени на друг процес.

**Базени на нишки** – иако создавање на нишки е поконзервативно од создавање на процеси, неограничените нишки може да ги искористат сите ресурси на системот. Еден начин на справување со овој проблем се базените со нишки. Идејата е да се има неколку нишки создадени со стартување на процесот и да се држат во “базен”, каде што тие чекаат да им се додели задача. Кога едно барање е примено, тоа е предадено на нишка која е достапна во базенот. По завршување на задачата, нишката се враќа во базенот и ја чека својата следна задача. Овој метод го ограничува бројот на нишки во системот на величина која може да биде менаџирана. Најмногу е корисна кога системот не поседува доволно ресурси за да се справи со големиот број на нишки. За возврат, перформансот на системот се зголемува така што создавањето на нишка е поспоро од повторно користење на веќе постоечка нишка.

**Податоци специфични за Нишка** -  Споделувањето на ресурси на процесот родител има корист за повеќе-нишкени програми, но во случаи каде нишка можеби треба да чува копија од некои податоци, наречени податоци специфични за нишка (анг. Thread-specified data), може да биде негативна страна исто така.

## Модели
Нишките се делат на два вида, нишки на корисничко ниво и нишки на ниво на кернел. Нишките на корисничко ниво се независни од кернелот и се менаџирани без поддршка на кернелот. Наспроти, оперативниот систем директно ги менаџира нишките на кернел ниво. Безразлика, мора да постои некоја форма на врска помеѓу нишките на корисничко ниво и нишките на кернел ниво. Постојат 3 модели на повеќе нишки кои се користат за да се класифицираат овие врски : Еден-на-Еден (анг. One-to-One), Повеќе-на-Еден (анг. Many-to-One) и Повеќе-на-Повеќе (анг. Many-to-Many).

### Еден-на-Еден Модел
Слика 2:Еден-на-Еден Модел

Моделот Еден-на-Еден (Слика 2) поврзува единечна нишка од корисничкото ниво со единечна нишка на кернел ниво. Овој тип на врска го олеснува извршувањето на повеќе нишки паралелно. Сепак, оваа придобивка има свој недостаток, така што генерирањето на секоја нова нишка на корисничко ниво мора да вклучува и создавање на кореспондентна нишка на кернел ниво, со што се предизвикува успорување и намалување на перформансот на процесот родител. Виндоус (Windows) сериите и Линукс (Linux) оперативните системи се обидуваат да го прескокнат овој проблем преку ограничување на растот на бројот на нишки.

### Повеќе-на-Еден Модел

Слика 3: Повеќе-на-Еден Модел

Моделот Повеќе-на-Еден (Слика 3) ги поврзува сите нишки од корисничко ниво во единечна нишка на кернел ниво. Овој тип на врска овозможува делотворна контекстно-променлива околина, едноставно спроведлива дури на едноставни кернели без поддршка на нишки. Лошата страна е тоа што постои само една нишка на кернел ниво закажана во било кое дадено време, овој модел не може да го искористи забрзувањето на хардверот коешто е понудено од страна на повеќе-нишкените обработувачи или мулти-обработувачкки системи.

### Повеќе-на-Повеќе Модел

Слика 4: Повеќе-на-Повеќе Модел

Моделот Повеќе-на-Повеќе (Слика 4) претставува компромис помеѓу последните два модели. Во овој модел, одреден број на нишки од корисничко ниво се поврзани со еднаков или помал број на нишки на кернел ниво. Барањето за промена на кодот и во кернел нивото и во корисничкото ниво воведува ниво на комплексност којашто не постои во претходните модели. Слично на Повеќе-на-Еден моделот, овој модел овозможува делотворна контекстно-променлива околина така што се оддалечува од системски повици.  Зголемената комплексност претставува потенцијал за инверзија на приоритет и субоптимално распоредување со мала координација помеѓу корисничките и кернелските распоредувачи.

## ЗАКЛУЧОК
Со помош на концептот повеќе-нишки развивачите (девелоперите) можат да изработуваат повеќе-нишкени програми и со тоа нудејќи широк спектар од способности и функионалности во високо перформансни околини со избегнување на прекумерно користење на системски ресурси. Така во модерниот свет каде што постојат различни видови на технологии, напредни/комплицирани програми, многу е поефикасно и поефективно да се користат повеќе нишки. Развивачите треба да обратат повеќе внимание на потенцијалните предизвици поврзани со користење на нишки бидејќи тие може значително да ги попречат во развивачкиот процес. Со избирање на вистинскиот модел зависно од потребите на програмот и предвидените минимални перформанси, развивачите ќе можат да направат оптимална апликација, којашто ќе работи повеќе време без да се случи застој на процеси.
Со користење на нишките во програмирањето добиваме брзи и стабилни апликации со подобри перформанси.
## Библиографија