Връщане на системните функции
Възобновяване на системните функции - секция „Образование“, операционни системи в многозадачна система, възможността за превключване на P.
В многозадачна система не може да се изключи, че процесният превключвател ще настъпи, докато предшестваният процес изпълнява някои от системните функции. В този случай изпълнението на функцията няма да бъде завършено, а ще бъде прекъснато в средата. Предполага се, че изпълнението на функцията ще бъде завършено по-късно, когато прекъснатият процес отново бъде избран за изпълнение.
Проблемът е, че новият текущ процес може да извика същата системна функция. Възниква въпросът: възможно ли е правилно да се изпълни второто извикване на функцията, ако към този момент изпълнението на първото извикване на същата функция не е завършено?
Прост пример за такава ситуация е стартирането на няколко програми в операционната система, всяка от които е блокирана в очакване на въвеждане от клавиатурата чрез извикване на същата функция за въвеждане на системата.
Извиква се функция или процедура, за която е възможно правилното изпълнение на повторното повикване преди завършването на първото повикване връщащ се или повторно влизане.
Проблемът с връщането на функции възниква при програмирането и по съвсем друга причина, не свързана с изпълнението на ОС. Това са рекурсивни функции, т.е. функции, които могат да се извикат директно или индиректно. Основната причина за невъзвръщането на функции отдавна е известна. Състои се в използването на едни и същи места в паметта за формални параметри и локални променливи за различни извиквания на функции. Всъщност, ако при първото извикване на функцията, например, числото 10 се въведе в клетката на локалната променлива X, а при второто - числото 20, тогава след възобновяването на изпълнението на първото повикване, стойността на X ще бъде неправилна.
Лекът за тази форма на невъзвращаемост също е известен отдавна и е вграден във всички уважаващи себе си езици за програмиране, започвайки с C и Pascal. Състои се във факта, че паметта за формални параметри и локални променливи трябва да бъде разпределена в стека на програмата, като всяко ново вложено повикване получава собствен набор от клетки за променливи.
За случая на многозадачна система използването на един стек е неприемливо, тъй като извикванията на функции не са вложени, т.е. първото повикване може да завърши по-рано от второто, което би довело до злоупотреба със стека. Всеки процес получава свой собствен стек, който е част от контекста на процеса.
Друга причина за невъзвръщаемост се отнася до тези I/O функции, които стартират операция и след това изчакват тя да завърши. Повторното обаждане на същото устройство преди завършване на първото повикване може да доведе до грешка. В този случай системата трябва да следи състоянието на устройството и да блокира второто повикване, докато устройството бъде освободено.
Проблемът с връщането на системните функции е много по-остър за превантивните операционни системи, тъй като процесният превключвател може да възникне по време на изпълнението на която и да е функция. При непредупредително изпращане е достатъчно да се осигури повторно прилагане само на малък брой блокиращи функции.
При преминаването от непретенциозния Windows 3.x към предимствения Windows 95, един от основните проблеми беше постоянството на голям брой невъзстановяващи се системни функции в кода. Проблемът беше „решен“ чрез въвеждане на семафор, който блокира многократни повиквания за голям брой функции. Неприятна последица от това беше взаимното инхибиращо влияние на процесите. Windows NT няма този проблем, всички функции се изпълняват обратно.