Оқулық «Федералдық білім беруді дамыту институты»


WINDOWS ПРОЦЕСТЕРІ ЖӘНЕ ПРОЦЕСАРАЛЫҚ



Pdf көрінісі
бет133/158
Дата01.07.2023
өлшемі3.83 Mb.
#475485
түріОқулық
1   ...   129   130   131   132   133   134   135   136   ...   158
операциялық жуйелер

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);
Жаңа ағымдар мен процесті туындататын бағдарламаның үлгілерін 
қарастырамыз: 


Достарыңызбен бөлісу:
1   ...   129   130   131   132   133   134   135   136   ...   158




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет