18-bo‘lim
Kiritish-chiqarish va uzilishlar
So'rab turish va uzilish farqi, uzilishlar jadvali, kontekst saqlash, DMA va qurilmalar bilan aloqa usullari.
Ushbu bo‘lim mundarijasi
Shu paytgacha protsessor faqat xotira bilan ishladi. Lekin kompyuterda klaviatura, disk, tarmoq kartasi ham bor.
Muammo shundaki, ular protsessordan millionlab barobar sekin.
So'rab turish va uzilish #
Eng sodda yechim - so'rab turish (polling): protsessor qurilmadan "tayyormisan?" deb doimo so'raydi.
Klaviaturadan 5 ta belgi o'qiymiz. Har belgi orasida qurilma 1000 takt tayyorlanadi:
| Usul | Jami takt | Bekor ketdi | Boshqa ishga qoldi |
|---|---|---|---|
| So'rab turish | 5 050 | 5 000 | 50 |
| Uzilish | 5 300 | 0 | 5 300 |
Diqqat qiling: uzilishda jami takt ko'proq (5 300 va 5 050). Uzilishning o'zi ham qimmatga tushadi.
Lekin farq shundaki, so'rab turishda protsessor o'sha 5 000 taktni kutishga sarflaydi va boshqa hech narsa qila olmaydi. Uzilishda esa u butun vaqtni boshqa dasturga beradi.
Ya'ni savol "qaysi biri kamroq takt oladi" emas, balki "takt qayerga sarflanadi".
Diqqat qiling: uzilish varianti ko'proq takt oldi (5300 va 5050). Lekin undagi taktlarning hammasi foydali - protsessor kutmadi, boshqa ish qildi.
Uzilishning ham narxi bor: kontekstni saqlash va tiklash ~50-100 takt turadi.
Shuning uchun qurilma juda tez bo'lsa, so'rab turish afzalroq:
| Vaziyat | Qaysi usul |
|---|---|
| Klaviatura, disk | Uzilish |
| Yuqori tezlikdagi tarmoq kartasi | So'rab turish |
| SSD navbati | Aralash |
| Mikrokontroller, oddiy sensor | So'rab turish (sodda) |
Linux tarmoq drayverlarida NAPI degan aralash usul bor: yuk kam bo'lganda uzilish, trafik ko'payganda so'rab turishga o'tadi.
Bu tipik muhandislik qarori: bitta "to'g'ri" javob yo'q, sharoitga qarab tanlanadi.
Uzilishlar jadvali #
Protsessor uzilish kelganda qayerga sakrashni qayerdan biladi? Javob - xotiradagi jadvaldan.
Har qurilmaga o'z raqami beriladi va shu raqam bo'yicha ishlovchi topiladi:
| Uzilish raqami | Qurilma |
|---|---|
| 0 | taymer |
| 1 | klaviatura |
| 14 | disk |
Dastur ishlayotganda uzilishlar aralash keladi:
| Takt | Kelgan uzilish | Kim |
|---|---|---|
| 1 | 0 | taymer |
| 2 | 0 | taymer |
| 3 | 1 | klaviatura |
| 4 | 0 | taymer |
| 5 | 14 | disk |
| 6 | 0 | taymer |
| 7 | 1 | klaviatura |
| 8 | 0 | taymer |
Sakkiz taktda taymer 5 marta urdi va klaviaturadan ikkita belgi keldi.
Taymer uzilishi eng muhimi: aynan u operatsion tizimga dasturlarni navbatma-navbat bajarish imkonini beradi. Usiz ko'p vazifalilik mumkin bo'lmasdi.
Uzilish kelganda protsessor uch qadamni bajaradi:
| Qadam | Nima bo'ladi |
|---|---|
| 1 | Joriy holat (KK, registrlar, bayroqlar) saqlanadi |
| 2 | Jadvaldan ishlovchi topiladi va chaqiriladi |
| 3 | Holat tiklanadi va dastur davom etadi |
Dastur uzilish bo'lganini sezmaydi ham - xuddi hech narsa bo'lmagandek davom etadi.
Jadvaldagi 0-uzilishga e'tibor bering: taymer. U doimiy ravishda, soniyada yuzlab marta keladi.
Aynan shu operatsion tizimga dasturlarni almashtirish imkonini beradi:
| Qadam | Nima bo'ladi |
|---|---|
| 1 | Taymer uzilishi keladi |
| 2 | Yadro boshqaruvni oladi |
| 3 | Joriy jarayon holati saqlanadi |
| 4 | Rejalashtiruvchi keyingi jarayonni tanlaydi |
| 5 | Uning holati tiklanadi va u davom etadi |
Usiz majburiy ko'p vazifalilik bo'lmasdi: cheksiz halqaga tushgan dastur butun tizimni qotirib qo'yardi.
Bu "Operatsion tizimlar" darsligining 6-bo'limida batafsil ko'rilgan.
DMA - protsessorni chetlab o'tish #
Diskdan 1 MB o'qish kerak bo'lsin. Protsessor har baytni o'zi ko'chirsa, u million marta band bo'ladi.
DMA (Direct Memory Access) buni hal qiladi: maxsus qurilma ma'lumotni to'g'ridan-to'g'ri xotiraga ko'chiradi.
| Qadam | Kim bajaradi |
|---|---|
| 1. "Shu yerdan o'qib, mana bu manzilga yoz" | Protsessor (bir marta) |
| 2. Ma'lumotni ko'chirish | DMA qurilmasi |
| 3. "Tayyor" uzilishi | DMA qurilmasi |
| 4. Ma'lumot bilan ishlash | Protsessor |
Protsessor 2-qadamda butunlay bo'sh - u boshqa dastur bajaradi.
Bugun deyarli barcha tez qurilmalar DMA ishlatadi: disk, tarmoq kartasi, videokarta, ovoz.
Uzilish kelganda protsessor joriy ishni to'xtatadi. Ishlovchi uzoq ishlasa, butun tizim javob bermay qoladi.
Qoidalar:
| Qoida | Sabab |
|---|---|
| Ishlovchi qisqa bo'lsin | Boshqa uzilishlar kutadi |
| Uzoq ishni keyinga qoldiring | Yadro buni "pastki yarim" deb ataydi |
| Ishlovchi ichida qulf kutmang | Deadlock xavfi |
| Xotira ajratmang | Uzilish kontekstida xavfli |
Amaliy naqsh: ishlovchi faqat ma'lumotni navbatga qo'yadi, haqiqiy ishlov esa keyinroq, oddiy kontekstda bajariladi.
Bu tarmoqlar darsligining 18-bo'limidagi "hodisa halqasini bloklamang" qoidasi bilan bir xil g'oya.
Qurilma bilan gaplashish usullari #
| Usul | Qanday ishlaydi |
|---|---|
| Portga akslantirilgan | Maxsus in/out komandalari (x86 da) |
| Xotiraga akslantirilgan | Qurilma registrlari xotira manzillari kabi |
Ikkinchisi bugun keng tarqalgan: 0xFE000000 manzilga
yozish - bu xotiraga emas, videokartaga yozish degani.
Bu yondashuv qulay: alohida komandalar kerak emas, oddiy
mov yetarli.
Kompilyator odatda "bu o'zgaruvchini ikki marta o'qish shart emas" deb o'ylaydi va ikkinchi o'qishni olib tashlaydi.
Oddiy xotira uchun bu to'g'ri. Qurilma registri uchun esa halokatli: uning qiymati tashqi sabab bilan o'zgaradi.
Shuning uchun bunday o'zgaruvchilar maxsus belgilanadi:
| Til | Belgi |
|---|---|
| C va C++ | volatile |
| Rust | read_volatile / write_volatile |
| Java | volatile (boshqa ma'noda - oqimlar uchun) |
Yana bir muammo - tartib. Protsessor yozishlarni qayta tartiblashi mumkin, qurilma esa aniq ketma-ketlikni kutadi. Buning uchun xotira to'sig'i (memory barrier) komandalari ishlatiladi.
Drayver yozish shuning uchun ham qiyin: oddiy kodda ko'rinmaydigan qoidalar bu yerda hal qiluvchi bo'lib qoladi.
- So'rab turish va uzilish farqini uch qatorda yozing.
- Uzilishda jami takt ko'proq - nima uchun u baribir yaxshiroq?
- Qurilma kechikishi 10 takt bo'lsa, qaysi usul yutardi?
- Uzilish narxi 500 takt bo'lsa, hisob qanday o'zgarardi?
- Uzilish kelganda bajariladigan uch qadamni yozing.
- Uzilishlar jadvalidagi raqam nima uchun kerak?
- Sakkiz taktda taymer necha marta urganini sanang.
- Nima uchun taymer uzilishi ko'p vazifalilik uchun zarurligini yozing.
- DMA ning uch afzalligini sanang.
- Uzilishlarni vaqtincha o'chirish qachon kerak bo'lishini o'ylang.
Xulosa #
- Tashqi qurilmalar protsessordan millionlab barobar sekin.
- So'rab turish: protsessor doimo so'raydi - sodda, lekin isrofgar.
- Uzilish: qurilma tayyor bo'lganda o'zi xabar beradi.
- Uzilishda taktlar ko'proq bo'lishi mumkin, lekin ular bekor ketmaydi.
- Juda tez qurilmalar uchun so'rab turish afzalroq bo'lishi mumkin.
- Uzilish raqami jadvaldan ishlovchi manzilini topadi.
- Protsessor holatni saqlaydi, ishlovchini chaqiradi, holatni tiklaydi.
- Taymer uzilishi majburiy ko'p vazifalilikning asosi.
- DMA ma'lumotni protsessorsiz ko'chiradi.
- Qurilma registrlari bilan ishlaganda
volatileva xotira to'siqlari zarur.
Keyingi bo'limda manba kodidan mashina kodigacha bo'lgan butun yo'lni ko'rib chiqamiz.
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.