Кіріспе

PCLSRing (сондай-ақ Program Counter Lusering) – ITS операциялық жүйесінде бір процесс екінші процестің күйіне қатынау тәртібіндегі сақталу принципін сипаттау үшін қолданылатын термин.

ITS-шешімі: ашық қайта іске қосу

Егер жүйелік шақыру қолжетімділікке дейін аяқталмаса, оны қайта іске қосу қажет. Бұл контекст жүйелік шақыруға кірген сәттен сақталады, ал шақыру аргументтері операцияның қандай бөлігі орындалғанын көрсету үшін жаңартылады. I/O операциясы үшін бұл буфердің бастапқы мекенжайының бұрын берілген деректерге қарай жылжуын, ал берілуге тиіс деректердің ұзындығының сәйкесінше қысқаруын білдіреді. B процесімен өзара әрекеттесу аяқталғаннан кейін А процесі орындалуын жалғастырады және жүйелік шақыру тоқтаған жерден қайта басталады. Бұл техника бағдарламалық қамтамасызда PDP 10 аппараттық құралдарында істеген нәрсені имитациялайды. Кейбір PDP 10 командалары, мысалы BLT, үзіліс немесе бет қатесі салдарынан толық орындалмауы мүмкін. Команданы өңдеу барысында PDP 10 команда аргументтерін сақтайтын тіркегіштерді өзгертеді, содан кейін команданы жаңа аргументтермен қайта орындауға болады, осылай қалған жұмыс аяқталады. PCLSRing жүйелік шақыруларға да осы әдісті қолданады. Бұл кейбір қосымша күрделілікті талап етеді. Мысалы, пайдаланушы кеңістігіндегі жад беттері ITS жүйелік шақыру кезінде беттен шығарылмайды. Егер мұндайға рұқсат берілсе, жүйелік шақыру PCLSRed болғанда және аргументтерді жаңартуға тырысқанда, аргументтерді қамтитын бет болмауы мүмкін, соның салдарынан жүйелік шақыру тоқтатылып, PCLSR-дің сәтті орындалуына кедерес келтіреді. Мұны болдырмау үшін ITS жүйелік шақыру кезінде алғаш рет қол жеткізілгеннен кейін пайдаланушы кеңістігіндегі жад беттерін беттен шығаруға рұқсат бермейді, ал жүйелік шақырулар әдетте пайдаланушы кеңістігіндегі қажетті беттерге қол жеткізуден басталады.

Unix-шешімі: талап бойынша қайта жегу

Бұл UNIX операциялық жүйесінде қолданылатын тәсілмен салыстырыңыз, онда операцияны қайта бастау мүмкіндігі бар, бірақ ол көзге көрінбейді. Оның орнына, I/O операциясы нақты көшірілген байттар санын қайтарады (немесе егер операция бір де бір байт көшірілмей тұрып үзілген болса, EINTR қатесін), ал барлық байттар көшірілгенге дейін операцияны қайта бастауды тексеру және басқару жауапкершілігі қосымшаға жүктеледі. Ричард П. Габриэль UNIX философиясында мұны "жаманрақ - жақсырақ" принципінің мысалы ретінде келтірген.

Асинхронды тәсілдер

Басқаша тәсіл мүмкін. Жоғарыда көрсетілгендей, жүйелік шақыру синхронды болуы керек – яғни, шақырушы процесс операция аяқталғанша күтуі тиіс. Бұл қажеттілік емес: OpenVMS операциялық жүйесінде барлық I/O және басқа уақытты көп алатын операциялар бастапқыда асинхронды болып келеді, яғни жүйелік шақырудың мағынасы – "операцияны бастап, ол аяқталғанда осы хабарламалардың бірін немесе бірнешеуін беру" және содан кейін шақырушыға дереу қайтару. Қолжетімді хабарламалардың стандартты жиынтығы бар (мысалы, оқиға белгісін қою немесе асинхронды жүйелік қақтыруды жіберу), сондай-ақ процесті күту кезінде тоқтатуға арналған жүйелік шақырулар жиынтығы да бар, олар а) ITS түсінігінде толыққанды қайта іске қосылады және б) уақытты көп алатын жүйелік шақырулар жиынтығынан әлдеқайда аз. OpenVMS уақытты көп алатын барлық жүйелік шақырулардың "операцияны бастап, аяқталуын күту" синхронды нұсқаларын ұсынады. Бұл "нақты асинхронды операцияны орындау", содан кейін "операция оқиға белгісін орнатқанша күту" арқылы іске асырылады. Осы уақыт аралығында процесс контексіне кез келген қолжетімділік, оқиға белгісін күту шақыруына (қайта) кіруге дайын екенін көрсетеді.