- Proses ilə axını fərqləndirmək və yarış vəziyyətini izah etmək
- FCFS, SJF və Round Robin üçün orta gözləmə vaxtını hesablamaq
- Virtual ünvanı fiziki ünvana çevirmək və səhifə xətalarını saymaq
- Qarşılıqlı bloklanmanın dörd şərtini və bankir alqoritmini tətbiq etmək
Noutbukunda eyni anda brauzer, musiqi, mesencer və antivirus işləyir, amma prosessorun nüvələri cəmi bir neçədir, yaddaş da məhduddur. Hər proqram «bütün kompüter mənimdir» deyə düşünür — bu illüziyanı əməliyyat sistemi (ƏS) yaradır. ƏS prosessor vaxtını bölüşdürür, hər proqrama ayrıca yaddaş verir, faylları diskdə təşkil edir və proqramların bir-birini «kilidləməsinin» qarşısını alır.
Proseslər, axınlar və planlaşdırma
Proses — icra olunan proqramdır: öz virtual ünvan fəzası (kod, verilənlər, heap), açıq faylları və ən azı bir axını var. Axın (thread) — proses daxilində icra ardıcıllığıdır: öz steki, registrləri və PC-si olur, amma prosesin yaddaşını digər axınlarla bölüşür. Axın yaratmaq və onlar arasında keçid proseslərdən ucuzdur, lakin ortaq yaddaş sinxronizasiya tələb edir.
İki axın ortaq counter = 5 dəyişənini 1 artırır. Hər biri üç addım edir: oxu (tmp = counter), artır (tmp + 1), yaz (counter = tmp). Planlayıcı onları belə növbələşdirsə, nəticə nə olar: A oxu, B oxu, A artır, A yaz, B artır, B yaz?
Həllini göstərHəllini gizlət
A: tmpA = 6, counter = 6. B: tmpB = 6, counter = 6.
İki artırmadan sonra 7 əvəzinə 6 alındı — bir yeniləmə «itdi». Nəticə növbələşmə sırasından asılıdır: bu, yarış vəziyyətidir. Həll: kritik bölməni mutex (kilid) ilə qorumaq ki, «oxu–artır–yaz» bölünməz olsun.
Hazır proseslər növbədə gözləyir və planlayıcı hansının prosessoru alacağına qərar verir. FCFS — gəlmə sırası ilə; SJF — ən qısa iş əvvəl (orta gözləmə vaxtını minimallaşdırır, amma işin uzunluğunu əvvəlcədən bilmək lazımdır); Round Robin — hər prosesə q kvant vaxt verilir, sonra o, növbənin sonuna keçir. Hər keçid kontekst dəyişməsi tələb edir: registrlərin saxlanması və bərpası.
- Worta gözləmə vaxtı
- Cᵢi prosesinin bitmə anı
- Aᵢgəlmə anı
- Bᵢprosessor işinin uzunluğu (burst)
P1 = 10, P2 = 4, P3 = 2 ms işi olan proseslər 0 anında bu sıra ilə gəlib. FCFS, SJF və Round Robin (q = 3) üçün orta gözləmə vaxtını tap.
Həllini göstərHəllini gizlət
SJF: P3 0–2, P2 2–6, P1 6–16 → gözləmə 0, 2, 6 → W = 8/3 ≈ 2,67 ms.
RR, q = 3: P1 0–3, P2 3–6, P3 6–8 (bitdi), P1 8–11, P2 11–12 (bitdi), P1 12–16 (bitdi).
Gözləmə = bitmə − iş: P1 16 − 10 = 6, P2 12 − 4 = 8, P3 8 − 2 = 6 → W = 20/3 ≈ 6,67 ms.
RR gözləmədə SJF-ə uduzur, amma hər proses 6 ms ərzində cavab almağa başlayır — interaktiv sistemlər üçün məhz bu vacibdir.
from collections import deque
def fcfs(bursts):
t, waits = 0, []
for b in bursts:
waits.append(t)
t += b
return waits
def round_robin(bursts, q):
rem, t, done = list(bursts), 0, [0] * len(bursts)
queue = deque(range(len(bursts)))
while queue:
i = queue.popleft()
run = min(q, rem[i])
t += run
rem[i] -= run
if rem[i]:
queue.append(i)
else:
done[i] = t
return [done[i] - bursts[i] for i in range(len(bursts))]
jobs = [10, 4, 2]
for name, w in [('FCFS', fcfs(jobs)), ('SJF', fcfs(sorted(jobs))), ('RR q=3', round_robin(jobs, 3))]:
print(name, w, 'average wait:', round(sum(w) / len(w), 2))▸ Gözlənilən nəticə
FCFS [0, 10, 14] average wait: 8.0 SJF [0, 2, 6] average wait: 2.67 RR q=3 [6, 8, 6] average wait: 6.67
Virtual yaddaş və səhifələmə
Hər proses 0-dan başlayan öz virtual ünvan fəzasını görür. Yaddaş eyni ölçülü səhifələrə (məsələn, 4 KB), fiziki RAM isə eyni ölçülü çərçivələrə bölünür; hər prosesin səhifələr cədvəli «səhifə → çərçivə» uyğunluğunu saxlayır. Çevirməni aparat (MMU) edir, son çevirmələri isə TLB keşində saxlayır. Səhifə RAM-da deyilsə, səhifə xətası baş verir və ƏS onu diskdən yükləyir — beləliklə, proqramlar fiziki RAM-dan çox yaddaş istifadə edə bilir və bir-birinin yaddaşını görmür.
- VA, PAvirtual və fiziki ünvan
- Psəhifənin ölçüsü, bayt
- p, dsəhifə nömrəsi və səhifə daxilində sürüşmə
P = 2ᵏ olanda bölmə sadəcə bitləri ayırmaqdır: 4 KB = 2¹² səhifədə aşağı 12 bit sürüşmə, qalanları səhifə nömrəsidir.
a) Səhifə 4 KB, VA = 0x3A7C, səhifələr cədvəlində 3 → 7. Fiziki ünvan nədir?
b) RAM-a müraciət 100 ns, səhifə xətasının emalı 8 ms, xəta ehtimalı p = 0,001. Effektiv müraciət vaxtı nədir?
Həllini göstərHəllini gizlət
PA = 7 · 4096 + 2684 = 28 672 + 2684 = 31 356 = 0x7A7C. Onaltılıqda sadəcə səhifə rəqəmi dəyişdi: 0x3A7C → 0x7A7C.
b) EAT = (1 − p) · 100 + p · 8 000 000 ns = 99,9 + 8000 ≈ 8100 ns ≈ 8,1 mks — min müraciətdən birinin xətası yaddaşı 81 dəfə yavaşladır!
RAM dolanda ƏS hansı səhifəni diskə çıxaracağını seçməlidir. FIFO ən köhnə yüklənəni, LRU ən uzun müddət istifadə olunmayanı çıxarır. Nəzəri ideal OPT gələcəkdə ən gec lazım olacaq səhifəni çıxarır, amma gələcəyi bilmək mümkün deyil, ona görə o, yalnız müqayisə üçün işlədilir.
def faults(refs, frames, policy):
mem, count = [], 0
for p in refs:
if p in mem:
if policy == 'LRU':
mem.remove(p)
mem.append(p)
continue
count += 1
if len(mem) == frames:
mem.pop(0)
mem.append(p)
return count
refs = [1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5]
for frames in [3, 4]:
print(frames, 'frames: FIFO', faults(refs, frames, 'FIFO'), '| LRU', faults(refs, frames, 'LRU'))
page_size, va = 4096, 0x3A7C
page, offset = divmod(va, page_size)
page_table = {3: 7}
pa = page_table[page] * page_size + offset
print('page', page, 'offset', offset, '-> physical', pa, hex(pa))▸ Gözlənilən nəticə
3 frames: FIFO 9 | LRU 10 4 frames: FIFO 10 | LRU 8 page 3 offset 2684 -> physical 31356 0x7a7c
Fayl sistemləri
Disk sabit ölçülü bloklara (adətən 4 KB) bölünür. Unix fayl sistemlərində (ext4) hər faylın inode-u ölçünü, sahibini, icazələri, vaxtları və məlumat bloklarına göstəriciləri saxlayır; kataloq isə sadəcə «ad → inode nömrəsi» cədvəlidir. Klassik ext2/ext3 inode-unda 12 birbaşa göstərici və bir, iki, üç pilləli dolayı göstəricilər var: 4 KB blok və 4 baytlıq göstəricidə birbaşa bloklar 48 KB, bir pilləli blok əlavə 1024 · 4 KB = 4 MB, iki pilləli 4 GB, üç pilləli 4 TB ünvanlayır. Jurnallama (ext4, NTFS) dəyişiklikləri əvvəlcə jurnala yazır ki, elektrik kəsiləndə fayl sistemi korlanmasın. FAT32-də isə bir faylın ölçüsü 4 GB-dan kiçik olmalıdır.
Qarşılıqlı bloklanma (deadlock)
A axını 1-ci kilidi tutub 2-ci kilidi gözləyir, B axını isə 2-cini tutub 1-cini gözləyir — heç biri irəli gedə bilmir. Koffmanın dörd şərti birlikdə ödənəndə deadlock mümkündür: qarşılıqlı istisna (resursu eyni anda bir nəfər işlədir), tutub gözləmə, zorla almamaq (resurs əlindən alınmır) və dairəvi gözləmə. Hər hansı birini pozmaq kifayətdir; ən praktik üsul — bütün kilidləri həmişə eyni qlobal sıra ilə tutmaq, bu, dairəvi gözləməni istisna edir.
Sistemdə 10 eyni resurs var. P0: maksimum 7, tutur 3; P1: maksimum 3, tutur 1; P2: maksimum 6, tutur 3. Vəziyyət təhlükəsizdirmi? P0 daha 2 resurs istəsə, onu vermək olarmı?
Həllini göstərHəllini gizlət
P1: 2 ≤ 3 → bitir, qaytarır → boş 4. P2: 3 ≤ 4 → boş 7. P0: 4 ≤ 7 → boş 10.
Təhlükəsiz ardıcıllıq P1, P2, P0 var → vəziyyət təhlükəsizdir.
P0-a 2 versək: P0 tutur 5, ehtiyac 2, boş 1. Heç kimin ehtiyacı ≤ 1 deyil (P0 2, P1 2, P2 3) → təhlükəli vəziyyət, sorğu gözlədilir. Təhlükəli hələ deadlock demək deyil, amma ƏS onu riskə atmır.
Əsas fikirlər
- Proses öz ünvan fəzasına malikdir; onun axınları yaddaşı bölüşür, ona görə ortaq verilənlər kilidlə qorunmalıdır.
- SJF orta gözləməni minimallaşdırır, Round Robin cavab vaxtını qısaldır; gözləmə = bitmə − gəlmə − iş.
- Virtual ünvan = səhifə + sürüşmə; PA = frame · P + d; səhifə xətaları effektiv müraciət vaxtını kəskin artırır.
- LRU adətən FIFO-dan yaxşıdır; FIFO-da Belady anomaliyası mümkündür.
- Deadlock üçün dörd şərt birlikdə lazımdır; kilidləri eyni sıra ilə tutmaq və bankir alqoritmi onun qarşısını alır.
Özünü yoxla
10 sual. Hər düzgün cavab XP qazandırır.