/ / Някои съмнения относно свободното програмиране на затвора [затворен] - c ++, c, монтаж, без заключване

Някои съмнения относно програмирането без заключване [затворено] - c ++, c, монтаж, без заключване

Здравейте приятели,
Преди всичко съжалявам, това ще бъде умерено дълъг пост. Така че, моля, имайте търпение да го прочетете.

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

Започвайки с думите "LOCKLESS = BLOCKLESS", тъй като се казва, че системата от нишки като цяло прави прогрес, защото CAS / DCAS може да се провали само ако някой от нишките е постигнал напредък.
Така че, можем да кажем, че тук в случай на блокиране на mutex, ние се върти / чакаме на условие (CAS време цикъл за например.).

Quest1> Как ще се върти по време на цикъл да бъде по-ефективно от блокиране на a
мутекс?
Quest2> Един добър дизайн, използващ мутекс, също гарантира, че системата напредва
isnt, че BLOCKLESS също по дефиниция?

В отговор на първия въпрос може да се твърди, че блокирането може да излезе в изчакване на ядрото и може да има контекстни ключове, които може да са скъпи. Всяка допълнителна яснота по този въпрос ще бъде оценена.

Добре, ако приемем, че след получаване на отговора за първите 2 въпроса ще бъда убеден да мисля, че без заключване е наистина бързо и реално време, когато атомните операции трябва да бъдат извършени не са големи / отнема много време.

Quest3> Така че, не е ли заключено нещо като spinlock? Ако да, защо не можем да го използваме 
pthread спин заключване?

В по-голямата част от наличната в мрежата литература ще видите реализация на атомна операция по следния начин:

__asm__ __volatile __ ("locknxadd" X "% 0,% 1") : "= r" (резултат), "= m" (* (T *) i_pAddress) : "0" (i_addValue) : "памет"); // Какво означава това ? Фехтовка на паметта?
Quest4> Има ли ": memory" в горепосоченото събрание означава фехтовка на паметта? Ако отговорът е да, 
doesnt, че отнема около 100 цикъла за изпълнение?
Quest5> Няма ли инструкцията за заключване да твърди, че операцията се извършва
направено на споделен ресурс, като по този начин други теми блокират тук?
Доколкото знам
Този въпрос не е валиден за повече или по-скоро новите процесори на Intel
като заключването се прави на кеш линии.

Благодаря предварително.

Отговори:

2 за отговор № 1

Това е много въпроси!

Как ще се върти по време на цикъл да бъде по-ефективен от блокирането на mutex?

Ако ресурсът е до голяма степен неконцентриран, средно не трябва да се върти дълго. Това може да го направи по-евтин от използването на мутекс.

Добрият дизайн, използващ мютексите, също гарантира, че системата напредва, така че не е ли БЛОКЛЯНЕ по дефиниция?

Вероятно е по-справедливо за чакащите нишки. Ако се върти, докато чака ресурс, може би ще трябва да чака дълго "нищожен" конец.

Така че, не е ли заключен-свободен нещо като spinlock?

Ако имате добра идея как да направите алгоритъм без заключване, може да не се наложи да се въртите изобщо.

Има ли ": memory" в горепосоченото събрание означава ограждане на паметта? Ако отговорът е „да“, не е ли необходимо около 100 цикъла за изпълнение?

Да, това е ограждане на паметта от системи, които се нуждаятче. Синхронизирането на много процесорни кешове отнема много време (вероятно повече от 100 часовника). От друга страна, спинлок или мутекс също ще се нуждаят от мемориални огради, за да работят правилно.

Инструкцията за заключване тук не твърди, че операцията се извършва на споделен ресурс, като по този начин други теми блокират тук?

Това е различен тип блокиране, вероятно на хардуерно ниво. техен ПРОЦЕСОР.


2 за отговор № 2
  1. без заключване по някакъв начин използва някакъв вид въртененеща. Но когато говорим за спин като заключване, обикновено искаме да синхронизираме големи блокове от код. И когато говорим за без заключване, то е насочено към една задача, което обикновено е само една инструкция. Първият се върти, когато се прави нещо дълго, и второто, когато се върти, когато е направено нещо кратко. Първият продължава да се върти, а второто "въртене" е просто "повторен опит".

  2. ако не допусна грешка, това "памет" означава неоптимизирате променливите на паметта в регистърната променлива. (Не е съвсем прав. Точно това казва на компилатора, че използването на паметта трябва да бъде силно подредено.

  3. инструкцията за заключване не е толкова бърза, колкото \ tно все пак по-бързо от превключването на контекста. Но това е по-бавно, така че обикновено при писане на нещо предене, първо ще направим тест без блокиране. Ако мине, ще направим заключената.