Защо изпреварването не решава инверсията на приоритета?

Бих искал да знам защо изпреварването не решава проблема с приоритетната инверсия?
Ако имаме изпреварващо ядро. Тогава защо проблемът с инверсията на приоритет не се решава?


person Rasmi Ranjan Nayak    schedule 05.07.2012    source източник
comment
Моля, обяснете защо мислите, че решава...   -  person lvella    schedule 05.07.2012
comment
Този въпрос принадлежи на programmers.stackexchange.com   -  person RedX    schedule 05.07.2012
comment
@lvella: Мисля, че е така, защото проблемът с инверсията на приоритета се случва, когато highest priority task чака и medium priority task пристига. В preemption задачата с най-висок приоритет изпреварва задачата с по-нисък приоритет, тогава има no question of приоритетно наследяване, доколкото мисля. Не мислиш ли така?   -  person Rasmi Ranjan Nayak    schedule 05.07.2012
comment
@RedX: Защо мислиш, че този въпрос принадлежи на programmers.stackexchange.com?   -  person Rasmi Ranjan Nayak    schedule 05.07.2012
comment
Защо да затваряме този въпрос? Моля, кажете ми или ме посъветвайте.   -  person Rasmi Ranjan Nayak    schedule 05.07.2012
comment
@RasmiRanjanNayak Това не е инверсия на приоритета, мисля, че не разбрахте наистина проблема.   -  person lvella    schedule 05.07.2012
comment
Вярвам, че мястото му е там, защото не става въпрос за проблем с кода, който имате, а за по-общи алгоритми, които IMHO пасват по-добре на програмистите.   -  person RedX    schedule 05.07.2012
comment
@RedX Не, тук принадлежат алгоритмите и теорията на операционната система, не програмистите. Програмистите са свързани с междуличностните отношения и бизнес решенията.   -  person Potatoswatter    schedule 05.07.2012
comment
@Potatoswatter Опа, тогава може да съм объркал нещо, извинявай.   -  person RedX    schedule 05.07.2012
comment
Единственият друг кандидат сайт, към който това може да принадлежи, е Теоретична компютърна наука, но мисля, че е по-подходящо тук, особено след като няма дълбок теоретичен интерес към въпроса.   -  person R.. GitHub STOP HELPING ICE    schedule 05.07.2012


Отговори (6)


Добре, да кажем, че имаме два процеса. Нека също приемем, че процесът с по-нисък приоритет получава заключване. Когато процесът с по-висок приоритет стане готов, той изпреварва другия процес. Ако процесът с по-висок приоритет се нуждае от това заключване, той не може да го получи поради другия процес, който има по-нисък приоритет. Това означава, че процесът с по-нисък приоритет блокира този с по-висок приоритет. Той предотвратява изпълнението на процес с по-висок приоритет. Това се нарича "инверсия на приоритета".

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

person aydinkahriman    schedule 05.07.2012
comment
Всъщност увеличаването на приоритета когато се получи заключване не е това, което означава наследяването на приоритета и вероятно е лоша идея. Наследяването на приоритет означава увеличаване на приоритета само когато нишка с по-висок приоритет чака да получи заключването. - person R.. GitHub STOP HELPING ICE; 05.07.2012
comment
@ R.. - Да, прав си. Опитах се да кажа същото в последното си изречение. Увеличаването на приоритета не трябва да блокира другите процеси с по-висок приоритет, които нямат нищо общо с нашата ключалка. - person aydinkahriman; 05.07.2012
comment
@R.. Този протокол е приоритетен таван. Където ключалката има присъщ приоритет, до който нишката се повдига, когато придобие ключалката. Това се прави най-вече на операционна система в реално време, когато знаете предварително кои приоритети имат вашите нишки и кой от какво заключване се нуждае. - person RedX; 06.07.2012
comment
Не гласувам против или нещо подобно, но все пак мисля, че не е ясно. Това не е придобиване на заключване, необходимо за процес с по-висок приоритет, което увеличава приоритета на нишката; всъщност придобиването на такова заключване е невъзможно, освен ако нямате предвид заключване, което може да е необходимо на процес с по-висок приоритет по-късно. Това е действието на процеса с по-висок приоритет, който впоследствие изчаква заключването, което повишава приоритета. - person R.. GitHub STOP HELPING ICE; 06.07.2012
comment
Въздишка. IMO това не е инверсия на приоритета, двата процеса споделят ресурс и това е очакваното поведение. Приоритетната инверсия се появява, когато 3-ти процес (между другите 2 по приоритет), който не споделя ресурса, е готов за изпълнение. Сега той изпреварва задачата за задържане на ресурси с нисък приоритет, като допълнително забавя, когато задачата с висок приоритет в крайна сметка ще се изпълни. Почти всеки друг отговор под този приет отговор е правилен. Освен това вярвам, че сте описали тавана на приоритета, а не наследяването на приоритета. - person Dan; 08.07.2012

Нека 3 нишки A, B, C със съответния приоритет Висок, Среден, Нисък.

C получава процесора и взема ключL. Тогава B се събужда от някои събития и изпреварва C. Сега A се събужда и получава процесора чрез изпреварване на B. A иска ключалката L, но не успява, защото L вече е собственост на C. A се изключва поради липса на заключване и връща процесора на B. Трябва да изчакаме B да завърши, което в крайна сметка ще завърши с връщане на процесора на C. Cще завърши и освободи заключването, което най-накрая ще събудиA.

