3-bo‘lim
Jarayon va uning holatlari
Jarayon nima, uning xotira tuzilishi, holatlari va holat almashinuvi, PCB, kontekst almashinuvi va jarayonlarni kuzatish.
Ushbu bo‘lim mundarijasi
Jarayon (process) - ishga tushirilgan dastur. Dastur diskda yotgan fayl, jarayon esa xotirada yashaydigan jonli mavjudot.
Dastur va jarayon farqi #
Jarayonning xotira tuzilishi #
#include <stdio.h>
#include <stdlib.h>
int global_qiymatli = 42; /* data */
int global_nol; /* bss */
int main(void) {
int mahalliy = 7; /* stek */
int *uyumda = malloc(sizeof(int)); /* uyum */
if (uyumda == NULL) {
return 1;
}
*uyumda = 100;
printf("Kod (main) : %s\n", (void *) main != NULL ? "bor" : "yo'q");
printf("Global (data) : %d\n", global_qiymatli);
printf("Global (bss) : %d\n", global_nol);
printf("Stek : %d\n", mahalliy);
printf("Uyum : %d\n", *uyumda);
/* manzillar tartibini tekshiramiz */
printf("Uyum stekdan pastdami? : %s\n",
(void *) uyumda < (void *) &mahalliy ? "ha" : "yo'q");
free(uyumda);
return 0;
}
Kod (main) : bor
Global (data) : 42
Global (bss) : 0
Stek : 7
Uyum : 100
Uyum stekdan pastdami? : ha
bss nima?bss - «Block Started by Symbol». Bu yerda nol bilan boshlanadigan
global o'zgaruvchilar yotadi.
Ular fayl ichida joy egallamaydi - faylda faqat «shuncha bayt nol kerak» deb yoziladi. Dastur ishga tushganda yadro o'sha joyni nol bilan to'ldiradi.
Shuning uchun int katta_massiv[1000000]; deb e'lon qilingan dastur
faylining hajmi 4 MB emas, balki bir necha kilobayt bo'ladi.
Jarayon holatlari #
| Holat | Ma'nosi |
|---|---|
| Yangi | Yaratilmoqda, hali ishga tushmagan |
| Tayyor | Ishlashga tayyor, protsessor navbatini kutmoqda |
| Ishlayotgan | Hozir protsessorda buyruqlar bajarilmoqda |
| Bloklangan | Biror narsani kutmoqda (disk, tarmoq, klaviatura) |
| Tugagan | Ish tugadi, resurslar qaytarilmoqda |
Dastur diskdan ma'lumot so'raganida, javob millionlab protsessor tsikli davom etadi. Bu vaqt ichida protsessorni bo'sh turg'azish - katta isrof.
Shuning uchun yadro jarayonni bloklangan holatga o'tkazadi va protsessorni boshqasiga beradi. Ma'lumot kelganda jarayon yana tayyor navbatiga qaytadi.
Aynan shu mexanizm bir protsessorli kompyuterda ham o'nlab dastur bir vaqtda ishlayotgandek tuyulishiga sabab bo'ladi.
Linux'da holatlarni ko'rish #
ps aux | head -5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 168404 11928 ? Ss 09:12 0:02 /sbin/init
root 2 0.0 0.0 0 0 ? S 09:12 0:00 [kthreadd]
husan 842 1.2 2.4 985432 39812 ? Sl 09:15 0:45 /usr/bin/firefox
husan 901 0.0 0.0 12456 3204 pts/0 R+ 10:22 0:00 ps aux
STAT | Ma'nosi |
|---|---|
R | Ishlayotgan yoki tayyor (running / runnable) |
S | Uxlayotgan - uzilishi mumkin (interruptible sleep) |
D | Uxlayotgan - uzilmaydi (odatda disk kutmoqda) |
Z | Zombi - tugagan, lekin otasi hali o'qimagan |
T | To'xtatilgan (Ctrl+Z bilan) |
s | Sessiya boshlig'i |
+ | Old fonda (foreground) |
l | Ko'p oqimli |
D holati - diqqat belgisiD holatidagi jarayonni o'ldirib bo'lmaydi - hatto kill -9 ham
ta'sir qilmaydi.
U diskdan yoki tarmoqdan javob kutmoqda va uzilishga javob bermaydi. Odatda bu:
- nosoz disk;
- javob bermayotgan tarmoq fayl tizimi (NFS);
- USB qurilma uzilib qolgani
haqida signal beradi. Uzoq vaqt D holatida turgan jarayon - tizimda
apparat muammosi borligining alomati.
Jarayon identifikatori #
#include <stdio.h>
#include <unistd.h>
int main(void) {
pid_t ozim = getpid();
pid_t otam = getppid();
printf("Mening PID : %s\n", ozim > 0 ? "olindi" : "xato");
printf("Otamning PID : %s\n", otam > 0 ? "olindi" : "xato");
printf("PID musbat son : %s\n", ozim > 0 ? "ha" : "yo'q");
/* aniq raqamlarni ko'rish uchun: */
/* printf("PID = %d, PPID = %d\n", ozim, otam); */
return 0;
}
Mening PID : olindi
Otamning PID : olindi
PID musbat son : ha
PID (Process ID) - jarayonning noyob raqami. U har safar dasturni ishga tushirganingizda boshqacha bo'ladi.
Linux'da PID lar ketma-ket beriladi va chegaraga yetganda yana boshdan boshlanadi:
cat /proc/sys/kernel/pid_max
Odatda 4 194 304. PID 1 - init yoki systemd, u birinchi bo'lib
ishga tushadi va boshqa hamma jarayonlarning ajdodi hisoblanadi.
Jarayonlar daraxti #
pstree -p | head -12
systemd(1)─┬─ModemManager(892)─┬─{ModemManager}(915)
│ └─{ModemManager}(921)
├─NetworkManager(878)───{NetworkManager}(902)
├─bash(1204)───pstree(1567)
├─cron(864)
├─sshd(901)───sshd(1198)───bash(1204)
└─systemd-journal(312)
Har bir jarayonning otasi bor. Daraxt ildizi - systemd (PID 1).
Jarayon boshqaruv bloki (PCB) #
Yadro har bir jarayon haqida ma'lumotni maxsus tuzilmada saqlaydi.
Linux'da u task_struct deb ataladi.
| PCB da nima saqlanadi | Nima uchun |
|---|---|
| PID va PPID | Kimligini aniqlash |
| Holat | Tayyor, ishlayotgan, bloklangan |
| Registrlar nusxasi | To'xtatilgan joydan davom etish uchun |
| Xotira xaritasi | Qaysi sahifalar unga tegishli |
| Ochiq fayllar ro'yxati | Fayl deskriptorlari |
| Foydalanuvchi (UID) | Huquqlarni tekshirish |
| Ustuvorlik | Rejalashtirish uchun |
| Ishlatilgan vaqt | Statistika va adolatli taqsimot |
ls /proc/self/
cmdline cwd environ exe fd limits maps root stat status task
/proc/<PID>/ papkasi - bu PCB ning ochiq ko'rinishi.
cat /proc/self/status | head -8
Name: cat
Umask: 0022
State: R (running)
Tgid: 2451
Ngid: 0
Pid: 2451
PPid: 1204
TracerPid: 0
Kontekst almashinuvi #
vmstat 1 3
procs -----------memory---------- ---system-- ------cpu-----
r b swpd free buff cache in cs us sy id wa st
2 0 0 6823456 234560 4512332 1245 3421 3 1 96 0 0
1 0 0 6823012 234560 4512332 1102 2987 2 1 97 0 0
0 0 0 6822980 234560 4512332 987 2654 1 1 98 0 0
cs ustuni - sekundiga nechta kontekst almashinuvi bo'lganini
ko'rsatadi. in esa uzilishlar (interrupts) soni.
Agar cs qiymati o'n minglab bo'lsa, tizim foydali ish o'rniga
almashinuv bilan band bo'lishi mumkin.
Sabablari:
- juda ko'p faol oqim (thread);
- qulflar uchun kurash (lock contention);
- noto'g'ri sozlangan dastur.
Bu holat «thrashing» deb ataladi.
Jarayonni kuzatish #
top -b -n 1 | head -12
top - 10:45:32 up 2 days, 3:12, 2 users, load average: 0.42, 0.38, 0.35
Tasks: 312 total, 1 running, 311 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.1 us, 0.8 sy, 0.0 ni, 97.0 id, 0.1 wa, 0.0 hi, 0.0 si
MiB Mem : 15903.4 total, 6823.1 free, 4212.5 used, 4867.8 buff/cache
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
842 husanboy 20 0 985432 398124 145232 S 1.2 2.4 0:45.23 firefox
1204 husanboy 20 0 12456 5204 3412 S 0.0 0.0 0:00.12 bash
| Ustun | Ma'nosi |
|---|---|
PR / NI | Ustuvorlik va «xushmuomalalik» darajasi |
VIRT | Virtual xotira - so'ralgan hajm |
RES | Haqiqiy xotira - RAM da yotgan hajm |
SHR | Boshqalar bilan bo'lishilgan xotira |
%CPU | Protsessor ulushi |
TIME+ | Jami protsessor vaqti |
VIRT va RES farqiVIRT odatda RES dan ancha katta bo'ladi va bu normal.
Dastur 1 GB xotira so'rashi mumkin, lekin faqat 100 MB ini haqiqatan ishlatadi. Yadro qolganini RAM ga yuklamaydi.
Xotira muammosini baholashda RES ga qarang, VIRT ga emas.
Buni 10-bo'limda, virtual xotira mavzusida batafsil ko'ramiz.
Jarayonga ta'sir qilish #
kill 1234 # muloyim so'rov: tugating (SIGTERM)
kill -9 1234 # majburiy to'xtatish (SIGKILL)
kill -STOP 1234 # muzlatish
kill -CONT 1234 # davom ettirish
pkill firefox # nom bo'yicha
killall firefox # barcha nusxalarini
kill -9 - oxirgi chorakill -9 jarayonga hech qanday imkon bermaydi: u ochiq fayllarni
yopmaydi, buferni bo'shatmaydi, vaqtinchalik fayllarni tozalamaydi.
Natijada:
- yozilmagan ma'lumot yo'qoladi;
- yarim yozilgan fayl buziladi;
- qulf fayllari qolib ketadi.
Avval oddiy kill (SIGTERM) ni sinang - u dasturga tozalanish imkonini
beradi. Faqat javob bermasa -9 ga o'ting.
16-bo'limda signallarni batafsil ko'ramiz.
ps auxbilan tizimingizdagi jarayonlarni ko'ring.STATustunidagi turli holatlarni toping va izohlang.pstreebilan jarayonlar daraxtini chizing.- O'z dasturingizning PID va PPID sini chiqaring.
/proc/self/statusfaylini o'qing./proc/<PID>/mapsbilan jarayon xotira xaritasini ko'ring.vmstat 1 5bilan kontekst almashinuvlarini kuzating.topdaVIRTvaRESfarqini kuzating.- Cheksiz sikl yozib, uni
topda toping vakillbilan to'xtating. killvakill -9farqini sinab ko'ring.
Xulosa #
- Dastur - diskdagi fayl; jarayon - ishga tushirilgan dastur.
- Bir dasturdan ko'p jarayon yaratish mumkin, har birining o'z xotirasi bor.
- Jarayon xotirasi beshta sohaga bo'linadi: text, data, bss, uyum, stek.
- Stek va uyum bir-biriga qarab o'sadi.
- Asosiy holatlar: tayyor, ishlayotgan, bloklangan.
- I/O kutayotgan jarayon bloklanadi va protsessorni boshqasiga beradi.
Dholati odatda apparat muammosidan darak beradi.- Yadro har bir jarayon haqidagi ma'lumotni PCB da saqlaydi;
Linux'da uni
/proc/<PID>/orqali ko'rish mumkin. - Kontekst almashinuvi bepul emas - juda ko'p bo'lsa tizim sekinlashadi.
VIRTso'ralgan,REShaqiqatan ishlatilgan xotira.kill -9oxirgi chora - u tozalanishga imkon bermaydi.
Keyingi bo'limda jarayon qanday yaratilishini - fork va exec ni
ko'ramiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.