К оммутатор ды пайдалану мысалы 10 страница



Қолданушылық ағын және ядролардың ағындары

Көпағындылықтың моделі. Операциялық жүйеде көпағындылықтың іске асуы бірнеше абстракцияның деңгейлерінен тұрады. Қолданушының көзқарасы бойынша оның бағдарламасын басқару қолданушылық деңгей ағындарының кітапханасы (user threads) арқылы жүзеге асады. Нақты операциялар жайлы кейінірек қарастырамыз. Қазір ағындардың қолданушылық деңгейлеріндегі моделдерін қарастырамыз:

 POSIX Pthreads – POSIX стандартымен спецификацияланған ағындар және POSIX қосымшаларында қолданылады.

Mac C-threads –MacOS жүйесіндегі қолданушылық ағындар;

Solaris threads –Solaris операциялық жүйесіндегі қолданушылық ағындар.

Қолданушыық ағындар көрсетілетін төмен деңгейлі ағындар- ядро ағыны (kernel threads) деп аталады. Олар операциялық жүйеның ядро деңгейінде қолданылады. Әртүрлі операциялық жүйелерде қолданушылық ағындардың жүйеде бейнеленуі әр түрлі. Мысалы, келесі операциялық жүйелерде өзінің спецификациясымен ядро ағынының моделдері іске сады:

- Windows 95/98/NT/2000/XP/2003/2008/7;

- Solaris;

- Tru64 UNIX;

- BeOS;

- Linux.

Көп деңгейліктің бірнеше моделдері бар- ядро ағынында қолданушылық ағындарды бейнелеу тәсілдері. Көпағындылықтың келесі моделдері орындалуы мүмкін:

- көп/ бір моделі (many-to-one) – бірнеше қолданушылық ағындарды ядроның ағындардың біреуінде көрсетіледі. Бұл модель көп жүйелік ағындары жоқ операциялық жүйелерде қоданылады.

Аталған модель келесі суретте көрсетілген.

 


Сурет 2. Көпағындылықтың «көп/бір» моделінің схемасы

 

- бір/бір моделі – әрбәр анықталаған ядро ағынында қолданушылық ағынды біресепті көресетілуі. Осы модельді қолданатын операциялық жүйелер:Windows 95/98/NT/2000/XP/2003/2008/7; OS/2.

Аталған модель келесі суретте көрсетілген

 


Сурет 3. Көпағындылықтың « бір/бір» моделінің схемасы

 

- Көп/көп моделі (many-to-many) – бірнеше қолданушылық ағындарды бірнеше жүйелік ағындарда көрсетеді. Бұндай модель операциялық жүйеде көп жүйелік ағындарды құрады. Аталған моделді қолданатын операциялық жүйелерге мысал: Solaris, Windows NT / 2000 / XP / 2003 / 2008 / 7 ThreadFiber пакеттерімен

Бұл модель Сурет 4-те көрсетілген

 


Сурет 4. Көпағындылықтың «көп/көп» моделінің схемасы

Көпағындылықтың мәселесі

Көпағындылық- өте күрделі,себебі әлі толық зерттелмеген әрі толық қалыптаспаған аймақ және көптеген маңызды мәселелері бар. Солардың кейбіреуін қарастырып өтейік.

fork() және exec()жүйелік шақыртулардың семантикасы. Классикалық UNIX операциялық жүйесінде fork жүйелік шақыртуы өзінің адрестік кеңістігі бар ауырсалмақты үрдіс құрады. Бірақ, төменнен жоғарыға қарай бағдарламалардың сәйкестігін қолдау мақсатында осы семантиканы сақтау қажет, ал көпағындық болса, жаңа жүйелік шақырту көмегімен енгізіледі.

