Сигналдар. Үрдістермен жұмыс істеуге арналған жүйелік шақырулар



Кіріспе ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 4
1. Теориялық мағлұматтар ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...5
1.1 Үрдістің орындалуы ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...5
1.2 Үрдіс контексті ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .8
1.3 Үрдістің қалып.күйі ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...8
2. Сигналдар ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 10
2.1 Сигналдардың пайда болу себептеі ... ... ... ... ... ... ... ... ... ... ... ...11
2.2 Сигналдарды өңдеу ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 11
2.3 Үрдістер тобы ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..16
2.4 Туынды үрдістердің “өлімі” ... ... ... ... ... ... ... ... ... ... ... ... .16
3. Жүйелік шақырулар ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 17
3.1 Үрдістермен жұмыс істеуге арналған жүйелік шақырулар ... ... ...17
3.2 Сигналдармен жұмыс істеуге арналған жүйелік шақырулар ... ... .19
3.2.1 KILL ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 19
Қорытынды ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .21
Қолданылған әдебиеттер ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .22
Қосымша А ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..23
Қосымша В ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..24
Қосымша С ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..25
kill() жүйелік шақыруды қолдана отырып, үрдіс басқа үрдіске сигнал жібере алады. Жүйелік шақыру kill() үшін оның аты оның қызметіне мінезделмейді, себебі оның жібере алатын көптеген сигпалдары үрдісті аяқтамайды (“өлтірмейді”). Шақыру өзінің тарихи себептеріне баіланысты алған: UNIX құрылған кезде сигналдарды қолданудың негізі үрдісті аяқтау болып табылады.
kill командасын әдетте үрдістін орындалуын тоқтату үшін қолданады. Бұл команда үрдіске кез келген сигналды жібере алады, ал егер көрсетілмесе ол TERM программаны аяқтау сигналын жібереді. kill командасын қарапайым пайдаланушылар да (өздерінің жеке үрдістері үшін), привилегиялық пайдаланушылар да (кез келген үрдіс үшін) қолдана алады.
UNIX ОЖ-нің жұмысын көптеген үрдістердің байланысы ретңнде қарастыруға болады.
Үрдіс – бұл оның жұмыс істеу кезіндегі есеп. Ол орындалатын программа бейнесі түрінде беріледі де,берілген файл жадысында бейнеленеді. Бұл файл стек, кітапхананың кодасымен директері, ядроның структуралық деректер тізбегіндегі компиляция кезінде пайда болады. Ядроның структуралық деректер тізбегіндегі үрдістерді басқару үшін пайдаланылады.
UNIX ОЖ көпесепті жүйе болып саналады, сол себептен онда көптеген үрдістер параллель орындалады. Оларды ядро пландайды. Бірнеше үрдіс бір программа бөліктері болуы мүмкін. Үрдістер бір-бірімен, есептеуіш ресурстармен байланысы ОЖ-ге байланысу арқылы ғана жүзеге асады. ОЖ системалық ресурстарды активті үрдістер арасында эффективті үлестіреді.

1.1 Үрдістің орындалуы