Това е инверсия на приоритет, защото B се изпълнява, докато имаме нишка A в системата с по-висок приоритет, чакаща завършване на нишка с по-нисък приоритет (C в този случай).

Между другото, решението е приоритетно наследяване.

person Benoit    schedule 05.07.2012
comment
Може да се поправи и с хакване.. Не е най-доброто решение, но все пак решение. - person Alexey Frunze; 05.07.2012
comment
Един мой колега веднъж имаше интересна идея, че планировчикът може да поддържа DAG (е, надявате се, че е ацикличен) на зависимостите между нишките, които в момента са блокирани от обекти за синхронизация, притежавани от други нишки. Тогава всеки път, когато искате да планирате A, но той е блокиран, вместо това следвате DAG до листен възел (в този случай C) и го изпълнявате вместо A. Той обаче никога не го е внедрил и имаше куп усложнения, които бяха няма да бъде решен без подробен проект. Имаше потенциала да бъде по-справедлив от обикновеното приоритетно наследяване, особено. с WaitForMultipleObjects. - person Steve Jessop; 05.07.2012
comment
Тези точки са интересни и си заслужават по-задълбочено копаене. Лично аз се чувствам доста комфортно с идеята да не споделям ключалки между нишки с различен приоритет. Но аз основно работя върху критични/вградени системи и ограниченията са различни. - person Benoit; 05.07.2012

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

Това не е достатъчно, защото задачата с нисък приоритет съдържа ресурс, от който се нуждае задачата с висок приоритет.

Сега, ако ресурсът може просто да бъде отнет (различен вид "изпреварване"), тогава това наистина ще реши инверсията на приоритета. Но това обикновено не е възможно, тъй като полузавършеното действие на задачата с нисък приоритет би довело до несъответствия.

person starblue    schedule 05.07.2012

Да предположим, че имате 3 процеса:

  • А - висок приоритет
  • B - нормален приоритет
  • C - нисък приоритет

и също така, че A и C използват, да речем, един и същ файл (това може да е всеки споделен ресурс), чието използване трябва да бъде синхронизирано.

Сега да предположим, че нито A, нито B са готови за изпълнение, а C се изпълнява и получава заключването за използване на файла. Докато C държи заключването на файла, A се подготвя за изпълнение и операционната система изпреварва C и изпълнява A . A се изпълнява до степен, че също има нужда от файла и когато се опита да получи заключването, се блокира, защото C държи заключването. Ако междувременно B е готов за изпълнение, той ще бъде изпълнен вместо A, защото A не е готов за изпълнение. За да бъде готов A, заключването на файла трябва да бъде освободено от C, а C няма да стартира и да освободи заключването, защото по-високо изпълнява се приоритетен процес B. Така A чака C, който на свой ред чака B. Самото изпреварване на B в тази ситуация няма да е от полза, защото A не е готов и няма да бъде, освен ако C не стартира и C не може да се изпълни, тъй като току-що избраният по-висок приоритет B е готов за изпълнение.

person lvella    schedule 05.07.2012

От Wiki

Обмисли,

L --> Задача с нисък приоритет
H --> Задача с висок приоритет
M --> Задача със среден приоритет
R --> Ресурс

Стъпка 1: L придобива R
Стъпка 2: H иска R (В момента се използва с L. така че H ще изчака L да се откаже от R.)
Стъпка 3: M пристига (M е неблокиран Задача, т.е. не изисква R)
Стъпка 4: L е изместен от M. (така че L не може да се откаже от R. Поради това H не може да стартира.)

След като M приключи с изпълнението си, L ще се откаже от R. След това само H може да продължи. В сценария по-горе задача със среден приоритет (M) се изпълнява преди задача с висок приоритет (H).

Това е действителният сценарий за инверсия на приоритета в превантивното ядро.

person Jeyaram    schedule 05.07.2012

инверсията на приоритета е проблематичен сценарий при планирането, когато задача с по-висок приоритет е индиректно изпреварена от задача с по-нисък приоритет, което ефективно "инвертира" относителните приоритети на двете задачи.

Помислете, че има задача L с нисък приоритет. Тази задача изисква ресурс R. Помислете, че L работи и придобива ресурс R. Сега има друга задача H с висок приоритет. Тази задача също изисква ресурс R. Помислете, че H започва, след като L е придобил ресурс R. Сега H трябва да изчака, докато L се откаже от ресурс R. Всичко работи според очакванията до този момент, но възникват проблеми, когато нова задача M (която не използва R) стартира със среден приоритет през това време. Тъй като R все още се използва (от L), H не може да работи. Тъй като M е деблокирана задача с най-висок приоритет, тя ще бъде планирана преди L. Тъй като L е изтеглен от M, L не може да се откаже от R. Така че M ще работи, докато не приключи, след това L ще се изпълнява - поне до момент, в който може да се откаже от R - и тогава H ще изпълни. По този начин, в сценария по-горе, задача със среден приоритет се изпълнява преди задача с висок приоритет, което на практика ни дава приоритетна инверсия.

person Pratik    schedule 05.07.2012