Ағындар жұмысын тоқтату. Маңызды мәселелердің бірі ағындар жұмысын тоқтату болып табылады. Мысалы: Егер ата-аналық ағын тоқатылса, оған тәуелді ағын тоқтытылу қажет пе? Егер бірнеше ағынды құратын стандартты ағын тоқтатылса, оның барлық ағындары тоқтатылу керек пе? Осы сұрақтардың жауабы барлық операциялық жүйелерде әртүрлі.

Сигналдарды өңдеу. UNIX операциялық жүйесінің сигналы- қателік жағдайларындағы төмендеңгейлі механизмдерді өңдеу. Сигналдарға мысал: SIGSEGV- сегменттің бұзылуы, SIGKILL- kill командасын орындау және жою үрдісінің сигналы.

Қолданушы signal жүйелік шақыртуы арқылы өзінің өңдеуші-процедура сигналын анықтайды. Бұның мәселесі мынада: көпағынды бағдарламада сигналдар қалай таралады және олар қандай ағын арқылы өңделеді?

Көп жағдайларда бұл сұрақ былай шешіледі: сигналгенерацияланған ағын арқылы өңделеді және осы ағынның орындалуына әсер етеді.

Қазіргі кездегі объектілі-бағытталған операциялық жүйелерде сигнал тұжырымдамасы жоғары деңгейлі ерекшелік (исключения) (exception) тұжырымдамасымен алмастырылған. Ерекшелік тәртіп бойынша ағындардың стегімен таралады. Ерекшелікті өңдеудің ұқсастық моделі Java және .NET жүзеге асырылған.

Ағындар топтары. Мысалы мынандай күрделі есептерде : әртүрлі ағындар анында моделдеу есебінінің құрылымдау және ағындар тобының тұжырымдамасын қажет етеді. Ағындар тобы- топтық операциялары анықталған және аты бар ағындардың жиыны. Ағындардың тобы алғаш рет Java-да іске қосылған. NET-те ағындардың пулын (ThreadPool)  тиімді қосылуын атап өту қажет.

Ағындардың жергілікті деректері (thread-local storage - TLS)- бір ғана ағынға тән және осы ағында қолданылатын деректер. Осы деректердің көпағындылықта қажеттілігі – күрделі есепті шешетін параллелді әдістің бірі, онда әрбір ағын берілген бөлікті шешуде жұмыс істейді. Қазіргі операциялық жүйелер және платфорламалардың барлығы ағындар деркетірінің жергілікті тұжырымдамасын қолдайды.

Ағындарды синхрондау. Барлық ағындар үрдістер сияқты жалпы ресурстарды қолдана алады және жалпы оқиғаға әсер етеді.

Тығырық (тығырық) және оларды жою жолдары. Ағындар үрдістер сияқты бір-бірін бұғаттай( блокровка) алады.

POSIX (Pthreads) ағындары

Көпағындылықтың нақты моделі ретінде POSIX ағынын қарастырамыз. POSIX-тегі көпағындылық ағындарды құратын және синхрондауға арналған API –ді сипаттайтын IEEE 1003.1c стандартымен спецификацияланған. POSIX стандарты ағындардың кітапхана тәртібін анықтайды.

Ағындарды іске қосу автордың қалауынша POSIX сәйкестік кітапханасын таңдауымен жүзеге асады. POSIX ағындары UNIX операциялық жүйесінде кең таралған және Solaris және Windows NT операциялық жүйелерінде де қолданылады.

POSIX стандарты ағындар үшін деректердің екі типін анықтайды:

pthread_t – ағындар дескрипторы; pthread_attr_t – ағындардың атрибуттар жиынтығы.

POSIX стандарты ағындарды басқару келесі функциялар жиынтығымен спецификацияланады:

- pthread_create():ағынды құру

- pthread_exit(): ағынды аяқтау

- pthread_cancel():  ағынды болдырмау

- pthread_join():  келесі ағын тоқтағанға дейін ағынның орындалуын бұғатау.

-  pthread_detach():  ағындар орын алатын ресурстарды босату pthread_attr_init(): ағындар атрибуттарының құрылымын инициализациялау