Үрдістің орындалуы ядро арқылы жүзеге асады. Үрдістерді басқару ішкі жүйесі үрдістерді синхронизациялау, үрдістердің өзара байланысы, жадыны үлестіру және үрдістердің орындалуын пландау сияқты міндеттер атқарады.
Практикалық жағынан UNIX жүйесіндегі үрдіс – ол fork() системалық шақырудың орындалуы кезіндегі пайда болатын объект. Нольдік үрдістен басқа үрдістердің барлығы, бөтен бір үрдістің fork() операциясын пайдалануы арқылы пайда болған. fork() операциясын жүзеге асырушы үрдіс – аталық, ал жаңадан құрылған үрдіс – туынды деп аталады. Әр үрдіс бір ғана аталық үрдіске ие, бірақ көптеген үрдістерді тудыруы мүмкін. Ядрожүйесі әр үрдісті номер бойынша таниды. Бұл номер – үрдіс идентификаторы (PID) деп аталады. Нольдік үрдіс ерекше үрдіс, ол жүйенің жіктелуі кезінде “қолмен” пайда болады. Init есіммен белгілі 1-ші үрдіс, кез-келген басқа үрдістің бабасы болып табылады да, барлық үрдістермен байланысты. Пайдаланушы прогграмманың бастапқы мәтінін трансляциялайды да, орындаушы файл пайда болады. Орындаушы файл бірнеше бөліктен тұрады:
• файл атрибуттарын сипаттайтын басы;
• программа мәтіні;
• деректерді машиналық тілде көрсету, олар программаны іске қосу кезінде бастапқы мәндерді орындауға бағытталған, және ядро жүйесі bss (“block started by symbol” – “символдан басталатын блок”) деп аталатын инициялизацияланбаған деректерге жадыда қанша орын бөлу керек екенін көрсетеді;
• символдық кесте сияқты информациялық секциялар;
UNIX жүйесіндегі үрдістер екі режимде жұмыс істейді: ядро режимі және есеп режимі. Есеп режимінде қолданбалы программа нұсқауларын орындайды, бірақ жүйенің структуралық деректерін ол қолдана алмайды.
1. Дансмур М., Дейвис Г. Операционная система UNIX и программирование на языке Си: Пер. с англ. – М.: Радио и связь, 1989. – 192 с.
2. Керниган Б.В., Пайк Р. UNIX – универсальная среда программирования: Пер. с англ. – М.: Финансы и статистика, 1992. – 304 с.
3. Робачевский А.М. Операционная система UNIX. – СПб.: BHV – Санкт-Петербург, 1997. – 528 с.

Мазмұны
Кіріспе ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 4
1. Теориялық мағлұматтар ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...5
1.1 Үрдістің орындалуы ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...5
1.2 Үрдіс контексті ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .8
1.3 Үрдістің қалып-күйі ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...8
2. Сигналдар ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. ..10
2.1 Сигналдардың пайда болу себептеі ... ... ... ... ... ... ... ... ... ... ... ...11
2.2 Сигналдарды өңдеу ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 11
2.3 Үрдістер тобы ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..16
2.4 Туынды үрдістердің “өлімі” ... ... ... ... ... ... ... ... ... ... ... ... .16
3. Жүйелік шақырулар ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 17
3.1 Үрдістермен жұмыс істеуге арналған жүйелік шақырулар ... ... ...17
3.2 Сигналдармен жұмыс істеуге арналған жүйелік шақырулар ... ... .19
3.2.1 KILL ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 19 
Қорытынды ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. ...21
Қолданылған әдебиеттер ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .22
Қосымша А ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..23
Қосымша В ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..24
Қосымша С ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..25
 

Кіріспе

kill() жүйелік шақыруды қолдана отырып, үрдіс басқа үрдіске сигнал
жібере алады. Жүйелік шақыру kill() үшін оның аты оның қызметіне
мінезделмейді, себебі оның жібере алатын көптеген сигпалдары үрдісті
аяқтамайды (“өлтірмейді”). Шақыру өзінің тарихи себептеріне баіланысты
алған: UNIX құрылған кезде сигналдарды қолданудың негізі үрдісті аяқтау
болып табылады.
kill командасын әдетте үрдістін орындалуын тоқтату үшін қолданады. Бұл
команда үрдіске кез келген сигналды жібере алады, ал егер көрсетілмесе ол
TERM программаны аяқтау сигналын жібереді. kill командасын қарапайым
пайдаланушылар да (өздерінің жеке үрдістері үшін), привилегиялық
пайдаланушылар да (кез келген үрдіс үшін) қолдана алады.

1. Теориялық мағлұматтар
UNIX ОЖ-нің жұмысын көптеген үрдістердің байланысы ретңнде қарастыруға
болады.
Үрдіс – бұл оның жұмыс істеу кезіндегі есеп. Ол орындалатын программа
бейнесі түрінде беріледі де,берілген файл жадысында бейнеленеді. Бұл файл
стек, кітапхананың кодасымен директері, ядроның структуралық деректер
тізбегіндегі компиляция кезінде пайда болады. Ядроның структуралық деректер
тізбегіндегі үрдістерді басқару үшін пайдаланылады.
UNIX ОЖ көпесепті жүйе болып саналады, сол себептен онда көптеген үрдістер
параллель орындалады. Оларды ядро пландайды. Бірнеше үрдіс бір программа
бөліктері болуы мүмкін. Үрдістер бір-бірімен, есептеуіш ресурстармен
байланысы ОЖ-ге байланысу арқылы ғана жүзеге асады. ОЖ системалық
ресурстарды активті үрдістер арасында эффективті үлестіреді.

