Кіріспе
Компьютерлік жүйелердегі процестер аралық байланыс нысаны процестер аралық байланыс нысаны. Сигналдар – жұмыс істеп тұрған бағдарламаға белгілі бір әрекетті, мысалы, тоқтату немесе қателерді өңдеуді іске қосу үшін жіберілетін стандартталған хабарламалар. Олар процестер аралық байланыс (IPC) нысанының шектеулі түрі, әдетте Unix, Unix-қа ұқсас және басқа POSIX стандартына сәйкес келетін операциялық жүйелерде қолданылады. Сигнал – процеске немесе сол процестің ішіндегі нақты бір жіпке оқиға туралы хабарлау үшін жіберілетін асинхронды хабарлама. Сигналдарды процестерді үзу, тоқтата тұру, аяқтау немесе жою үшін жиі пайдаланады. Сигналдар 1970-ші жылдары Bell Labs Unix жүйесінде пайда болды және кейін POSIX стандартында бекітілді. Сигнал жіберілген кезде операциялық жүйе сигналды жеткізу үшін нысана процестің қалыпты орындалу ағынын үзеді. Орындалу атомдық емес кез келген нұсқау кезінде үзілуі мүмкін. Егер процесс бұрын сигналды өңдеушіні тіркеген болса, онда сол процедура орындалады. Әйтпесе, әдепкі сигнал өңдеуші орындалады. Кіріктірілген бағдарламалар сигналдардың процестер аралық байланыс үшін пайдалы екенін анықтауы мүмкін, себебі сигналдар алгоритмдік тиімділігімен ерекшеленеді. Сигналдар үзілістерге ұқсас, бірақ үзілістер процессор арқылы және ядромен, ал сигналдар ядро арқылы (мүмкін жүйелік шақырулар арқылы) жүзеге асырылады және жеке процестермен басқарылады. Ядро үзілісті тудырған процесске сигнал ретінде жіберуі мүмкін (типикалық мысалдар: SIGSEGV, SIGBUS, SIGILL және SIGFPE).
form of inter process communication
Signals are standardized messages sent to a running program to trigger specific behavior, such as quitting or error handling. They are a limited form of inter process communication (IPC), typically used in Unix, Unix like, and other POSIX compliant operating systems. A signal is an asynchronous notification sent to a process or to a specific thread within the same process to notify it of an event. Common uses of signals are to interrupt, suspend, terminate or kill a process. Signals originated in 1970s Bell Labs Unix and were later specified in the POSIX standard. When a signal is sent, the operating system interrupts the target process' normal flow of execution to deliver the signal. Execution can be interrupted during any non atomic instruction. If the process has previously registered a signal handler, that routine is executed. Otherwise, the default signal handler is executed. Embedded programs may find signals useful for inter process communications, as signals are notable for their Algorithmic efficiency. Signals are similar to interrupts, the difference being that interrupts are mediated by the CPU and handled by the kernel while signals are mediated by the kernel (possibly via system calls) and handled by individual processes. The kernel may pass an interrupt as a signal to the process that caused it (typical examples are SIGSEGV, SIGBUS, SIGILL and SIGFPE).
Тарих
Unix-тің 1-ші нұсқасында (1971) үзілістерді, тоқтатуларды және машиналық қателерді ұстауға арналған жеке жүйелік шақырулар болды. 2-ші нұсқасында (1972) осы мүмкіндік пайда болды. 4-ші нұсқа (1973) барлық қателерді бір шақыруға біріктірді, ал 5-ші нұсқа (1974) кез келген сигналдарды жібере алды. 7-ші нұсқада (1979) әрбір нөмірленген қатеге символдық атау берілді. Белл зертханасының 9-шы жолы (80-ші жылдардың соңы) сигналдарды қысқа, кез келген мәтінді жіберуге рұқсат беретін хабарламалармен алмастырды.
Сигналдарды басқару
Сигнал өңдеушілерді немесе жүйелік шақыру арқылы орнатуға болады. Егер белгілі бір сигнал үшін сигнал өңдеуші орнатылмаған болса, әдепкі өңдеуші қолданылады. Әйтпесе сигнал тоқтатылып, сигнал өңдеуші шақырылады. Процесс басқарушыны жасамай, екі әдепкі мінез-құлықты да белгілей алады: сигналды елемеу (SIG_IGN) және әдепкі сигнал өңдеушіні пайдалану (SIG_DFL). SIGKILL және SIGSTOP сигналдарын тоқтатуға және өңдеуге болмайды.
Қауіптері
Сигналды басқару жарыс жағдайларына осал. Сигналдар асинхронды болғандықтан, сигналды өңдеу процедурасы орындалып жатқанда процеске тағы бір сигнал (тіпті сол типтегі) жеткізілуі мүмкін. Сигналдарды жеткізуді тоқтату және қайта бастау үшін шақыруды пайдалануға болады. Тоқтатылған сигналдар тоқтатылмайынша процеске жеткізілмейді. Назарсыз қалдырылмайтын сигналдарды (SIGKILL және SIGSTOP) тоқтату мүмкін емес. Сигналдар ағымдағы жүйелік шақыруды үзуіне себеп болуы мүмкін, бұл жағдайда ашық емес қайта іске қосуды басқару қосымшаға жүктеледі. Сигнал өңдеушілер жағымсыз қосымша әсерлерге алып келмейтіндей етіп жазылуы керек, мысалы, өзгерістер, сигнал маскасын өзгерту, сигналдың күйін өзгерту және басқа да жалпы процестің атрибуттарын өзгерту сияқты. Сигнал өңдеушілердің ішінде қайта кіретін емес функцияларды, мысалы, немесе пайдалану да қауіпсіз емес. POSIX спецификациясы және Linux қолданбасы сигналдық функциядан тікелей немесе жанама түрде шақырылатын барлық жүйелік функциялар асинхронды сигнал қауіпсіз болуын талап етеді. Осындай асинхронды сигнал қауіпсіз жүйелік функциялардың тізімі сол қолданбада берілген (практикалық түрде жүйелік шақырулар), әйтпесе мінез-құлық белгісіз болады. Сигнал өңдеушіде бір айнымалыны орнатып, оны басқа жерде тексеру ұсынылады. Сигнал өңдеушілер сигналды кезекке қойып, дереу қайтаруы мүмкін. Басты жіп (thread) сигналдар кезектен алынғанға дейін "үзіліссіз" жалғасады, мысалы, оқиға циклында. Мұндағы "үзіліссіз" дегеніміз – бұғаттау операциялары мерзімінен бұрын қайтарылуы мүмкін және жоғарыда айтылғандай, қайта басталуы керек. Сигналдарды жұмысшылар тобына емес, басты жіптегі кезектен өңдеу керек, өйткені бұл асинхрондық мәселені қайтадан тудырады. Дегенмен, кезекті тек қана басқару асинхронды сигнал қауіпсіздігімен мүмкін емес, өйткені мұндай айнымалыларға тек бір оқу және жазу ғана атомдық кепілдік беріледі, кезекке қажетті өсулер немесе (алып келу және) азайтулар емес. Осылайша, тиімді түрде, тек бір сигналды ғана өңдеушіге өңделгенге дейін қауіпсіз кезекке қоюға болады.
Жабдықтар ерекшеліктерімен байланыс
Процесс орындалуы кезінде, мысалы, егер процесс нөлге бөлуге тырысса немесе беттік қателік тудырса, аппараттық ерекшелік пайда болуы мүмкін. Unix сияқты операциялық жүйелерде, бұл оқиға процессор контекстін автоматты түрде өзгертіп, ядролық ерекшеліктерді өңдеуді бастайды. Кейбір ерекшеліктердің, мысалы беттік қателіктің жағдайында, ядрода оқиғаны толыққанды өңдеу және процесс орындалуын қайта бастау үшін жеткілікті ақпарат болады. Дегенмен, басқа ерекшеліктерді ядро ақылмен өңдей алмайды және олардың өңделуі ақаулық тудырған процесске жүктеледі. Бұл кейінге қалдыру сигнал беру механизмі арқылы іске асырылады, онда ядро процеске ағымдағы ерекшелікке сәйкес келетін сигнал жібереді. Мысалы, егер процесс x86 процессорында бүтін санды нөлге бөлуге тырысса, бөлу қатесі ерекшелігі туады және ядро процеске SIGFPE сигналын жібереді. Сол сияқты, егер процесс өзінің виртуалды адрестік кеңістігінен тыс жад адресіне қол жеткізуге тырысса, ядро процесске SIGSEGV (сегментациялық бұзушылық сигналы) арқылы осы бұзушылық туралы хабарлайды. Сигнал атаулары мен ерекшеліктердің нақты сәйкестігі процессорға байланысты, себебі ерекшелік түрлері әртүрлі архитектураларда өзгеше болады.
Түрлі сигналдар
Келесі сигналдар POSIX спецификациясында көрсетілмеген. Дегенмен, олар кейбір жүйелерде қолданылуы мүмкін. SIGEMT сигналы эмулятор тұзағы орын алғанда процеске жіберіледі. SIGINFO сигналы басқару терминалынан жай-күй (ақпарат) сұранысы алынғанда процеске жіберіледі. SIGPWR сигналы жүйеде қуат сөнуі орын алғанда процеске жіберіледі. SIGLOST сигналы файл құлпы жоғалғанда процеске жіберіледі. SIGSTKFLT сигналы копроцессор стек ақаулығына тап болғанда процеске жіберіледі (яғни, стек бос болғанда дерек алуға тырысқанда немесе толғанда дерек қосуға тырысқанда). Ол Linux жүйесінде анықталғанмен, қолданылмайды, онда x87 копроцессор стегіндегі қате SIGFPE сигналын тудырады. SIGUNUSED сигналы пайдаланылмаған жүйелік шақыру нөмірімен жүйелік шақыру жасалғанда процеске жіберіледі. Көптеген архитектураларда бұл SIGSYS сигналымен синонимді. SIGCLD сигналы SIGCHLD сигналымен бірдей.