- pthread_attr_setdetachstate(): ағын аяталғаннан кейін ол автоматты түрде ресурстарды босатуды жүйеде көрсетеді.

- pthread_attr_destroy():  ағын атрибуттарын жадыдан босатады.

POSIX ағынын синхрондаудың мынандай примитивтері бар:мюьтекс тер (mutexes) – семафора ұқсастықтары және шартты  айнымалылар  (conditional variables)

- pthread_mutex_init() –мюьтексті құру;

- pthread_mutex_destroy() – мюьютексті жою;

-  pthread_mutex_lock() –мюьтексті аяқтау;

- pthread_mutex_trylock() – мюьтексті алдын-ала жабу

- pthread_mutex_unlock() –  мюьтексті ашу;

- pthread_cond_init() – шартты айнымалыларды құру;

- pthread_cond_signal() – шартты айнымалыларды бұғаттау;

- pthread_cond_wait() –  шартты айнымалы бойынша күту.

 

Си тілінде POSIX ағындарын қолдану мысалын қарастырайық .

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <pthread.h>

static void wait_thread(void)

{

 time_t start_time = time(NULL);

 while (time(NULL) == start_time)

 {

 // никаких действий, кроме занятия процессора на время до 1 с.

 }

}

static void *thread_func(void *vptr_args)

{ int i;

 for (i = 0; i < 20; i++) {

 fputs(" b\n", stderr);

 wait_thread();

 }

 return NULL;

}

int main(void)

{ int i;

 pthread_t thread;

 if (pthread_create(&thread, NULL, thread_func, NULL) != 0) {

 return EXIT_FAILURE;

 }

 for (i = 0; i < 20; i++) {

 puts("a");

 wait_thread();

 }

 if (pthread_join(thread, NULL) != 0) {

 return EXIT_FAILURE;

 }

 return EXIT_SUCCESS;

}

Бұл мысалда негізгі ағынның параллелді орындалуын иллюстрациялайды. Ағындарды құруға (pthread_create), оның денесін көрсетуге (thread_func) және тән ағынның аяқталуын күтуге (pthread_join) ерекше көңіл бөлген жөн.

Solaris операциялық жүйесінің ағындары мен үрдістері

Solaris операциялық жүйесінде көп/көп ағындар моделі қолданылады. Сонымен қатар бұл жүйеде жеңілдетілген үрдістер пайдаланылады. Solaris операциялық жүйесінде қолданушылық ағын өзінің жеңілдетілген үрдісінде бейнеленіледі, өз кезегінде ядро ағынында бейнелінеді, соңғысы компьютерлік жүйенің кез-келген үрдісінде орындалады.

 

Сурет 5. Solaris ағындарын ұйымдастыру схемасы

 

Сурет 6. Solaris операциялық жүйесінде үрдістерді ұйымдастыру

 

Суретте көргеніміздей әрбір үрдіс үрдістерді басқару ақпараттық блогынының стандартынан басқа өзінің жеңілдетілген үрдістерінің тізімінен тұрады.

Windows 2000 ағындар

Windows операциялық жүйесінде көпағындықдың «бір/бір» моделін жүзеге асырады. Әрбір ағын мыналардан тұрады:

- ағын идентификаторы  (thread id);

-  регистрлер жиынтығы

-  қолданушылық және жүйелік процедураларға арналған жеке стектер

- ағындардың жергілікті мәліметтеріне арналған жады аймағы (thread-local storage – TLS).

Linux-тағы ағын

Linux жүйесінде ағын threads емес, tasks (задачами) деп аталады.Ағын clone () жүйелік шақырумен құрылады. Жүйелік шақыру қыздарының тапсырмасы ата-аналық тапсырмасымен(үрдісімен) ортақ адресті аймақты қолдануға мүмкіндік береді.

Java-дағы ағын