1.1 Үрдістің орындалуы

Үрдістің орындалуы ядро арқылы жүзеге асады. Үрдістерді басқару ішкі жүйесі
үрдістерді синхронизациялау, үрдістердің өзара байланысы, жадыны үлестіру
және үрдістердің орындалуын пландау сияқты міндеттер атқарады.
Практикалық жағынан UNIX жүйесіндегі үрдіс – ол fork() системалық
шақырудың орындалуы кезіндегі пайда болатын объект. Нольдік үрдістен басқа
үрдістердің барлығы, бөтен бір үрдістің fork() операциясын пайдалануы
арқылы пайда болған. fork() операциясын жүзеге асырушы үрдіс – аталық, ал
жаңадан құрылған үрдіс – туынды деп аталады. Әр үрдіс бір ғана аталық
үрдіске ие, бірақ көптеген үрдістерді тудыруы мүмкін. Ядрожүйесі әр үрдісті
номер бойынша таниды. Бұл номер – үрдіс идентификаторы (PID) деп аталады.
Нольдік үрдіс ерекше үрдіс, ол жүйенің жіктелуі кезінде “қолмен” пайда
болады. Init есіммен белгілі 1-ші үрдіс, кез-келген басқа үрдістің бабасы
болып табылады да, барлық үрдістермен байланысты. Пайдаланушы прогграмманың
бастапқы мәтінін трансляциялайды да, орындаушы файл пайда болады. Орындаушы
файл бірнеше бөліктен тұрады:
• файл атрибуттарын сипаттайтын басы;
• программа мәтіні;
• деректерді машиналық тілде көрсету, олар программаны іске қосу кезінде
бастапқы мәндерді орындауға бағытталған, және ядро жүйесі bss (“block
started by symbol” – “символдан басталатын блок”) деп аталатын
инициялизацияланбаған деректерге жадыда қанша орын бөлу керек екенін
көрсетеді;
• символдық кесте сияқты информациялық секциялар;
UNIX жүйесіндегі үрдістер екі режимде жұмыс істейді: ядро режимі және
есеп режимі. Есеп режимінде қолданбалы программа нұсқауларын орындайды,
бірақ жүйенің структуралық деректерін ол қолдана алмайды.
Үрдіс ерекше нұсқауды (жүйелік шақыру) орындаған кезде, ол ядро
режиміне ауысады. Әр жүйелік операциялардың жүйелік операция
кітапханаларына өзіне сәйкес кіру нүктесі болады; Жүйелік операция
кітапханаларынасы ассемблер тілінде жазылған, және ішінде арнайы үзулер
командалары бар, олар жұмыс істеу барысында “үзулерді” тудырады, олар
аппараттарды ядро режиміне ауысуды жүргізеді.
Әр үрдістің ядро үрдістер кестесінде өзіне сәйкес кіру нүктесі
болады, одан басқа әр үрдіске қолданушы есептеріне арналған оперативті
жадының бөлігі бөлінген. Үрдістер кестесіне үрдістер облысының аралық
кестесіне көрсетулер енеді, бұларға кіру нүктелері облыстар кестесіне
көрсетулер болып табылады. Үрдіске мәтінді, деректі және стекті орналастыру
үшін бөлінетін үздіксіз мекен-жай кеңістігін облыс деп атайды. Облыс
кестесіне кіру нүктелерін облыс атрибуттары сипаттайды. Жанама адресацияның
сыртқы деңгейі тәуелсіз үрдістерге облысты бірігіп пайдалануға мүмкіндік
береді.
Үрдіс exec жүйелік операцияны қосқанда, ядро жүйесі жаңа үрдіске
оперативті жадының облысын бөледі және шақырушы үрдістің жады облыстарын
босатады. Егер үрдіс fork опрециясын жүзеге асырса, ядро үрдістің мекен-жай
кеңістігін екі еселеп, жаңа және ескі үрдістеге оперативті жады облыстарын
бірігіп пайдалануға мүмкіндік береді, келесі жағынан физикалық көшіру
жасайды. Егер үрдіс exit опрециясын жүзеге асырса, ядро үрдіс қолданған
областарды босатады. 1-суретте үрдістерді қосуға байланысты мәлімет
структурасы бейнеленген. Олар үрдістерге оперативті жады облыстарын болуге
мүмкіндік береді.

