WINDOWS ПРОЦЕСТЕРІ ЖӘНЕ ПРОЦЕСАРАЛЫҚ
ӨЗАРА ӘРЕКЕТТЕСУ
Windows тобының операциялық жүйелері, әсіресе Windows NT
ядросы негізінде жүйелер (Windows 2000, Windows XP, Windows
Vista), процестерді синхрондау үшін құралдардың кең жинағын
232
ұсынады және процесаралық өзара әрекеттесуді ұйымдастырады. Осы
тарауда біз Windows тобының операциялық жүйелеріндегі өзара
әрекеттесуді ұйымдастырудың кейбір тәсілдерін қарастырамыз.
233
10.6.1. Процесстер мен ағындар
Басқа операциялық жүйелердегі сияқты процестер (process)
пайдаланушыға міндеттерді шешуге мүмкіндік беретін, негізгі
обьектілер болып табылады. Әр процесс сәйкес келетін қосымшаларды
орындауға қажетті ресурстарды ұсынады. Әр процесс өзіне
орайластырылған виртуалды мекенжай кеңістігіне; орындалатын код;
ашық жүйелік обьектілермен байланысты дескрипторлар; қауіпсіз
мәнмәтіні; процестің бірегей идентификаторы; айнымалы шеңберлер;
бастапқылық класы; процеске қолжетімді виртуалды жадының
минималды және максималды өлшемі; ең кемі басқарудың бір ағымына
ие.
Әр процесс старт кезінде бір-жалғыз басқару ағымын (thread) іске
асырады, оны алғашқы ағым (primary thread) деп атайды. Бірақ әр ағын
жаңа ағым құра алады. Бұл мағынада процесс негізгі есептеуші
жұмысын атқаратын көптеген ағымдардың капсулданатын контейнерін
ұсынады.
Процестің барлық ағымдары өздерінің арасында виртуалды
мекенжай кеңістігін және жүйелік ресурстарды бөліседі. Одан басқа, әр
басқару ағымы ерекше жағдайлардың жеке өңдеушілеріне,
басымдылыққа, ағымның жергілікті жадына, ағымның бірегей иден-
тификаторына және ағым қазіргі мәнмәтін туралы деректеріне ие.
Ағым мәнмәтіні (thread context) процессор тіркелімінің қазіргі
мәндерін құрайды; ядро шақыртулар қамшысы, ағым шеңберінің
блогы, ағым қамшысының өлшемі туралы ақпараттар құраушы және
аталық процестің мекенжай кеңістігіндегі пайдаланушы қамшысы.
Одан басқа, ағымдар құқықты аталық процестен мұраға алмай шеттен
алып пайдаланған жағдайда қауіпсіздіктің жеке мәнмәтініне ие болады.
Windows NT (Windows NT 3.x — 4.0, Windows 2000, Windows XP,
Windows Vista және Windows тобының барлық серверлік операциялық
жүйелері) ядросына және Windows 9x (Windows 95, Windows 98 и
Windows ME) негізделген операциялық жүйелер ығыстырылған
көпміндеттілікті (preemptive multitasking) қолдайды. Ол бірнеше
процесте бірнеше ағымдардың орындалуының әсерін құруға мүмкіндік
береді. Windows-ң көптеген алғашқы жүйелерінде (мысалы, Windows
3.x құрамасы) ығыстырылмайтын көпміндеттілігіне (nonpreemptive
multitasking) негізделген, ағымдардың бір уақытта орындауының
қарапайым моделін ұстанған болатын.
Ығыстырылатын көпміндетті операциялық жүйе кезінде, ал
нақтырақ, ығыстырылатын жобалаушы (preemptive scheduler) деп
234
аталатын арнайы жүйелік процесс уақыт шегіне байланысты оны
кідіртетін жағдайға ауыстыра отырып, ағындағы процесті уақытша
тоқтатады. Одан кейін жобалаушы, оның басымдылығына байланысты,
ертерек кідірткен процестерді оятады және осы процесс үшін
процессорлық уақыттың квантын белгілейді. Осы механизм
«мәнмәтінді
ауыстыру»
(context
switching)
атауына
ие.
Ығыстырылмайтын көпміндеттілік кезінде жадыда бір уақытта
бірнеше процесс қатысуы мүмкін, бірақ процессорлік уақыт, процестің
өзі немесе пайдаланушы процессорды босатқанға дейін, негізгі
процеске белгіленеді.
Көп процессорлы жүйелерде, операциялық жүйелер Windows NT
ядросының (немесе ядролар) негізінде жүйеде орнатылған қанша
процесс болса, сонша ағымдардың бір уақытта орындалуына
мүмкіндік береді. Бұл жағдайда, ұқсастыру емес, шын көпміндеттілік
пайда болады.
Пайда болған жаңа процестер үшін CreateProcess() функциясы
қолданылады:
include
BOOL WINAPI CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation);
CreateProcess() функциясын шақырған процесс, аталық-процесс деп
аталады, ал бұл функцияны шақырудың нәтижесінде пайда болған
процесс процесс-тобы деп аталады. Процесс-тобы, оны туындатқан
процеске толық тәуелді емес. Бірақ аталық процесс туындаған процесті
бақылауға және онымен байланысты кейбір оқиғаларды барлауға
мүмкіндік алады.
LpApplicationName параметрі орындалуға міндетті бағдарламаның
атауын береді. Егер осы параметр NULL тең болса, онда іске
235
асырылатын бағдарламаның атауы lpCommandLine параметрінде
берілуі мүмкін. Сондай-ақ осы параметрде, іске асырылатын
бағдарламаға жіберілетін параметрді де береді.
Егер lpCommandLine параметр NULL мәніне ие болса, онда іске
асырылатын бағдарлама lpApplicationName параметрінен алынады.
Егер екі жол да NULL тең болмаса, онда lpApplicationName параметрі
іске
асырылатын бағдарламаны
береді,
ал
параметрінде
lpCommandLine осы бағдарламаға арналған аралықтармен бөлінген
тізімді жібереді.
LpProcessAttributes параметрі құрылатын процеске, әдепкі құқыққа
қарағанда қолжетімділік құқығын береді. Одан басқа, параметр
көрсететін құрылымның бір элементі, CreateProcess() функциясының
шақыртуы нәтижесінде құрылған процесс дескрипторын көрсетуге
қолданылады, ол процесс-тобын мұраға алуға болады.
LpThreadAttributes параметрі, lpProcessAttributes параметріндей
қолданылады. Бірақ егер lpProcessAttributes параметрі құрылған
процестің параметрін өзгертуге арналған, онда lpThreadAttributes
параметрінде жіберілетін ақпараттар құрылатын процестің алғашқы
ағымдарының параметрлерін өзгертуге қолданылады.
ВInheritHandles параметрі еншілес процесс аталық-процестен
мұраға қалатын дескрипторды мұраға ала ма (TRUE) және жоқ па
(FALSE) соны көрсетеді. Сонымен қатар, ашылған файлдың
дескрипторы ғана емес, каналдар және басқа жүйелік ресурстардың
құрылған процестің дескрипторын да мұраланады. Мұраланған
дескрипторлар, қолжеткізу құқығындағы мәндерге ие болады. Айта
кететін жайт, барлық дескриптор емес, мұралануға белгіленгендер ғана
мұраланады. Дескриптордың бұл қасиеттері, процесс аралық өзара
әрекеттесуді ұйымдастыру кезінде маңызды.
DwCreationFlags параметрі құрылатын процестің басымдылық
класын беру үшін сондай-ақ процестің қасиеттерін басқару үшін де
қолданылады. Мысалы, егер аталық-процесс және құрылатын процесс,
консолды
қосымша
болып
табылады
және
параметрде
CREATE_NEW_CONSOLE мәні беріледі, онда құрылатын процесс
өзінің консолды жеке терезесіне ие болады. Бұл көрсетпегенше жаңа
терезе ашылмайды, ол құрылған процесс аталық-процестің консолды
терезесін мұраға алады.
LpEnvironment
параметрі, құрылатын процестің айнымалы
шеңберін өзгерту үшін қолданылады және жаңа процесс үшін шеңбер
блогына нұсқаушыны құрайды. Бұл блок нөлмен аяқталады және мына
жолдардан тұрады:
236
name=value\0
егер берілген параметр NULL мәніне ие болса, шеңбер аталық-
процестен мұраланады.
LpCurrentDirectory параметрі, құрылатын процесс үшін каталогты
және ағымдағы дискіні беру үшін қолданылады. Егер параметр NULL
тең болса, онда ағымдағы дискі және каталог аталық-процестен
мұраланады.
LpStartupInfo параметрі, ол да құрылатын процестің ерекшеліктерін
өзгертуге арналған. Берілген параметр құрылатын процес терезесінің
бастапқы координаталарын беруге мүмкіндік береді, терезені
көрінетін немесе жасыру керектігін анықтайды, сондай-ақ, аталық-
процеспен, процесс-тобымен консолға шығарылатын ақпараттарды
алуға немесе бұл ақпараттарды файлға не құрылғыға қайта бағыттауға
арналған стандартты құрылғылардың дескрипторын қайта анықтауға
мүмкіндік береді. Осы параметр құрылатын процестің басқа да
ерекшеліктерін өзгертуге мүмкіндік береді.
Параметр lpProcessInformation, қайтарылушы болып табылады. Бұл
параметрде құрылған процестің және оның бастапқы ағынының
идентификаторы мен дескрипторын қайтарады. Берілген функция 0
қайтарады, егер белгілі бір себеппен жаңа процесс құралмаса немесе
мәні 0-ден айырмашылықта болса, онда процесс сәтті құрылған.
Жаңа процесті құруда жүйеден бас тарту себептерінен, виртуалды
жадының таусылуы, іске асырылатын бағдарламаның бағдарлама
немесе сценарий болмауы, процесс кестелерінің толып қалуы мүмкін.
Одан басқа, жаңа процестің туылуына, бір процесс үшін дескриптор
саны
шегіне
жауап
беретін,
реестрдің
HKLM\
Software\Microsoft\Windows
NT\CurrentVersion\Windows\
UserPro-
cessHandleQuota параметрі әсер етеді. Әдеттегідей Windows XP және
Vista жүйелеріндегі осы параметр үшін 10 000 мәні орнатылған, бірақ
жүйенің әкімшілігі бұл мәнді өзгерте алады және осылайша қосылатын
бағдарламаның саны шектелуін өзгерте алады.
Сондай ақ қосылатын процесс үшін қорытынды команданың
ұзындығына жүйелік шектеу қойылады. Ол ұзындығында 32 767
символдан аспауы қажет.
Жаңа
ағымдарды
құру
үшін
CreateThread()
функциясы
қолданылады.
include
HANDLE WINAPI CreateThread(
237
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId);
LpThreadAttributes параметрі, әдеттегідей құқықтардың үздігінен,
қолжетімділік құқығында құрылатын процестер міндеттері үшін
қолданылады. Сондай-ақ осы параметр, құрылған ағымның
дескрипторының процесс тобынан мұралануы болу мүмкіндігін
көрсету үшін қолданылады. Егер де параметр NULL мәніне ие болса,
ағым әдеттегідей құқығын алады, ал ағымның дескрипторы тұқыммен
мұралануы мүмкін емес.
DwStackSize параметрі, байттағы ағымның бастапқы қамшы
өлшемін беруі үшін арналған. Егер де параметр 0 мәнін берсе, онда
қамшы өлшемі, қосымшалар үшін анықталған қамшы өлшеміне сәйкес
келеді.
LpStartAddress параметрінде ағыммен орындалатын, қосымшаның
жергілікті функциясының мекенжайын береді.
LpParameter параметрі, ағымның негізгі функциясына қажетті,
құрылған ағымдарға кіретін мәндерді жіберуі үшін арналған.
DwCreationFlags
параметрі ағымның құрылуын басқарады.
Мысалы, егер осы параметр CREATE_SUSPENDED мәніне ие болса,
онда құрылған ағым, басқа басты ағым оны жаңадан іске қосқанша,
кідіре тұрады.
Қайтарылатын
lpThreadId
параметрі
құрылған
ағым
идентификаторын алу үшін қолданылады. Егер осы параметр NULL
тең болса, онда құрылған ағымның идентификаторы қайтарылмайды.
Егер функцияның шақыртуы жаңа ағымның құрылуымен аяқталса,
функция құрылған ағымның дескрипторын қайтарады. Қарсы
жағдайда NULL мәнін қайтарады.
Жаңа ағым құруда сәтсіз талпыныстардың себебі, жүйе
ресурстарының немесе дескрипторда лимиттің таусылуы болып
табылады. Жаңа ағымның құрылуында сәтсіз талпыныстары болып
жиірек виртуалды жадының таусылуы табылады, егер жүйеде
ағымдардың саны көп болса.
Ағымдағы процестің дескриптор мен идентификаторын қабылдау
үшін GetCurrentProcess() және GetCurrent- ProcessId() функциялары
қолданылады, сәйкесінше:
238
include
HANDLE WINAPI GetCurrentProcess(void);
DWORD WINAPI GetCurrentProcessId(void);
Ұқсас функциялар бар және қазіргі ағымның дескриптор мен
идентификаторды алу үшін:
include
HANDLE WINAPI GetCurrentThread(void);
DWORD WINAPI GetCurrentThreadId(void);
Жаңа ағымдар мен процесті туындататын бағдарламаның үлгілерін
қарастырамыз:
Достарыңызбен бөлісу: |