Process — operatsion tizimda bajarilayotgan dastur instance’i. Executable fayl diskdagi kod bo‘lsa, process shu kodning xotira, register, resurs va bajarilish holatiga ega faol ko‘rinishi.
Bir xil dasturdan bir nechta process ishga tushishi mumkin. Har biri alohida PID va address space oladi.
Operatsion tizim processlarni yaratadi, rejalashtiradi, izolatsiya qiladi va tugatadi.
Process tarkibi
Process quyidagilarga ega:
- virtual address space;
- executable code;
- stack;
- heap;
- register holati;
- open file descriptor;
- environment;
- current directory;
- signal handler;
- user va group;
- threadlar;
- resource limit.
Kernel process haqidagi metadata’ni process control blockda saqlaydi.
PID
Har processga Process ID beriladi.
PID tizimda ma’lum vaqt davomida noyob.
Process tugagach PID keyin boshqa processga berilishi mumkin.
Uzoq muddatli identifikatsiya uchun faqat PIDga tayanish xavfli.
Parent va child
Yangi process mavjud process tomonidan yaratiladi.
Unixda fork() parent nusxasini yaratadi, exec() esa yangi dastur kodini yuklaydi.
Child parent PIDini bilishi mumkin.
Process daraxti init tizimigacha boradi.
Fork
fork() parentning address space mantiqiy nusxasini yaratadi.
Copy-on-write sabab barcha memory darhol fizik nusxalanmaydi.
Parent yoki child sahifani o‘zgartirganda alohida nusxa yaratiladi.
Exec
exec mavjud process image’ni yangi executable bilan almashtiradi.
PID saqlanadi, ammo:
yangilanadi.
Fork va exec shell buyruq ishga tushirishining klassik modelidir.
Process holatlari
Process quyidagi holatlarda bo‘lishi mumkin:
- running;
- runnable;
- sleeping;
- uninterruptible sleep;
- stopped;
- zombie;
- dead.
Aniq nom va model OSga bog‘liq.
Running va runnable
Running process ayni paytda CPUda bajarilmoqda.
Runnable process bajarishga tayyor, lekin scheduler CPU navbatini kutmoqda.
Ko‘p runnable process load average va CPU contentionni oshiradi.
Sleeping
Process eventni kutadi:
Interruptible sleep signal bilan uyg‘onishi mumkin.
Uninterruptible sleep ko‘pincha kernel I/O operatsiyasini kutadi.
Zombie
Child tugagan, lekin parent uning exit statusini hali o‘qimagan.
Zombie CPU ishlatmaydi va memoryning katta qismini bo‘shatgan, ammo process table entry saqlanadi.
Parent wait() qilishi kerak.
Ko‘p zombie noto‘g‘ri child managementni ko‘rsatadi.
Orphan
Parent tugab, child ishlashda davom etsa orphan process yuz beradi.
Init yoki subreaper uni o‘ziga qabul qilib, keyinchalik exit statusni yig‘adi.
Address space
Har process o‘z virtual manzil maydoniga ega.
Qismlar:
Virtual memory processlarni bir-biridan ajratadi.
File descriptor
Process ochiq fayl, socket, pipe va device’larni file descriptor orqali boshqaradi.
Standart descriptorlar:
- 0 — stdin;
- 1 — stdout;
- 2 — stderr.
Forkda descriptorlar childga meros bo‘lishi mumkin.
Environment
Environment variable process ishga tushganda beriladi.
Misollar:
PATH;HOME;LANG;- application setting;
- secret.
Process boshqa process environmentini permission bo‘lsa ko‘rishi mumkin. Secretni environmentda saqlash xavfsizlik siyosatiga bog‘liq.
User va permission
Process real va effective user IDga ega.
Kernel fayl, socket va signal ruxsatini shu identifikatorlar asosida tekshiradi.
Setuid executable vaqtincha boshqa effective user bilan ishlashi mumkin.
Scheduler
Scheduler runnable process va threadlarga CPU vaqt beradi.
Siyosatlar:
Juda yuqori real-time process tizimni bloklashi mumkin.
Context switch
CPU bir processdan boshqasiga o‘tganda register va boshqa holat saqlanadi.
Context switch zarur, ammo overheadga ega.
Ko‘p thread, lock va I/O switch sonini oshirishi mumkin.
Signal
Processga asinxron hodisa yuboriladi.
Misollar:
- SIGTERM;
- SIGKILL;
- SIGINT;
- SIGCHLD;
- SIGHUP;
- SIGSEGV.
Process ayrim signalni handler bilan qayta ishlaydi.
Exit status
Process tugaganda integer exit code qaytaradi.
Odatda:
- 0 — muvaffaqiyat;
- boshqa qiymat — xato.
Shell $? orqali oxirgi buyruq statusini ko‘radi.
Signal bilan tugash alohida qayd etiladi.
Resource limit
Process uchun limitlar:
Limitlar bitta processning butun tizim resursini egallashini cheklaydi.
Namespace va cgroup
Container processlari namespace orqali alohida ko‘rinish oladi.
Cgroup CPU, memory va I/Oni cheklaydi.
Container ichidagi PID 1 hostda boshqa PID bo‘lishi mumkin.
Process va thread
Process address space va resurs konteyneri.
Thread shu process ichidagi bajarilish oqimi.
Threadlar:
- heap;
- code;
- file descriptor
ni bo‘lishadi, lekin har biri o‘z stack va registeriga ega.
Monitoring
Process uchun:
kuzatiladi.
Faqat CPU foizi process holatini to‘liq ko‘rsatmaydi.
Diagnostika
Process muammosida:
- PID;
- parent;
- state;
- CPU;
- memory;
- file descriptor;
- thread;
- signal;
- syscall;
- log;
- core dump;
- permission
tekshiriladi.
Process mavjud bo‘lsa ham, deadlock yoki I/O kutish sabab foydali ish qilmayotgan bo‘lishi mumkin.
Core dump
Process segmentation fault yoki boshqa signal bilan tugaganda xotira holati core dumpga yozilishi mumkin.
ni tahlil qiladi.
Core dump ichida parol va foydalanuvchi ma’lumoti bo‘lishi mumkin. Saqlash ruxsati va retention cheklanadi.
Process group va session
Shell pipeline’dagi processlar bitta process groupga birlashtiriladi. Terminal signalni butun foreground groupga yuborishi mumkin.
Session bir nechta process groupni qamrab oladi. Daemon setsid() orqali terminaldan mustaqil yangi session yaratadi.
Bog‘liq tushunchalar
PID, Thread, Fork, Exec, Scheduler, Virtual memory, File descriptor, Signal, Zombie, Cgroup, Namespace