Операционни Системи

Процеси и Нишки

Какво е процес и нишка?

Процесът (process) е основната единица за изпълнение на програма в операционната система. Всеки процес представлява инстанция на изпълнявана програма, която притежава собствени ресурси: памет, файлове, хардуерни устройства и процесорно време. Процесите са изолирани един от друг — един процес не може директно да достъпва паметта или ресурсите на друг, което осигурява стабилност и сигурност в системата. Например, когато пускаш браузър и текстови редактор едновременно, те се изпълняват като отделни процеси.

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


Еднотредови и многотредови процеси

Еднонишковият(single-threaded) процес изпълнява само една нишка в даден момент. Това означава, че всички задачи в процеса се извършват последователно, една след друга. Преимуществото тук е опростената структура и по-лесното управление на ресурсите, тъй като няма нужда от синхронизация между нишки. Например, проста програма, която извършва линейни изчисления, може да работи перфектно като еднотредов процес. Обърнете внимание обаче, че ако една задача отнеме много време (например, чакане на I/O операция), целият процес спира, докато тя приключи.

Многонишковят(multi-threaded) процес съдържа две или повече нишки, които могат да се изпълняват едновременно. Това позволява на процеса да обработи няколко задачи паралелно, което може значително да подобри производителността, особено при многоядрени процесори. Например, уеб браузър, който използва многотредов модел, може едновременно да зарежда страница, да обработва потребителски вход и да изобразява интерфейса. Въпреки това, многотредовите процеси изискват внимателно управление на синхронизацията, за да се избегнат проблеми като състезания (race conditions) или взаимни блокировки (deadlocks).

Процеси, нишки и процесорни ядра

Еднотредовият процес винаги се изпълнява на едно процесорно ядро, тъй като съдържа само една нишка. Дори ако системата разполага с повече ядра, този процес няма да може да използва паралелизъм, за да ускори изпълнението си. Например, когато процесът (или неговата нишка) заяви I/O операция (например четене от диск или мрежа), той преминава в състояние на блокиран (Blocked / Waiting), операционната система веднага превключва контекста (context switch) и предоставя това процесорно ядро на друг процес готов за изпълнение, ако има такъв.

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

Ако обаче системата има по-малко ядра от броя на нишките, операционната система използва мултиплексиране на нишки (thread multiplexing), при което нишките се изпълняват на разположените ядра в прекъсван режим (time-slicing) и бързо превключва между нишките (псевдопаралелизъм / concurrency). Това означава, че дори и да имате много нишки, те няма да се изпълняват истински едновременно, а ще споделят процесорното време.

Жизнен цикъл на процеса

Жизненият цикъл на един процес включва няколко основни състояния, които операционната система управлява:

  1. Създаване (New): Процесът се създава от операционната система, но все още не е готов за изпълнение. В това състояние се заделят необходимите ресурси.
  2. Готов (Ready): Процесът е готов да се изпълнява, но чака процесорно време. Всички процеси в това състояние са в очакване да бъдат избрани от планировчика (scheduler).
  3. Изпълнение (Running): Процесът се изпълнява на процесора. В даден момент може да има само един процес в това състояние на един процесор.
  4. Чакащ (Waiting): Процесът чака някакъв събитие или ресурс, например вход от потребителя, завершване на I/O операция или сигнал от друг процес.
  5. Приключване (Terminated): Процесът е приключил изпълнението си, освобождават се ресурсите и той се премахва от системата.

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

Планиране на процеси (Scheduling)

Планировчикът (scheduler) на операционната система е отговорен за разпределяне на процесорното време между процесите. Целта му е да осигури ефективно използване на процесора и да гарантира, че всички процеси получават справедливо време за изпълнение. Съществуват няколко основни алгоритъма за планиране:

  • FCFS (First-Come, First-Served): Процесите се изпълняват в реда, в който са пристигнали. Прост, но може да доведе до дълго чакане за някои процеси.
  • Round Robin: Всеки процес получава фиксирано време (time slice) за изпълнение, след което се прекъсва и се прехвърля на следващия процес в опашката. Това осигурява справедливост, но може да увеличава натоварването при често превключване.
  • Приоритетно планиране (Priority Scheduling): Процесите с по-висок приоритет се изпълняват първи. Може да доведе до "гладуване" (starvation) на процеси с нисък приоритет, ако не се вземат мерки.
  • Мултинишково планиране (Multilevel Queue/Feedback Queue): Комбинира няколко опашки с различни приоритети и алгоритми за планиране, за да се оптимизира изпълнението.

Планировчикът може да бъде преемствен (preemptive) или непреемствен (non-preemptive). При преемствения подход операционната система може да прекъсне изпълнението на един процес, за да даде възможност на друг с по-висок приоритет.

Синхронизация и комуникация между процеси

Когато няколко процеса или нишки работят едновременно, често се налага те да си сътрудничат или да споделят ресурси. Това изисква синхронизация, за да се избегнат проблеми като състезание (race condition), където крайният резултат зависи от реда, в който се изпълняват операциите.

Синхронизация

  • Ключалки (Locks): Механизъм, който позволява на един процес да "заключи" ресурс, докато го използва, и да предотврати достъпа от други процеси.
  • Семафори (Semaphores): Променлива, която контролира достъпа до ресурс. Може да бъде бинарна (допуска достъп само на един процес) или броячна (допуска достъп на ограничен брой процеси).
  • Монитори (Monitors): Високониво структури, които комбинират данни и процедури за достъп до тях, осигурявайки автоматична синхронизация.

Комуникация между процеси (Inter-Process Communication, IPC)

  • Съобщения (Message Passing): Процесите си разменят съобщения чрез опашки или канали. Подходящо за разпределени системи.
  • Споделена памет (Shared Memory): Процесите споделят памет, към която имат достъп. Бърз метод, но изисква синхронизация, за да се избегнат конфликти.
  • Тръби (Pipes): Еднопосочен или двупосочен канал за комуникация между процеси, често използван в Unix-базирани системи.