1сурет. Үрдістер арасында жады облыстарын бөлуге арналған жүйелік
структуралар.
UNIX уақытты бөлу жүйесі. Демек, әрбір үрдіске есептеуіш ресурстар
шектеулі уақытқа ғана берілген, кейін ол орнын басқа үрдіске береді.
Үрдістің процессорды максималды уақыт аралығына босатпауын уақыт кванты деп
аталады. Сөйтіп үрдістер бір уақытта жұмыс істеп жатқаны секілді болады.
Бірақ, шынында бірпроцессорлы машинада бір уақытты бір ғана үрдіс орындалу
мүмкін.
Үрдістеді пландау негізінде екі ұғым жатыр: уақыт кванты және
приоритет. Әр үрдіс приоритеттің екі атрибутына ие: ағымды (осының
негізінде пландау жасалады) және салыстырмалы, ол үрдістер пайда болғанда
беріледі де, ағымдыға әсер етеді. Приоритеттердің номері бірнеше топқа
бөлінеді: есеп режиміндегі үрдістер үшін, ядро режиміндегі үрдістер үшін,
нақты уақыт үрдістері үшін (топтар приоритеттердің жоғарлауы бойынша
жазылған).
Үрдісті үзуі мүммін:
1. үрдіс пландаушысы, уақыт кванты өтсе немесе орындалуға дайын үрдістер
кезегінде приоритеті жоғары үрдіс тұрса;
2. жүйенің ядросы, үрдіс мүмкін емес ресурсты немесе енгізу-шығару
операцияның соңын күтсе.

1.2 Үрдіс контексті

Үрдіс контексті деп үрдіс сипатына қатысты барлық мәліметті айтады.
Үрдіс контексті бірнеше бөліктен тұрады:
• үрдістің есеп режиміндегі мекен-жай кеңістігі (үрдіс коды, деректер,
стек және бөлінетін жады мен динамикалық кітапханалар);
• басқарушы мәлімет (proc және user структуралары – үрдістер кестесінің
көшірмесі және қосалқы мәлімет);
• үрдіс айналасы (жүйелік айнымалылар, мысалы: үй каталогі, қолданушы
есімі және т.б.);
• аппараттық котекст (қолданып жатқан машиналық регистрлердің мәні)
Үрдіс контексті бұл оның қалып-күйі, ол мәтінмен, пайдаланушының глобальды
айнымалы мен мәліметтің структура мәнімен, қолданып жатқан машиналық
регистрлердің мәнімен, үрдіс кестесіндегі сақталған мәнімен және есептің
мекен-жай кеңістігінде, және де үрдіске байланысты ядро мен есеп
стектерінің ішіндегілермен анықталады. Жүйе мәтіннің операциясы мен оның
глобальды мәліметтер структурасы барлық үрдістермен бірге қолданылады.
Бірақ ол үрдіс контекстінің бөлігі емес.

1.3 Үрдістің қалып-күйі

Үрдістің өмір сүруін бірнеше типтерге бөлуге болады, және олардың
өзіндік үрдісті сипаттайтын ерекшеліктері болады. 2-суретте үрдістің пайда
болғаннан бастап, оның жойылуына дейінгі қалып-күйлерін көрсетеді:
1. Үрдіс есеп режимінде орындалуда. Процессор үрдістің қолданбалы
нұсқауларын орындайды.
2. Үрдіс ядро режимінде орындалуда. Процессор үрдістің атынан ОЖ ядро
нұсқауларын орындайды.
3. Үрдіс орындалмайды, бірақ орындалуға дайын, ол орындалуға дайын
үрдістердің кезегінде тұр, және пландаушымен таңдалуын күтеді. Ярине
бұл күйде көп үрдістер болуы мүмкін. Пландауыштың алгоритмі, қандай
үрдістің келесі болып орндалатынын белгілейді.
4. Үрдіс тоқтатылды (“ұйқы”). Үрдіс “ұйқыға кетеді”, егер ол орындалуын
жалғастыра алмаса. Мысалы, ол енгізу-шығаруды немесе босамаған
ресурсты күтсе.
5. Үрдіс ядро режимінен есеп режиміне оралады, бірақ ядро оны үзіп,
жоғары приоритетті үрдістерді жіберуге арналған контексті ауыстырады.
6. Үрдіс fork шақыруымен пайда болып, өткел күйде тұр: ол бар, бірақ ол
ұйқыға да, орындалуға да дайын емес.
7. Үрдіс exit шақыруын орындап, “зомби” күйіне көшеді. Үрдіс өшірілді,
бірақ аталық үрдіске қол жеткізерлік, оралу коды мен уақыт
статистикасы бар, үрдістердің жүйелік кестесінде көшірмелер сақталған.

