Нит (рачунарство)

Из Википедије, слободне енциклопедије
У оквиру једног процеса тече више нити. За разлику од процеса који имају одвојене меморијске просторе, нити дијеле исти меморијски простор.

Нити у рачунарству представљају задатке који се истовремено извршавају у оквиру једног процеса. Инструкције које сачињавају једну нит се извршавају у исто вријеме са инструкцијама које сачињавају друге нити (ако у рачунару постоји више процесора) или је та истовременост само привидна (ако у рачунару постоји само један процесор).

Као што више процеса раде у исто вријеме на једном рачунару, тако се нити могу замислити као више послова у оквиру једног процеса. Све нити једног процеса имају исти именски простор, користе заједничку меморију и табеле отворених датотека. На тај начин је вишенитно програмирање знатно једноставније него распоређивање послова у више системских процеса.

Проблеми[уреди]

Узроци најчешћих проблема вишенитног програмирања леже у истим стварима које представљају његове предности. Наиме, иако коришћење заједничке меморије представља одређено олакшање (јер се могу користити заједничке глобалне промјенљиве и именски простор, користити показивачи због истог адресног простора итд.), често долази до сукоба више нити при приступању и читању/мијењању исте меморијске локације у исто вријеме. Деси се да једна нит почне са читањем вриједности неке меморијске локације и прије него што нека друга нит заврши са писањем у њу; тако прва нит добије пола старе а пола нова податке, што често узрокује нетачне резултате или чак изненадни престанак рада цијелог програма.

У оваквим ситуацијама се најчешће прибјегава рјешењима која обухватају разне начине закључавања меморије. Наиме, у разним програмским језицима и окружењима постоје различити начини да једна нит „забрани“ другим да приступе одређеном ресурсу док та нит не заврши што има да заврши. У већини програмских окружења се то постиже коришћењем тзв. мутекса који функционишу на принципу закључане собе: када се једна нит закључа у собу, друге нити не могу ући док она не откључа и изађе. Тако исто, када једна нит „закључа“ мутекс, она може користити ресурс. Ако нека друга нит покуша да закључа мутекс, мораће да сачека док га прва нит не откључа.

Кружна блокада[уреди]

Кружна блокада (енгл. deadlock) је термин који означава ситуацију када нека нит А чека да нит Б откључа неки мутекс, али Б не може да га откључа јер у том тренутку чека да нит А откључа неки други мутекс. У таквој ситуацији обје нити чекају једна другу и ситуација је нерјешива. Један од начина да се то деси је да обје нити покушавају да заузму два или више истих ресурса, али различитим редослиједом. Програмер мора пажљиво да осмисли алгоритам програма да би избјегао такве и сличне ситуације. Чишћење програма од таквих проблема зна да буде врло сложено, јер се проблем не појављује при сваком покретању програма и зна да се деси тек кад се објави и расподијели клијентима.

Посикс нити[уреди]

Стандард „Посикс“ (енгл. POSIX) дефинише програмски интерфејс за руковање нитима на бази процедуралног програмирања, тј. очекује опис задатака које нит обавља у облику једне функције. Само отпочињање рада нити, њено контролисање и прекидање се обавља преко скупа функција које овај стандард прописује, и чија имена сва почињу са „pthread_“. Наводимо неке од основних:

  • pthread_create - покретање нити.
  • pthread_join - покретање нити након што се нека друга нит заврши.
  • pthread_cancel - насилно заустављање рада неке нити
  • pthread_mutex_init - креирање мутекса
  • pthread_mutex_lock - закључавање мутекса
  • pthread_mutex_unlock - откључавање мутекса

Објектно оријентисане нити[уреди]

У објектно оријентисаним програмским језицима попут Јаве и C++-а, нити обично имају форму објекта — свака нит представља посебан објекат чија једна метода (обично под називом run(), без аргумената) садржи задатке које функција треба да обави. То су обично објекти неке класе која је наслиједила класу „Нит“: у Јави су то класа Thread и интерфејс Runnable, у Qt-у је то класа QThread итд. Најчешће се након припреме позива метода класе start тог објекта да би се функција run покренула у посебној нити.

У Јави, у којој постоји чврста хијерархија класа које све директно или индиректно наслијеђују класу Object, могућност закључавања ресурса је смјештена у самој класи Object што додатно поједностављује руковање дијељеним ресурсима.

Види још[уреди]

Спољашње везе[уреди]