Кіріспе
Unix және Unix сияқты компьютерлік операциялық жүйелерде, орындалуы аяқталған (exit жүйелік шақыру арқылы), бірақ процестер кестесінде жазбасы бар процесс зомби процесс немесе күшін жоғалтқан процесс деп аталады: бұл "тоқтатылған күйдегі" процесс. Мұндай жағдай әдетте бала процестерде болады, онда ата-ана процесі баласының шығу мәнін оқу үшін жазбаның әлі де қажет болуы мүмкін: шығу мәні wait жүйелік шақыру арқылы оқылғаннан кейін, зомби жазбасы процестер кестесінен жойылады және ол "жиналып алынған" деп есептеледі. Бала процесі бастапқыда зомбиге айналады, содан кейін ғана ресурстар кестесінен алынады. Жүйенің қалыпты жұмысында зомбилерді әдетте олардың ата-анасы бірден күтеді, сосын жүйе оларды жинап алады. Ұзақ уақыт зомби күйде қалатын процестер әдетте қате болып табылады және ресурстардың ысырап болуына себеп болуы мүмкін. Әдетте, олардың ядролық ресурсы – процестер кестесіндегі жазбасы, яғни процесс ID-сі ғана болады. Дегенмен, зомбилер ашық буферлерді ұстап тұрып, жадты тұтынуы мүмкін. Зомбилер файл дескрипторларына арналған тұтқаларды ұстап тұруы мүмкін, бұл осы файлдарға арналған орынды файлдық жүйеге қолжетімді етуге кедергі келтіреді. Бұл әсерді du және df командаларының нәтижелерінен байқауға болады. du көп мөлшерде бос дискілік кеңістік көрсете алады, ал df толық бөлімді көрсетеді. Егер зомбилер тазартылмаса, тамырлық бөлім толып, жүйе құлап кетуі мүмкін. "Зомби процесс" термині зомбидің жалпы анықтамасынан туындайды – тірі қайта оралған өлік. Осы терминнің метафорасында бала процесс "өліп" қойған, бірақ әлі "жиналып алынбаған". Қалыпты процестерден айырмашылығы, kill командасы зомби процесске ешқандай әсер етпейді. Зомби процестерін жетім процестермен шатастыруға болмайды, бұл әлі де орындалып жатқан, бірақ оның ата-анасы қайтыс болған процесс. Ата-анасы қайтыс болған жағдайда, жетім бала процесі init жүйесімен қабылданады. Жетім процестер өлгенде, олар зомби процестер ретінде қалмайды; керісінше, оларды init күтеді.
On Unix and Unix like computer operating systems, a zombie process or defunct process is a process that has completed execution (via the exit system call) but still has an entry in the process table: it is a process in the "terminated state". This occurs for the child processes, where the entry is still needed to allow the parent process to read its child's exit status: once the exit status is read via the wait system call, the zombie's entry is removed from the process table and it is said to be "reaped". A child process initially becomes a zombie, only then being removed from the resource table. Under normal system operation, zombies are immediately waited on by their parent and then reaped by the system. Processes that stay zombies for a long time are usually an error and can cause a resource leak. Generally, the only kernel resource they occupy is the process table entry, their process ID. However, zombies can also hold buffers open, consuming memory. Zombies can hold handles to file descriptors, which prevents the space for those files from being available to the filesystem. This effect can be seen by a difference between du and df. While du may show a large amount of free disk space, df will show a full partition. If the zombies are not cleaned, this can fill the root partition and crash the system. The term zombie process derives from the common definition of zombie — an undead person. In the term's metaphor, the child process has "died" but has not yet been "reaped". Unlike normal processes, the kill command has no effect on a zombie process. Zombie processes should not be confused with orphan processes, a process that is still executing, but whose parent has died. When the parent dies, the orphaned child process is adopted by init. When orphan processes die, they do not remain as zombie processes; instead, they are waited on by init.
Шолу
Процесс шығыс арқылы аяқталғанда, оған байланысты барлық жад пен ресурстар басқа процестер пайдалануы үшін босатылады. Дегенмен, процесс кестесіндегі процесс жазбасы сақталады. Ата-анасы күту (wait) жүйелік шақыруын орындап, баланың шығу статусын оқи алады, содан кейін зомби жойылады. Күту шақыруы тізбекті кодта орындалуы мүмкін, бірақ көбінесе SIGCHLD сигналына арналған өңдеушіде орындалады, оны ата-ана бала қайтыс болған кезде алады. Зомби жойылғаннан кейін оның процесс идентификаторы (PID) мен процесс кестесіндегі жазбасы қайта пайдаланылуы мүмкін. Бірақ, егер ата-ана күтуді шақырмаса, зомби процесс кестесінде қалады, бұл ресурстың ысырабына әкеледі. Кейбір жағдайларда бұл қажет болуы мүмкін – ата-ана процесі осы ресурсты ұстап тұруды жалғастыруды қалайды, мысалы, ата-ана басқа бала процесін құрса, оған сол PID тағайындалмасын деп қамтамасыз етеді. Қазіргі заманғы UNIX сияқты жүйелерде (SUSv3 спецификациясына осы тұрғыда сәйкес келетіндерде) мынадай ерекше жағдай қолданылады: егер ата-ана SIGCHLD сигналын нақты түрде елемесе (өңдеушісін SIG_IGN-ге орнату арқылы, әдепкі бойынша сигналды елемеудің орнына) немесе SA_NOCLDWAIT флагы қойылған болса, барлық баланың шығу статусы туралы ақпарат жойылады және ешқандай зомби процестер қалмайды. Зомбилерді Unix ps командасының нәтижесінде "STAT" бағанында "Z" әрпінің болуы арқылы анықтауға болады. Ұзақ уақыт бойы сақталатын зомбилер әдетте ата-ана бағдарламасындағы қатеге немесе балаларды жинамау туралы сирек кездесетін шешімге нұсқайды (мысалға қараңыз). Егер ата-ана бағдарламасы енді жұмыс істемейтін болса, зомби процестер әдетте операциялық жүйедегі қатеге нұсқайды. Басқа ресурстардың ысырабы сияқты, бірнеше зомбидің болуы өзінен-өзі алаңдатуға себеп емес, бірақ жүктеме артқанда ауыр проблемаға ұласуы мүмкін мәселені көрсетуі мүмкін. Зомби процестеріне жад бөлінбегендіктен – жүйе жадының тек процестің кестесіне кіру үшін ғана пайдаланылады – көптеген зомбилердің басты мәселесі жадтың ысырабы емес, керісінше процесс кестесіне кірулердің, атап айтқанда процесс идентификаторларының таусылуы. Дегенмен, зомбилер файл дескрипторларымен байланысты буферлерді ашық күйде ұстай алады, осылайша жадты ысырапқа салады. Зомбилер жойылған файлдың файл дескрипторын да ұстап тұруы мүмкін. Бұл файлдық жүйенің жойылған файлдың i-түйіндерін қалпына келтіруіне кедергі келтіреді. Сондықтан, дискінің пайдалануын көрсету командасы зомби файл дескрипторын ұстап тұрғандықтан қайта пайдалануға болмайтын жойылған файлдарды есепке алмайды. Зомбилерді жүйеден жою үшін SIGCHLD сигналын ата-анаға қолмен жіберуге болады, kill командасын пайдаланып. Егер ата-ана процесі әлі де зомбині жинаудан бас тартса және ата-ана процесін тоқтатуға рұқсат болса, келесі қадам ата-ана процесін жою болуы мүмкін. Процесс ата-анасын жоғалтқанда, init оның жаңа ата-анасына айналады. Init жүйелік шақыруды үнемі орындап, init-ті ата-ана ретінде кез келген зомбилерді жинап алады.
Түсіндірме
Бірінші циклде бастапқы (аталық) процесс өзінен 10 көшірме жасайды. Бұл процестердің әрқайсысы (fork нөлді қайтарғаны арқылы анықталады) хабарлама басып шығарады, ұйықтайды және аяқталады. Барлық балалар шамамен бір уақытта құрылады (аталық процесс циклде өте аз жұмыс істейтіндіктен), сондықтан олардың әрқайсысы алғаш рет қашан орындалатыны кездейсоқ болады, демек олардың хабарламалары шатасқан тәртіппен шығады. Цикл барысында бала процестердің идентификаторларының массиві құрылады. Барлық 11 процесс pids[] массивінің көшірмесіне ие, бірақ толық массив тек аталық процесс үшін ғана қолжетімді – әрбір баладағы көшірме төменгі нөмірленген бала процестердің PID-ін жоғалтады және өзінің PID-і үшін нөлді көрсетеді. (Бірақ бұл аса маңызды емес, себебі бұл массивті тек аталық процесс пайдаланады.) Екінші цикл тек аталық процесс ішінде орындалады (барлық балалар осы уақытқа дейін аяқталғандықтан), және әрбір баланың аяқталуын күтеді. Ол 10 секунд ұйықтаған баланы күтеді; қалғандары бұрын-ақ аяқталған, сондықтан барлық хабарламалар (біріншісінен басқа) бірден пайда болады. Мұнда хабарламалардың кездейсоқ ретіне мүмкіндік жоқ, өйткені бұл бір процесс ішіндегі циклмен басқарылады. Бірінші аталық хабарлама балалардың хабарламаларынан бұрын пайда болды – аталық екінші циклге өтуге үлкерді, тіпті балалық процестер басталмастан. Бұл процессор жоспарлаушының кездейсоқ мінез-құлқы, «parent9» хабарламасы «parent8» хабарламасынан бұрын тізбекте кез келген жерде пайда болуы мүмкін. Бала0-ден Бала8-ге дейінгі процестер осы күйде бір немесе бірнеше секунд өткізеді, олар аяқталған уақыт пен аталық процесс оларды күткен уақыт аралығында. Аталық процесс Бала9 аяқталмас бұрын күте бастағандықтан, ол процесс зомби күйінде уақыт өткізбеді.