Процессор бір уақытта бір ғана үрдісті орындай алатындықтан,
бірпроцессолы машинада 1 және 2 күйлерінде бір ғана үрдіс болуы мүмкін.

2-сурет. Үрдістердің қалып-күйі және өзара ауысуы

2. Сигналдар
Сигнал – бұл программалық тәсіл, ол арқылы UNIX ОЖ үрдістерінің
жұмысын үзуге болады. Сигналдар үрдістерге асинхронды оқиғалардың пайда
болуын хабарлайды. Сигнал механизмі үрдіске әр түрлі оқиғаларға көңіл
бөлуге мүмкіндік береді. Бұл оқиғалар үрдістің жұмыс істеуі кезінде оның
ішінде және сыртында болуы мүмкін.
Сигналдар signal.h файлында сипатталған, олардың әр қайсысына
мнемониколық белгілеулер сәйкес келеді. Сигналдардың саны мен симантикасы
UNIX ОЖ версиясына байланысты.
UNIX System V сигналдар 1-ден 19-ға дейін номерленген:
#define NSIG            20
#define SIGHUP      1      *байланыстың үзілуі*
#define SIGINT      2      *үзу*
#define SIGQUIT      3      *авариялық шығу*
#define SIGILL      4      *қате машиналық нұсқау*
#define SIGTRAP      5      *үзу-қақпаан*
#define SIGIOT      6      *енгізу-шығару үзуі*
#define SIGEMT      7      *EMT программалық үзуі*
#define SIGFPE      8      *жүзгіш нүктесі бар операцияны орындау кездегі
авария*
#define SIGKILL      9      *үрдісті өшіру*
#define SIGBUS      10      * шина қатесі*
#define SIGSEGV      11      *сегментациян ың бұзылуы *
#define SIGSYS      12      *жүйелік шақыру орындалғандағы қате*
#define SIGPIPE      13      *каналға көшіру бар, бірақ оқу жоқ*
#define SIGALRM      14      *таймерден үзу*
#define SIGTERM      15      * kill –ден сигналдарды аяқтау командасы*
#define SIGUSR1      16      *пайдаланушым ен анықталады*
#define SIGUSR2      17      *пайдаланушым ен анықталады*
#define SIGCLD      18      * процесс-потомок завершился *
#define SIGPWR      19      *қоректену авариясы*
#define SIG_DFL      (int(*)())0      * барлық орнатулар бастапқыдай*
#define SIG_IGN      (int(*)())1      *осы сигналды елемеу*

Ескерту: сигналдардың пайда болу себептері әр түрлі версияларда әр түрлі
болуы мүмкін; бастапқыда олар ЭВМ PDP-11 архитектура ерекшеліктеріне
негізделген.

