Нишки и многонишково програмиране

Когато чух за новото приложение за социални медии „Threads“ на Meta, първото нещо, което ми дойде наум беше дали някой програмист или системен инженер е измислил името? Въпреки че нишковото и многонишковото програмиране е важна компютърна концепция, много нови програмисти изглежда не го осъзнават. В тази статия ще засегна какво представляват нишки, многонишково програмиране и други свързани концепции.

Процеси

Процесът е екземпляр на програма, изпълнявана в компютър.

Нишки

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

Превключване на контекст

При превключване от една нишка към друга, операционната система запазва текущото състояние на нишката, като копира всички регистри в стека и ги записва в структура CONTEXT. След това ОС насочва процесора към паметта на процеса на другата нишка и възстановява регистрите от CONTEXT структурата на новата нишка.

Състезателно състояние

Грешка в многонишков процес, при който кодът на нишка A разчита на нишка B, за да завърши някакво действие, но няма синхронизация между двете нишки. Процесът работи, ако нишка B спечели състезанието, като завърши своето действие, преди нишката да има нужда от него, но процесът се проваля, ако нишка A спечели състезанието.

Застой

Грешка, при която изпълнението на нишка A е блокирано за неопределено време в очакване на нишка B да извърши някакво действие, докато нишка B е блокирана в очакване на нишка A. Например, две нишки в противоположните краища на наименована тръба могат да се блокират, ако всяка нишка чака да чете данни, записани от другата нишка. Една нишка също може да блокира себе си.

Обекти за синхронизиране

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

Примери за обект/концепция за синхронизация:

Семафор — Флагова променлива, която се използва за управление на достъпа до споделени системни ресурси.

Mutex — обект за синхронизиране, който позволява на една нишка взаимно изключващ се достъп до ресурс. Мутексите са полезни, когато само на една нишка в даден момент може да бъде разрешено да променя данни или някакъв друг контролиран ресурс.

Критичен раздел— Частта от кода, която има достъп до споделен ресурс.

Обекти за събития— Обект на ядрото, чиято единствена цел е да бъде сигнализиран или несигнализиран.

Разлики между критична секция и Mutex:

  1. Заключването на непритежаван мютекс отнема почти 100 пъти повече време, отколкото заключването на непритежаван критичен раздел, тъй като критичният раздел може да бъде направен в потребителски режим, без да се включва ядрото.
  2. Мутексите могат да се използват между процесите. Критичните секции могат да се използват само в рамките на един и същи процес.
  3. Можете да зададете време за изчакване, когато чакате мютекс, но не и критична секция.

Прост пример за програмиране на нишки (C++):

#include <windows.h>
DWORD WINAPI ThreadFunc(LPVOID);

main( )
{
 HANDLE hThread;
DWORD threadId;

hThread = CreateThread(NULL, 0, ThreadFunc, 0, 0, &threadid);
printf(“Thread Running”);
}

DWORD WINAPI ThreadFunc(LPVOID p)
{
 //…………..
}

Много типичен пример за приложение, което използва многопоточно програмиране, би бил уеб сървър като Apache Web Server или Microsoft IIS. Уеб сървърите са основно приложения, които слушат постоянно на порт 80 (HTTP) и 443 (HTTPS) за заявки. Когато има нова входяща заявка, уеб сървърът трябва да създаде нова работна нишка за обслужване на заявката, така че основната нишка да може да продължи да слуша други заявки.

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