Java – көпесептілікті тілдік және базалық кітапхана деңгейінде бағдарламаны өңдеуге арналған алғашқы платформа. Java ағындары келесі жолдар арқылы құрылады:

- Thread класстың кеңейтілуі түрінде

-   құрамында жалғыз әдіс run - орындалатын ағын денесі кіретін Runnable интерфейсі бар класстүрінде  

Java-дағы ағындар JVM арқылы басқарылады.ағындар тобының және сондай топтардың иерархиясы түрінде құрылуы мүмкін.

Java –дағы ағындар  мүмкін болатын жағдайыны 7-суретте көрсетілген. АЖ-дегі ағындарға ұқсайды, Java-дағы ағындар жаңа болып құрылады және новый қалпында болады, одан кейін – выполняемый; wait, sleep жәнет.б типті әдісті шақыру кезінде ағын күту режиміне ауысады; run әдісі аяқталған кезде ағын аяқталады.

 

Сурет 7 . Java-дағы ағындар жағдайы.

Кілттік терминдер

Mac C-threads – MacOS жүйесіндегі қолданушылық ағын.

POSIX Pthreads – POSIX спецификацияланған стандартында және POSIX қосымшасында қолданылатын ағындар  

Solaris threads – Solaris ОЖ-де қолданылатын ағын.

Thread –  Java тіліндегі ағындарды көрсететін класс .

Ағын атрибуттары – pthread_attr_t типінде сипатталатын POSIX ағынындағы атрибуттардың сәйкестігі.

Ағындар тобы (thread group) – өзінің аты бар ағындар үстіндегі топтық операциялармен анықталған ағындардың сәйкестігі.

Дескриптор потока POSIX-ағынына сілтеу типом pthread_t типімен сипатталады.

Тапсырма (task) –Linux-дағы ағын аты.

Ерекшелік (exception) – АЖ-дегі және объектілі-бағытталған тілдердегі қатені өңдеу кезіндегі жоғары деңгейлі 

Ағынның локальді берілгендері (thread-local storage - TLS) – белгілі бір анықталған ағынға жататын және сол ағын ғана қолданатын деректер.

Көпағындық моделі – ағын ядросындағы қолданылатын ағынның көрсетілу тәсілі.

Көп/көп моделі – әр түрлі қолданушылық ағындар әр түрлі ядро ағынында көрсетілуі мүмкін көпесептілік моделі

Көп/бір моделі – көпағындық моделі, бірнеше қолданушылық ағындар бір ғана ядро ағынында көрсетілуі мүмкін көпесептілік моделі.

Бір/бір моделі – әрбір қолданушылық ағындар белгілі бір анықталған ядро ағынында көрсетілуі мүмкін көпесептілік моделі

Мьютекс (mutex)– АЖ-де қолданылатын өзара ерекшелігін қамтитын семафорлар аналогтары.

Жеңілдетілген процесс (lightweight process) – жалпы виртуалды жады аймағында ата-ана үрдісімен жұмыс істейтін.

Ағын (thread) – ата-ана процессінің сол адресті кеңістікте орындалатын паралельді үрдістің эффективті нұсқасы түріндегі қандай да бір іске қосылатын процесс.   

     Қолданушы деңгейіндегі ағын (user thread)– қолданушының АЖ интерфейсіне қосылған операциялардың жоғары деңгейлі ағыны. 

Ядро ағыны (kernel thread)– АЖ ядросының деңгейінде қоданылатын және қолдайтын төмен деңгейлі жүйелік ағын.

Ағын пулы (ThreadPool)– NET тобындағы ағынды құрастырудың эффективті механизмі.

Сигналдар(в UNIX) – қате жағдайындағы төмен деңгейлі өңдеу механизмі.

"Күрделі" (heavyweight) процесс – оңайлатылған үрдіске  қарама-қарсыөзініңадрестік кеңістігі бар  классикалық үрдіс аты.


Дата добавления: 2022-01-22; просмотров: 21; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!