2.1 Сигналдардың пайда болу себептеі
System V UNIX версиясында сигналдардың пайда болуын келесідей
классификациялайды:
• пайдаланушының барлық үрдістерге арналған терминалдан басқару символын
енгізу, бұл терминалмен елестетілген (SIGINT, SIGQUIT, SIGHUP);
• пайдаланушы үрдісінің жұмыс істеуі кезінде авариялық жағдайдың пайда
болуы (SIGILL, SIGTRAP, SIGFPE, SIGBUS, SIGSEGV, SIGSYS, SIGPIPE);
• ойластырылмаған немесе идентификациялауға келмейтін жағдайдың пайда
болуы (SIGTERM, SIGCLD, SIGPWR);
• алдын-ала сипатталған жағдайдың пайда болуы (SIGALRM);
Сигналдарды үрдіс бір-біріне kill функциясы немесе ядро арқылыжүзеге
асырайды. Әр үрдіске өзіндік бинарлық вектор белгіленген, оның ұзындығы
сигналдардың санына тең. Үрдіспен 1 сигнал қабылданса, оған сәекес
вектордың і-інші разряды 1-ге тең болады. Әр сигналға өзіндік функция
адресі сәйкес келеді. Ол бұл сигналды өңдеу үшін шақырылады.

2.2 Сигналдарды өңдеу

Ядро үрдістің контекстінде оны алатын сигналдарды өңдейді. Сол
себептен сигнал өңдеу үшін үрдісті іске қосу қажет. Сигнал өңдеудің 3 әдісі
бар: үрдіс сигналды қабылдағаннан кейін аяқталады және сигналға мән
бермейді немесе оны қабылдағаннан кейін ерекше функция орындайды. Ядро
режимінде қолданылатын үрдіс жағынан келісімді реакция exit функциясын
шақыру болып табылады, дегнімен де signal функциясының көмегімен үрдіс
немесе басқа сигналдарды үндемелі қабылдайтын басқа арнайы іс-әрекеттер-ді
бағыттай алады.
signal функциясының жүйелік шақыру синтаксисі:

oldfunction=signal(signum, function)

мұнда, signum – сигнал нөмірі, ол қабылданған кезде пайдаланушы функция-сы
іске қосумен байланысты іс-әрекет орындалады, function – функция меке-ні,
oldfunction – функцияның мәнін қайтару. Үрдіс функция мекенінің орнына
шақырылатын signal процедурасына 1 және 0 сандарын бере алады: егер
function=1 болса, үрдіс signum нөмірімен келесі түсетін сигналдарды жақтыр-
майды (жақтырмайтын сигналдарға байланысты ерекше жағдай ол ұрпақ-тардың
өлуі), егер 0-ге тең болса (келісулі мән бойынша), үрдіс сигналды ядро
режимінде қабылдауымен аяқталады. Сигналды өңдеу үшін үрдіс аума-ғында
массив кеңістігі қолдау көрсетеді, әр арнайы жүйедегі сигналға бір
кеңістіктен нөмірі көрсетілген сәйкес сигналдың кеңістігінде ядро пайдала-
нушы функция үрдістің сигнал қабылдағышынан шақырылатын шешімін сақтайды.
Бір типті сигналдың өңдеу әдісі, басқа типті сигналдың өңдеуіне әсер
етпейді.

