Критични секции - .NET импементация

Програмиране и програмни езици Проект

1


ТЕХНИЧЕСКИ УНИВЕРСИТЕТ - СОФИЯ
ФАКУЛТЕТ ПО КОМПЮТЪРНИ СИСТЕМИ И ТЕХНОЛОГИИ

Студент: Добромир Стефанов Стефанов
Фак. №: 121215019

Факултет: ФКСТ Подпис:
Специалност: КСИ
Поток: 1 Група: 39



I. Тема: Критични секции – пример .NET имплементация

II. Обща теория:

1. Процес – Процесът е съвкупност от памет, програмен стек и код на приложението:
- Процес и приложение са едно и също нещо;
- Процесите са съставени от една или повече нишки;
- Процесите са независими едни от други по отношение на памет и данни.

2. Нишка – Нишката е градивната структура на процеса, за разлика от процеса нишките
могат да споделят общи данни и памет.

3. Връзката между процес и нишка – Докато процесите съдържат изпълним код,
нишките го изпълняват, т.е. процесите са пасивни, а нишките – активни.

4. Как работят нишките? – Процесът се предоставя на всяка нишка за определен
интервал от време (квант), разпределението на времето се прави на базата на стратегии,
след изтичане на този квант се получава прекъсване и процесорът се изпълнява на
друга нишка (софтуерно прекъсване). Тези прекъсвания са синхронизирани и
предварително зададени.

5. Кога е удобно да се използват нишки? – Многонишкото обслужване е добре да се
използва при работа с много клиенти (пример: уеб сървър).

6. Проблеми, които настъпват при многонишково програмиране:
6.1. Race Condition – настъпва повреждане на данни, когато много нишки се опитват
да пишат в обща памет (пример: работа върху една променлива);

6.2. Deadlock – положение, което се получава когато две нишки, взаимно се изчакват за
освобождаване на дадени ресурси. Мъртва хватка не може да се получи, ако
споделеният ресурс е само един. Ако ресурсите са много, deadlock може да се избегне,
като ресурсите се вземат в определен ред от различни нишки.

2

III. Синхронизация - теория:

1. Кога се налага да се използва синхронизация? – Синхронизация се налага да се
използва, когато между нишките има споделен ресурс или желаем разпределение на
работата върху нишките с цел равномерно натоварване на програмата.

2. Видове синхронизация – Синхронизацията в .NET бива управлявана и
неуправлявана като за контролираната синхронизация се грижи CLR (Common
Language Runtime). При неуправляваната синхронизация се използват обекти на
операционната система.

3. Как се постига синхронизация? – Начинът за постигане на синхронизация в .NET е
чрез synchronized code regions (синхронизирани „пасажи ” код). Един от начините за
постигане е чрез ключовата дума lock или чрез използване на методите, които са
предоставени от класа Monitor на System.Threading.

IV. Критична секция – теория:

1. Критична секция – Ресурси, които могат да се разпределят между различни нишки,
но в определени моменти трябва да бъдат обработвани само от една нишка се
определят като критични.

2. Класът Monitor – Класът Monitor се предоставя за работа от System.Theading и чрез
него може да използваме критични секции. Чрез Monitor.Enter(object) се поставя начало
на критична секция за дадения обект – object. По такъв начин обектът е „заключен”
само в една нишка. Чрез Monitor.Exit(object) обектът се освобождава и може да бъде
предоставен на друга нишка.

3. Ключовата дума lock(object) – Чрез lock може да постигнем същата функционалност
като Monitor, като изолираме даден обект в една нишка.

4. Атрибут [MethodImplAttribute] – MethodImplAttribute позволява капсулирането на
даден обект в цялото тялото на метода (scope), от който е извикан. Подобно на
lock(object), покриващ целия метод.

V. Синхронизация – имплементация в .NET – за създаване на примерите е
използвано Visual Studio 2017, като имплементацията е показана в конзолно
приложение (Console Application .NET Framework). Примерите са разделени в различни
класове, като целта е да се покаже използването на критични секции чрез – lock,
Monitor.{Enter, Exit}, показан е и пример, в който няма синхронизация.

Source code: https://github.com/DStefanow/dot-net-synchronization

Как работи примерът? – Идеята на приложението е да покаже банкова сметка с баланс
и суми за зареждане и изпразване на сметката.

Класовете, които са използвани в приложението са:
- MainThread – съдържа Main функцията на приложението;
- BankAccount – базов клас с полета за баланс и методи за внасяне и извличане на
пари от сметка;

3

- BankTransaction – клас който се занимава за създаване на транзакции, всяка от
които е извикана 3 пъти;
- SyncWithLock, SyncWhitMonitor – класове, които показват синхронизирани
транзакции.

Примери:

1) При несинхронизирана транзакция – Ако имаме сметка с баланс от 0 лв. и сума за
вноска от 100 лв. и сума за извличане 90 лв. е много вероятно да получим отговор –
„There aren't enough money in the account.\nTrying to withdraw: {withdraw}, from balance -
{balance}”. Това се получава, защото нишката, която тегли пари достъпва общия
ресурс balance, който въпреки че е захранен от нишката за вноска, все още има
стойност 0 лв;

2) При синхронизирана транзакция(lock, Monitor) – Първо в сметката ще се извършат 3
вноски и след това ще може да се извършат 3 тегления, ако сумата е достатъчна за тях
(което е и главната цел на примера).

Преглед на първите от 3 страници - останалите след изтегляне

Описание

ТУ СОФИЯ Тема: Критични секции .NET имплементация; Кодът е качен в GitHub. Дисциплина: Операционни системи

0 коментара

Все още няма коментари. Бъдете първият, който ще коментира.

За да коментирате, трябва да сте влезли в профила си.

Влезте