
- •Мустафина б.М., Сейдахметова г.Е., Әлібиева ж.М.
- •Пәндік оқу - әдістемелік кешені
- •Алматы 2012
- •1. Пәннің оқу бағдарламасы – syllabus
- •Оқытушылар туралы мәліметтер:
- •1.2 Пән туралы мәліметтер:
- •Оқу жоспарының көшірмесі
- •1.3 Пререквизиттер
- •1.6 Тапсырмалардың тізімі мен түрлері және оларды орындау кестесі
- •1.7 Әдебиеттер тізімі
- •1.8 Білімді бақылау және бағалау.
- •1 Модуль бойынша бақылау жүргізуге арналған сұрақтар (1-7 бөлімдер)
- •2 Модуль бойынша бақылау жүргізуге арналған сұрақтар:
- •1.9 Қойылатын талаптар
- •2 Негізгі таратылатын материалдар мазмұны
- •2.1 Курстың тематикалық жоспары
- •2.2 Лекциялық сабақ конспектілері
- •1.1 Windows ож құрылымы Жүйе құрылымының жалпы бейнелеуі
- •2.2. Ағындарды диспетчерлеу және жоспарлау
- •2.3 Ағынды анықтау
- •2.4 Ағындармен жұмыс істеуге арналған api функциясы
- •2.5 Ағындардың приоритеті
- •3.1 Процесстерді басқару
- •3.2 Windows операциялық жүйесіндегі процесстер мен ағындар
- •3.3 Процесстермен жұмыс істеуге арнлаған api функциялар
- •4.2 Ағындарды синхрондау объектілері
- •Мьютекстер
- •5.1 Оқиғалар
- •5.2 Бұғатталған қосымша функциялар
- •7.1. Үймелер
- •7.2 Үйме жадысын басқару
- •8.1 Файлдар мен каталогтарды басқару Файлдарды құру және ашу
- •8.2 Каталогтарды басқару
- •8.3 Файлдар мен каталогтар атрибуттарын алудың басқа әдістері
- •9.1 Файлдарды бұғаттау
- •9.2 Реестр
- •Экспорттелетін идентификаторды анық қосу
- •12.1 Стандартты құрылғылар және консольді енгізу- шығару
- •12.2 Асинхронды енгізу- шығару және аяқталу порттары
- •2.3 Лабораториялық сабақтардың жоспары
- •2.4 Оқытушының басқаруымен студенттің өзіндік жұмысы бойынша оқу жоспары (соөж) (45 сағат)
- •2.5 Студенттің өзіндік жұмысының сабақ жоспары (сөж) (45 сағат)
- •2.6 Өзін өзі тексеру үшін кілтпен көрсетілген тестік жаттығулар
- •2.7 Курс бойынша емтихан сұрақтары
- •Глоссарий
- •Жүйелік программалау
4.2 Ағындарды синхрондау объектілері
Ағындарды және үрдістерді синхрондау үшін арналған Win 32 төрт объектілерді ұсынады. Олардың үшеуі – мьютекстер, семафорлар мен істер – бұлар ядроның объектілері болып табылады және дескрипторлары болады. Төртінші объект - CRITICAL_SECTION. CRITICAL_SECTION объектілерінің ыңғайлылығына және жылдамдығының жоғары болуына байланысты, бұлардың механизмдері қажеттірек.
CRITICAL_SECTION объекті.
Windows операциялық жүйелерінде бір үрдіс (процесс) контекстінде орындалатын параллелді ағындар үшін өзара ерекшелік (взаимного исключения) мәселелері операциялық жүйенің ядросы болып саналмайтын CRITICAL_SECTION типтік объектісінің көмегімен шешіледі. CRITICAL_SECTION типтік объектілермен жұмыс істеу үшін келесі функциялар қолданылады:
// критикалық секцияны инициализациялау
VOID InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
// критикалық секцияға кіру
VOID EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
// критикалық секцияға кіру әрекетін жасау
BOOL TryEnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
// критикалық секциядан шығу
VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
// критикалық секцияны жою
VOID DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
Бұл функциялардың әрбірі CRITICAL_SECTION типтік объектісіне сілтеме жасайтын жалғыз параметрге ие. TryEnterCriticalSelection функциясынан басқа барлық функциялар мәндерді қайтармайды. TryEnterCriticalSelection функциясы егер ағын критикалық секцияға кірген болса нөлдік емес мәнді қайтарады, қарсы жағдайда функция FALSE мәнін қайтарады.
Осы функцялармен жұмыс істеу тәртібін қарастырайық. Ол үшін программаны жобалау кезінде параллелдік ағындарда критикалық секциялар бөлдік делік, бұл критикалық секцияларда осы ағындар жіктейтін ресурстар қолдыналады. Сонда программада CRITICAL_SECTION типтік объектіні анықтаймыз және осы объектінің аты қолданылатын жіктеуші ресурстармен логикалық тұрғыда байланысты деп санаймыз. CRITICAL_SECTION типтік объектісімен жұмыс жасаудан бұрын, оны инициализациялау керек. Бұл үшін InitializeCriticalSelection функциясы арналған. CRITICAL_SECTION типтік объектісі инициализацияланған соң әрбір параллелді ағындарда критикалық секцяға кірместен бұрын EnterCriticalSelection функциясын шақырамыз, ол параллелдік ағындарда орындалып жатқан және бөлінуші ресурстармен байланысты критикалық секцияларға біруақытта кіруге жол бермейді. Бөліуші ресурстармен жұмыс істеп біткен соң, ағын өзінің критикалық секциясынан шығуы керек, бұл LeaveCriticalSelection функциясының көмегімен іске асырылады. CRITICAL_SECTION типтік объектісімен жұмыс істеп біткен соң осы объектімен жұмыс істеген барлық жүйелік ресурстарды босату керек. Осы мақсатында DeleteCriticalSection функциясы қолданылады.
Мьютекстер
Мьютекс обьектісі (ағылшын сөзінен аударғанда mutual exclusion – взаимное исключение) кодтың критикалық секциясына қарағанда, көптеген мүмкіншіліктерді ұсынады. Мьютекске аты және дескриптор беріледі, сондықтан бұл обьектілер әр үрдістер арасында ағындарды синхрондау үшін қолданады. Мьютекс КС-ға ұқсас, ерекшелігі мьютекстер тайм-аут функциясын қолданады және сигнал беру күйіне көшеді. Ағын мьютекстің дескрипторына күту режимін орындаған (функции WaitForSingleObject және WaitForMultipleObjects) кезде мьютексті толықтай иеленеді. Ағын бір мьютексті бірнеше рет қабылдай алады. Соңында ағын мьютексті қанша рет қабылдаса, сонша рет босату керек.
Win32 CreateMutex, ReleaseMutex және OpenMutex функцияларын мьютекспен жұмыс жасағанда қолданады.
HANDLE CreateMutex ( LPSECURITY_ATTRIBUTES lpsa,
BOOL fInitialOwner, LPCTSTR lpszMutexName)
fInitialOwner жалаушасының TRUE мәні ағынды тез арада жаңа мьютексті иеленуді көрсетеді.
lpszMutexName параметрі мьютекстің атын анықтайды. Егер бұл параметр мәні NULL болса, онда мьютекстің аты болмайды. Істер, мьютекстер, семафорлар, файлды көрсететін обьектілер бір кеңістіктегі атты бөлінеді, сондықтан синхрондауланатын барлық обьектілердің әр түрлі аты болуы керек. Ат 260 символ ұзындығымен шектеледі. NULL мәні қайтарылса қате бар екенін хабарлайды.
OpenMutex функциясы аты берілген мьютексті ашу үшін қолданады. Бұл функция әр түрлі үрдістегі ағындарын бір үрдіске берілетіндей етіп синхрондайды.
ReleaseMutex функциясы шақырылған ағын қолданатын мьютексті босатады.
BOOL ReleaseMutex (HANDLE hMutex)
Керек емес (покинутые) мьютекстер
Ағын иеленген мьютекстін босатпай жатып аяқталса, онда мьютекс керек болмай қалады. Ал оның дескрипторы сигналдық күйге көшеді. WaitForSingleObject функциясы WAIT_ABANDONED_0 мәнін қайтарады, ал WaitForMultipleObjects функциясы WAIT_ABANDONED_0 мәні сигналдық күйдегі дескрипторлар керек емес мьютекстер екенін хабарлайды. Сигналдық күйде керек емес мьютекстерге ауысқан дескрипторлар - өте керек нәрсе. Себебі, кодта қате бар екенін көрсетеді.
Семафорлар
Есептегіштің мәні 0 –ден үлкен болғанда кезде семафор- обьектісі сигналдық күйге өтеді, ал есептегіштің нөл мәні кезінде, обьект сигналсыз күйде болады. Ағындар немесе үрдістер күту функцияларының бірін қолданып, қарапайым күтулерін орындайды. Күтуші ағын босаған кезде, семафордың есептегіші бірге азаяды. Семафорлар жұмысына арналған функциялар — CreateSemaphore, OpenSemaphore және ReleaseSemaphore.
HANDLE CreateSemaphore ( LPSECURITY_ATTRIBUTES lpsa,
LONG cSemInitial, LONG cSemMax, LPCTSTR lpszSemName)
cSemMax параметрі семафорға максимал мәнін көрсетеді.
cSemInitial параметрі бастапқы мән, ол нөлден cSemMax арасындағы мәндер. Есептегішті бірге азайту үшін күту функциясын қолдану керек. Бірақ семафорды босату үшін мәнін максимумға дейін көтеруге болады.
BOOL ReleaseSemaphore ( HANDLE hSemaphore,
LONG cReleaseCount, LPLONG lpPreviousCount)
Семафорларды қолдану
Семафорларды қолдануда класикалық түріне семафордың есептегіштерін қолайлы ресурс санын көрсететін түрін айтуға болады. Яғни күту кезегінде тұрған хабарламалар саны туралы. Семафордың максимумы кезектің максимал ұзындығына сәйкес.
Тағы бір қолдану ерекшелігі – жұмысшы ағындар санын шектеу үшін қолданады. Сонымен қатар семафорларды ағындар санын басқару үшін қолданады. Барлық ағындар тоқтатылмаған күйде құрастырылуы мүмкін, одан нөлмен инициализацияланатын семафорға күтулерін бастайды. Ағын – иесі тоқтатылған ағындарды орындаудың орнына, жәй ғана есептегіш мәнімен ReleaseSemaphore функциясын шақырады. Бұл өз кезегінде ағындар саны және одан кейін осы ағындардың жұмысы басталады.
Негізгі әдебиеттер: 1 [ 95-143], 2 [228-246]
Бақылау сұрақтары:
1. Ағындардың синхрондау объектілерін атаңыз ?
2. Қандай объектілер ағындарды процессор – аралық синхрондауға арналған (әр үрдістегі)?
Дәріс 5. Ағындарды синхрондаудағы қосымша әдістері