Сигналды өңдей тұра, ядро сигналдың типін анықтайды және үрдістер
кестесінің жазуының разрядынтазартады (өшіреді), ол берілген сигнал типі
бойынша сәйкес келеді және сигналды үрдіспен қабылдау кезінде орнатады.
Егер сигналды өңдейтін функциясы келісілген мәнді өзіне алса, ядро басқа
жағдайда үрдісті аяқтау алдында жадыдағы үрдіс күйіне сыртқы тасымалдаушыға
(дампирлайды) тастайды. Дампирлау программистер үшін тиімді, себебі ол
жадыдағы сигналдың түсуін анықтайды және осыған байланысты программаның тыс
қалуын енгізеді. Ядро үрдістің орындалуын-дағы кейбір қателіктерді
жіберетін сигналдардың түскенде, жадының жағдайын дампирлайды, оларға мысал
ретінде тиым салынған командалар-дың орындалуы немесе үрдістің виртуалды
мекен кеңістігінен тыс орналас-қан мекенге жолығу. Егер сигнал программалық
қатемен қатнаспаса, ядро жады жағдайын димпирлайды. Мысалы, терминалдағы
“delete” немесе “break” түймешігін басумен шақырған үзу, өзінің пайдаланушы
үрдісті уақытынан бұрын аяқтағысы келетін сигналды жіберу қорытындысы
болады, бұл уақытта тоқтап қалу сигналы регистрациялы терминалмен бірге
бүлінуі туралы куәлік бола алады. Бұл сигналдар үрдістің ағынының қатесі-
мен байанысты болмайды. Шығу туралы сигнал (quit), дегенімен де үрдістің
орындалуынан тыс болатынына қарамастан жады жағдайын тастауды шақырады. Бұл
сигнал әдетте ctrll түймешігін басумен бірге шақырылады, егер үрдіс бір
камандалардың шексіз циклмен орындалатынына түссе, қажет болатын
прогаммистке үрдісті іске қосқан уақытынан кейін кез келген сәтте жады
жағдайынан дамп алуға мүмкіндік береді.
Егер үрдіс алдында мән бермейміз деп келіскен сигналды алса, үрдіс ол
сигналды болмады деп орындалуын жалғастырамыз. Ядро сәйкес кеңістіктің
берілген типті сигналды жақтырмауды керек екенді анықтайтын мәнін
тастамағандықтан, сигнал қайтадан түскен кезде үрдіс оған тағы да мән
бермейді. Егер үрдіске әсер ету керек болатын сигналды алатын болса,
есептеуші режимінде үрдісті қайтарғаннан кейін алдын ала шартталған іс-
әрекен орындалады, дегенімен де үрдісті есептеуші режимінде ауыстыру
алдында, ядро келесі қадамдарды қабылдау керек:
1. ядро сақталған егистрлік есепке жолығып, стек төбесінің көрсеткішін
және командаларды септеу мәнін таңдайды, пайдаланушы үрдіске
қайтарады.
2. сигналды өңдеу функциясы кеңістігіне алдынғы мәнді үрдіс кеңістігіне
тастайды және келісім бойынша оған мән береді.
3. керектігіне сай қосымша жады бөлінетін есептеу стегіне жаңа жазу
шығарады, алдында таңдалған сақтаулы есептеу контекстік регис-трлігіне
стек төбесінің көрсеткішін және команда счетчигінің мәнін жазады.
Есептеуіш стегі үрдіс пайдаланушы функциясын (сигналды өңдеу), оның
жүйелік функциясына шақырған немесе ядро оның орын-далуын үзген
(сигналды танымай тұрып) жеріндегі нүктеден қараған сияқты көрінеді.
4. сақталған регистрлік есеп контекстке өзгерту енгізу: сигналды өңдеу
функциясын мекенін тең счетчик командасының мәнін орнатады, ол стек
төбесінің көрсеткішінің мәнің есептеу стегінің түбіне тең.
Сол сияқты, қайтуы бойынша ядро режимінен есептеу режиміне үрдіс
сигналды өңдеу функциясын орындалуына кіріседі; оны аяқтаған соң басқару
пайдаланушы программасындағы жүйелік функцияға жолыққан немесе үзу болған
жерге беріледі, сонымен жүйелік функция немесе үзуден шығуды еліктетеді.
Мысал алуға болады, ол үзу туралы сигналды (SIGINT) қабылдайды және
өзі де оларды жібереді (kill функциясы орындалу қорытындысында). VAX
11780 операциондық жүйедегі жүктеуші дисассемблированияның қорытындысын
алғандағы программалық кодтың бөлшектері көрсетілген. Үрдістің
орындалуындағы kill библиотекалық процедурасында жолыққан ее (он алтылық)
мекені болады; бұл процедура kill жүйелік функциясын шақырғаннан бұрын 10а
мекені бойынша chmk командасын орындайды (үдісті ядро режиміне ауыстыру).
10с – жүйелік функциядан мекенді қайтару. Жүйелік функция орындалу кезінде
ядро үрдіс-ке үзу туралы сигнал жібереді. Ядро бұл сигналға үрдіс есептеуіш
режиміне қайтайын деп жатқанда мән береді, 10с мекенді қайтаруы сақталған
регистр-лік контекстен таңдап және есептеу стегіне орналастырады. Онымен
қоса 104 сигналды өңдеу функция мекеніне, ядро сақталған регистрлік есептеу
кон-текстіне орналстырады.
Қаралған сигналдарды өңдеу алгоритмінде бірнеше сәйкссіздіктер бар.
Олардың ең негізгі және бірінші үрдіс кеңістігіндегі есептеу режиміне
қайтару үрдісінен бұрын тазалаумен байланысты, оның өзінде сигналды өңдеу
функциясын пайдланушы мекені бар. Егер үрдіске тағы да сигналды өңдеу керек
болса, ол тағы да signal жүйесін функциясына көмекке келуге тура келеді.
Бұндайда болу керек емес жағдайлары болады:мысалы, бәсекеге жақсы жағдай
тууы мүмкін, егер екінші рет үрдіс жүйелік функцияны іске қосуға мүміндік
алғанша дейін сигнал түссе. Үрдіс есептеу режимінде орын-далатындықтан,
ядроға контексті ауыстыруға тура керек болады, сонымен үрдістің сигналды
өңдеу функция өріске мәндерді тастау алдында сигналды алуға мүмкіндікті
жоғарылатуы үшін.
Бұл жағдайды программа мысалында қарасты-руға болады. Үрдіс signal
жүйелік функциясына үзіліс туралы сигналды қабылдауға және оны
қабылдағаннан кейін sigcatcher функциясын орындауға нұсқау беру үшін
жүгінеді. Одан кейін ол жаңа үрдісті туғызады, ол ата-ана үрдісінің іске
қосылу приоритетін оның ұрпағының приоритетінен төмендетуге мүмкіндік
беретін nice жүйелік функциясын іске қосады және шексіз циклге кіреді.
Пайда болған үрдіс өзінің орындалуын ата-аналық үрдіске nice жүйелік
функциясын орындауға уақыт беру үшін және өзінің приоритетін төмендету үшін
5 секундқа кідіреді. Бұдан кейін пайда болған үрдіс әрбір итерациясында ол
ата-аналық үрдіске үзіліс туралы сигнал беретін циклге енеді (kill
функциясына жүгіну арқылы). Егер қате болса, мысалы, ата-аналық үрдіс жоққа
айналғанда, kill аяқталады, онда пайда болған үрдіс те тоқтайды. Бұның бар
мақсаты болып, ата-аналық әрбәр үзіліс туралы сигнал алған сайын өңдеу
функциясын іске қосу жатады. Сигналды өңдеу функциясы хабарлама шығарады
және үзіліс туралы сигнал пайда болғанда signal функциясына қайтадан
жүгінеді, ал ата-аналық үрдіс циклдік команда жинауын жалғастыра береді.
Алайда, оқиғаның болу кезегі келесідегідей болуы мүмкін:
• Пайда болған үрдіс ата-аналық үрдіске үзіліс туралы сигнал жібереді.
• Ата-аналық үрдіс сигналды қабылдайды және сигналды өңдеу функциясын
шақырады, бірақ контекстті ауыстыруды signal функцисы шақырылғанға
дейін ауыстыруды жүзеге асыратын ядромен резервтеленеді.
• Ата-аналық үрдіске үзіліс туралы тағы бір сигнал жіберетін пайда
болған үрдіс қайта іске қосылады.
• Ата-аналық үрдіс үзіліс туралы екінші сигналды қабылдайды, бірақ бұдан
юұрын ол сигналды өңдеу әдісіне қатысты ешқандай нұс-қау беріп
үлгермейді. Ата-аналық үрдістің орындалуы қайта қалпына келген соң ол
аяқталады.

Программада үрдістің нақ осындай тәртібі сипатталады, өйткені ата-
аналық үрдістің nice функциясын шақыруынан ядро пайда болған үрдістің
орындалуын іске қосуды жиелетуге әкеледі. Ричидің айтуынша (бұл мәліметтер
жеке әңгімеден алынған), сигналдар ... жалғасы

Сіз бұл жұмысты біздің қосымшамыз арқылы толығымен тегін көре аласыз.
Ұқсас жұмыстар
Linux операциондық жүйесінде kill функциясын оқып үйрену және оны Си тілінде программалау
Ядросы Unix Linux тұқымдас операциялық жүйелер
Linux операциялық жүйесі жайлы ақпарат
Операциялык жүйелер курсы
Windows операциялық жүйесінің тарихы
Unix операциондық жүйесінің архитектурасы
SDHтехнологиясы негізінде корпоротивтік желіні құру
5ess цифрлық коммутациялық жүйесі
Байланыс торабын ұйымдастыруда сигналдардың коммутациясы
Функционалды автоматтандыру сұлбалары
Пәндер