Кіріспе

Компьютерлік бағдарламалық жасақтама бір немесе бірнеше туыс процестерін құрған мысал.

Компьютерде, ата процесі – бір немесе бірнеше туыс процестерін құрған процесс.

Unix-қа ұқсас жүйелер

Unix сияқты операциялық жүйелерде, [[Linux жүйелік процесінен (сваппер) басқа әрбір процесс басқа процесс fork жүйелік шақыруын орындағанда құрылады. Fork-ты шақырған процесс – аталық процесс, ал жаңадан құрылған процесс – балалық процесс. Әрбір процесс (0-процессінен басқа) бір аталық процесске ие, бірақ көптеген балалық процестері болуы мүмкін. Операциялық жүйе ядросы әрбір процесті оның процесс идентификаторы арқылы анықтайды. 0-процессі – жүйе іске қосылғанда құрылатын арнайы процесс; балалық процесс (1-процесс) құрылғаннан кейін 0-процессі сваппер процесіне айналады (кейде "бос міндет" деп те аталады). 1-процесс, белгілі, жүйедегі барлық басқа процестердің түпкі атасы болып табылады.

Linux жүйесі

Linux ядросында процестер мен POSIX жіптері арасында өте шамалы айырмашылық бар, соған сәйкес, ата-ана процестерінің екі түрі бар: нақты ата-ана және ата-ана. Ата-ана – бұл бала процесі тоқтағанда SIGCHLD сигналын қабылдайтын процесс, ал нақты ата-ана – көп жіпті ортада осы бала процесін жасаған жіп. Қайсыбір қарапайым процесс үшін бұл екі мән бірдей болады, бірақ процесс ретінде жұмыс істейтін POSIX жібі үшін бұл екі мән әртүрлі болуы мүмкін.

Зомби процестері

Операциялық жүйе әрбір процесті оның процесін анықтайтын (әдетте "pid" деп аталады) идентификатор арқылы, оның жұмыс істеуі үшін қажетті деректермен байланыстыратын кесте сақтайды. Процесс өмірі бойына мұндай деректерге процеске бөлінген жад сегменттері, оны шақыру кезінде берілген аргументтер, орта айнымалылары, ресурстарды пайдалану туралы сандар, пайдаланушы идентификаторы, топ идентификаторы және топтар жиынтығы, сондай-ақ басқа да ақпарат түрлері кіруі мүмкін. Процесс өзінің орындалуын аяқтағанда, шығу функциясын шақыру арқылы (егер де жасырын түрде болса, негізгі функциядан қайтару командасын орындау арқылы) немесе оны күрт тоқтатуға себеп болатын сигналды алғанда, операциялық жүйе осы процеске қатысты көптеген ресурстар мен ақпаратты босатады, бірақ ресурстарды пайдалану туралы деректерді және тоқтату статусы кодын сақтайды, себебі балама процесс баланың сәтті орындалғанын (тоқтату статусы кодын оқуға арналған стандартты функцияларды пайдалану арқылы) және оның орындалуы кезінде жұмсалған жүйе ресурстарының көлемін білуге мүдделі болуы мүмкін. Жүйе әдепкі бойынша, бала процесі тоқтатылған кезде балама процесс мұндай ақпаратқа қызығушылық танытады деп есептейді және бала туралы деректерді жинау қажеттігін хабарлау үшін баламаға SIGCHLD сигналын жібереді. Мұндай жинау wait отбасының функциясын шақыру арқылы жүзеге асырылады (wait өзі немесе оның туыстарының бірі, мысалы waitpid, waitid немесе wait4). Осы жинау жасалғаннан кейін жүйе бала процесі туралы соңғы ақпаратты босатады және оның PID-ін процесс кестесінен жояды. Дегенмен, егер балама процесс баланың деректерін жинауда кешіксе (немесе оны мүлдем жинамаса), жүйеде баланың PID-ін және тоқтату деректерін процесс кестесінде белгісіз мерзімге сақтаудан басқа амал қалмайды. Деректері жиналмаған мұндай тоқтатылған процеске зомби процесс немесе жай ғана зомби дейді. Бұл атау тоқтатылған процесті "жансыз" немесе "өлген" деп есептеуге байланысты, өйткені ол іс жүзінде жұмыс істемейді, ал "жансыз" процесс әлі де "тірі процестер" әлемінде – процесс кестесінде – "көрініп тұр", яғни "өлмей" сақталады, сондықтан ол "зомби" деп аталады. Зомби процестері шектеулі ресурстарға немесе шектеулі өлшемді процесс кестелеріне ие жүйелерде проблема тудыруы мүмкін, себебі ұзақ уақыт бойы сақталатын зомбилер әлі де пайдаланып отырған ресурстардың жетіспеуі жаңа, белсенді процестерді құруға кедергі келтіруі мүмкін. Сондықтан, балама процесс тудыруы мүмкін кез келген бағдарламада бастапқы балаларынан ұзақ уақыт бойы сақталатын зомбилердің пайда болуын болдырмау үшін код болуы жақсы бағдарламалау тәжірибесі болып табылады. Ең қарапайым тәсіл – жаңа процесс құрғаннан кейін wait немесе оның туыстарын шақыратын кодты қосу. Егер бағдарлама көптеген балама процестерді құруды күтсе, олар асинхронды түрде орындалып, болжамсыз тәртіппен тоқтатылуы мүмкін, SIGCHLD сигналына арналған өңдеушіні құру және жиналмаған балама деректері қалмайынша wait отбасының функцияларын циклмен шақыру ұсынылады. Балама процесс өз балаларының тоқтатылуын мүлдем елемесе де зомбилерді жасамауы мүмкін, бірақ бұл үшін SIGCHLD үшін SA_NOCLDWAIT ерекше опциялық флагы бар sigaction функциясын шақыру арқылы өңдеушіні нақты анықтау қажет.