Internet Windows Android
Kengaytirish

Shartlar: Ma'lumotlarni kiritish-chiqarish sinxron va asinxron. Sinxron va asinxron kiritish-chiqarish Asinxron kiritish-chiqarish

Bir nechta iplardan foydalangan holda asinxron kiritish-chiqarish

Bir-biriga o'xshash va kengaytirilgan kiritish-chiqarish bitta oqim ichida asinxron kiritish-chiqarish imkonini beradi, garchi OS bu funksiyani qo'llab-quvvatlash uchun o'z ish zarralarini yaratadi. U yoki bu turdagi usullar ko'pincha ko'plab dastlabki operatsion tizimlarda bitta oqimli tizimlarda asinxron operatsiyalarni bajarishning cheklangan shakllarini qo'llab-quvvatlash uchun ishlatiladi.

Biroq, Windows ko'p ish zarralarini qo'llab-quvvatlaydi, shuning uchun bir nechta mustaqil bajariladigan iplarda sinxron kiritish-chiqarish operatsiyalarini bajarish orqali bir xil effektga erishish mumkin. Bu imkoniyatlar allaqachon ko'p tarmoqli serverlar va grepMT dasturi bilan namoyish etilgan (7-bob). Bundan tashqari, iplar asinxron kiritish-chiqarishni amalga oshirishning kontseptual ketma-ketligi va go'yoki ancha sodda usulini ta'minlaydi. 14.1 va 14.2 dasturlarida qo'llaniladigan usullarga muqobil ravishda har bir ipga o'z fayl identifikatorini berish mumkin, keyin esa har bir oqim har to'rtinchi yozuvni sinxron tarzda qayta ishlash mumkin.

Oqimlardan foydalanishning bunday usuli kitobga kiritilmagan, lekin veb-saytda joylashtirilgan materialga kiritilgan atouMT dasturida ko'rsatilgan. atouMT nafaqat Windows-ning istalgan versiyasida ishlay oladi, balki u ikkita asinxron kiritish-chiqarish dasturidan ham soddaroq, chunki resurslardan foydalanishni hisobga olish unchalik murakkab emas. Har bir ip oddiygina o'z buferlarini o'z stekida saqlaydi va sinxron o'qish, o'zgartirish va yozish ketma-ketligi orqali aylanadi. Shu bilan birga, dasturning ishlashi ancha yuqori darajada qolmoqda.

Eslatma

Veb-saytdagi atouMT.c dasturi bir vaqtning o'zida bir nechta mavzularga bir faylga kirishga ruxsat berganingizda duch kelishi mumkin bo'lgan bir nechta mumkin bo'lgan "tuzoqlar" haqida izoh beradi. Xususan, barcha individual fayl tutqichlari DuplicateHandle funksiyasidan emas, balki CreateHandle funksiyasidan foydalanib yaratilishi kerak.

Shaxsan men asinxron kiritish-chiqarish o'rniga ko'p oqimli fayllarni qayta ishlashdan foydalanishni afzal ko'raman. Oqimlarni dasturlash osonroq va aksariyat hollarda yaxshiroq ishlashni ta'minlaydi.

Ushbu umumiy qoidadan ikkita istisno mavjud. Ulardan birinchisi, ushbu bobda avval ko'rsatilgandek, faqat bitta ajoyib operatsiya bo'lishi mumkin bo'lgan holatlar bilan bog'liq va sinxronizatsiya maqsadlarida fayl identifikatoridan foydalanish mumkin. Ikkinchi, muhimroq istisno, ushbu bobning oxirida muhokama qilinadigan asinxron kiritish-chiqarish portlari holatida sodir bo'ladi.

“Keling, kompilyator yarataylik” kitobidan. Crenshaw Jek tomonidan

Prolog dasturlash kitobidan Muallif: Kloxin W.

C# 2005 dasturlash tili va .NET 2.0 platformasi kitobidan. muallif Troelsen Endryu

Informix ma'lumotlar bazasi ma'murlari uchun qo'llanmadan. muallif Kustov Viktor

Microsoft Visual C++ va MFC kitobidan. Windows 95 va Windows NT uchun dasturlash muallif Frolov Aleksandr Vyacheslavovich

2.2.3.2 Asinxron kiritish-chiqarish Kirish/chiqarish operatsiyalarini tezlashtirish uchun server o'zining asinxron kiritish/chiqarish (AIO) paketidan yoki mavjud bo'lsa, yadro asinxron kiritish/chiqarish (KAIO) paketidan foydalanadi. Foydalanuvchi kiritish-chiqarish so'rovlari asinxron tarzda qayta ishlanadi,

Ob'ektga yo'naltirilgan dasturlash asoslari kitobidan Meyer Bertrand tomonidan

I/O Ma'lumki, operatorlar<< и >> raqamli qiymatni belgilangan bitlar soniga chapga va o'ngga siljitish. Ushbu kitobdagi dasturlar klaviaturadan kiritish va ekran chiqarish uchun ham ushbu operatorlardan foydalanadi.Agar chap tomonda bo'lsa

Windows muhitida tizim dasturlash kitobidan muallif Xart Jonson M

Kirish va chiqish KERNEL kutubxonasidagi ikkita klass kirish va chiqarishning asosiy vositalarini ta'minlaydi: FILE va STD_FILES.FILE f ob'ektida aniqlangan amallar qatoriga quyidagilar kiradi: f.make ("nom") yaratish -- f ni nomli fayl bilan bog'laydi. f.open_write -- yozish uchun f-ni oching f.open_read -- f uchun ochish

Ruby tilida dasturlash kitobidan [Til mafkurasi, nazariyasi va qo'llash amaliyoti] muallif Fulton Hal

14-BOB Asinxron kiritish-chiqarish va tugatish portlari kiritish-chiqarish operatsiyalari boshqa ishlov berish turlariga qaraganda sekinroq. Ushbu sekinlashuvga quyidagi omillar sabab bo'ladi: qidiruvga sarflangan vaqt tufayli kechikishlar

Sun'iy intellekt uchun Prologda dasturlash kitobidan muallif Bratko Ivan

10.1.7. Oddiy kiritish-chiqarish Yadro modulidagi kiritish-chiqarish usullarining ayrimlari bilan allaqachon tanishsiz; biz qo'ng'iroq qiluvchini ko'rsatmasdan ularni chaqirdik. Bularga get va puts funksiyalari, shuningdek print, printf va p kiradi (ikkinchisi ob'ektni biz tushunadigan tarzda chop etish uchun tekshirish usulini chaqiradi).

Shaxsiy kompyuter uchun C dasturlash tili kitobidan muallif Bochkov S. O.

Misol bo'yicha Linux dasturlash kitobidan muallif Robbins Arnold

6-bob Kirish va chiqish Ushbu bobda biz faylga ma'lumotlarni yozish va undan ma'lumotlarni o'qish uchun o'rnatilgan ba'zi qurilmalarni ko'rib chiqamiz. Bunday vositalardan dastur ma'lumotlari ob'ektlarini tashqi tasvirlashning kerakli shaklini olish uchun formatlash uchun ham foydalanish mumkin.

Java dasturlash asoslari kitobidan muallif Suxov S.A.

Kirish va chiqish C standart kutubxonasidagi kiritish va chiqarish funksiyalari fayllardan maʼlumotlarni oʻqish yoki kiritish qurilmalaridan (masalan, klaviatura) maʼlumotlarni qabul qilish va maʼlumotlarni fayllarga yozish yoki ularni turli qurilmalarga (masalan, printer) chiqarish imkonini beradi. chiqish

QT 4 kitobidan: C++ da GUI dasturlash Blanchette Jasmine tomonidan

4.4. I/U Linuxning barcha kiritish-chiqarish operatsiyalari fayl deskriptorlari orqali amalga oshiriladi. Ushbu bo'lim fayl deskriptorlari bilan tanishadi, ularni qanday olish va chiqarishni tavsiflaydi va qanday bajarilishini tushuntiradi

Ideal dasturchi kitobidan. Qanday qilib dasturiy ta'minotni ishlab chiqish bo'yicha mutaxassis bo'lish mumkin muallif Martin Robert S.

Muallifning kitobidan

12-bob I/U Deyarli har bir ilova fayllarni o'qishi yoki yozishi yoki boshqa kiritish/chiqarish operatsiyalarini bajarishi kerak. Qt, o'qish va yozish qobiliyatiga ega "qurilmalar" ning kuchli abstraktsiyasi bo'lgan QIODevice bilan mukammal kiritish/chiqarish qo'llab-quvvatlaydi.

Muallifning kitobidan

Kirish va chiqish Mening natijalarim tegishli "kirish" bilan oziqlanishi ham menga juda muhim tuyuladi. Kod yozish ijodiy ishdir. Odatda ijodkorlikka duch kelganimda ijodim eng yuqori cho‘qqiga chiqadi

Kirish va chiqarish operatsiyalari boshqa ishlov berish turlariga qaraganda sekinroq. Ushbu sekinlashuv quyidagi omillarga bog'liq:

Tasodifiy kirish qurilmalarida (disklar, kompakt disklar) kerakli treklar va sektorlarni qidirishga sarflangan vaqt tufayli kechikishlar.

Jismoniy qurilmalar va tizim xotirasi o'rtasida nisbatan sekin ma'lumotlarni uzatish tezligi tufayli kechikish.

Fayl, serverlar, ma'lumotlar omborlari va boshqalardan foydalangan holda tarmoq orqali ma'lumotlarni uzatishda kechikishlar.

Oldingi barcha misollarda kiritish-chiqarish operatsiyalari bajariladi oqim bilan hamohang shuning uchun butun ip tugamaguncha bo'sh turishga majbur bo'ladi.

Ushbu bobda kiritish-chiqarish tugashini kutmasdan, ish zarrachalarining bajarilishini davom ettirishni qanday tashkil qilish mumkinligi ko'rsatilgan, bu ip bilan bir xil bo'ladi. asinxron kirish/chiqish. Windows-da mavjud bo'lgan turli xil texnikalar misollar bilan tasvirlangan.

Ushbu usullarning ba'zilari kutish taymerlarida qo'llaniladi, ular ham ushbu bobda tasvirlangan.

Nihoyat, va eng muhimi, standart asinxron kiritish-chiqarish haqida bilib, biz foydalanishimiz mumkin I/U tugatish portlari, Ular har biri uchun alohida tarmoq yaratmasdan ko'p sonli mijozlarni qo'llab-quvvatlaydigan kengaytiriladigan serverlarni yaratishda juda foydali. Dastur 14.4 - ilgari ishlab chiqilgan serverning o'zgartirilgan versiyasi bo'lib, u kiritish-chiqarishni yakunlash portlaridan foydalanishga imkon beradi.

Windowsning asinxron kiritish-chiqarish usullariga umumiy nuqtai

Windows tizimida asinxron kiritish-chiqarish uchta usulda amalga oshiriladi.

Ko'p oqimli kirish/chiqish (Ko'p o'qli kiritish/chiqarish). Jarayon yoki jarayonlar to'plamidagi iplarning har biri odatdagi sinxron kiritish-chiqarishni amalga oshiradi, boshqa oqimlar esa ishlashda davom etishi mumkin.

Bir-biriga yopishgan kiritish-chiqarish. O'qish, yozish yoki boshqa kiritish-chiqarish operatsiyalarini boshlagandan so'ng, ip o'z bajarilishini davom ettiradi. Agar ip bajarishni davom ettirish uchun kiritish-chiqarish natijalari kerak bo'lsa, u tegishli tutqich mavjud bo'lguncha yoki belgilangan hodisa ro'y berguncha kutadi. Windows 9x da bir-birining ustiga chiqqan kiritish-chiqarish faqat nomli quvurlar kabi ketma-ket qurilmalar uchun qo'llab-quvvatlanadi.

Tugatish tartiblari (kengaytirilgan I/U) I/U operatsiyalari tugagach, tizim maxsus chaqiradi tugatish tartibi, ip ichida yugurish. Disk fayllari uchun kengaytirilgan kiritish-chiqarish Windows 9x da qo'llab-quvvatlanmaydi.

Nomlangan quvurlar yordamida ko'p tarmoqli kiritish-chiqarish 11-bobda muhokama qilingan ko'p tarmoqli serverda amalga oshiriladi. grepMT dasturi (Dastur 7.1) bir nechta fayllarni o'z ichiga olgan parallel kiritish-chiqarish operatsiyalarini boshqaradi. Shunday qilib, bizda allaqachon ko'p oqimli kiritish-chiqarishni amalga oshiradigan va asinxron kiritish-chiqarish shaklini ta'minlaydigan bir qator dasturlar mavjud.

Bir-biriga yopishgan kiritish-chiqarish keyingi bo'limning mavzusi bo'lib, ushbu bo'limdagi fayllarni aylantirish misollari (ASCII dan UNICODE ga) ketma-ket fayllarni qayta ishlash imkoniyatlarini tasvirlash uchun ushbu texnikadan foydalanadi. Buning uchun 2.4 dasturining o'zgartirilgan versiyasidan foydalaniladi. Bir-biriga o'xshash kiritish-chiqarishdan so'ng, tugatish tartib-qoidalari yordamida kengaytirilgan kiritish-chiqarish ko'rib chiqiladi.

Eslatma

Bir-biriga o'xshash va kengaytirilgan kiritish-chiqarish usullarini amalga oshirish ko'pincha qiyin bo'ladi, kamdan-kam hollarda unumdorlikni ta'minlaydi, ba'zan hatto ishlashning pasayishiga olib keladi va fayl kiritish/chiqarish holatida faqat Windows NT ostida ishlashi mumkin. Ushbu muammolar iplar yordamida hal qilinadi, shuning uchun ko'p o'quvchilar kutish taymerlari va kiritish-chiqarish portlari bo'limlariga o'tishni xohlashadi, kerak bo'lganda ushbu bo'limga qaytish. Boshqa tomondan, asinxron kiritish-chiqarish elementlari ham eski, ham yangi texnologiyalarda mavjud va shuning uchun bu usullar hali ham o'rganishga arziydi.

Masalan, NT5 platformasidagi MAQOMOTI texnologiyasi asinxron usulni chaqirishni qo'llab-quvvatlaydi, shuning uchun bu usul COM texnologiyasidan foydalanadigan yoki foydalanmoqchi bo'lgan ko'plab o'quvchilar uchun foydali bo'lishi mumkin. Bundan tashqari, asinxron protsedura chaqiruv operatsiyalari (10-bob) kengaytirilgan kiritish-chiqarish bilan juda ko'p umumiy xususiyatlarga ega va men shaxsan iplardan foydalanishni afzal ko'rsam ham, boshqalar bu mexanizmni afzal ko'rishlari mumkin.

Bir-biriga yopishgan kiritish-chiqarish

Asinxron kiritish-chiqarishni tashkil qilish uchun birinchi narsa, bir-birining ustiga chiqqan yoki kengaytirilgan bo'lsin, fayl yoki boshqa identifikatorda bir-biriga yopishgan atributni o'rnatishdir. Buning uchun CreateFile yoki fayl, nomli quvur yoki boshqa tutqich yaratilishiga olib keladigan boshqa funksiyani chaqirganda FILE_FLAG_OVERLAPPED bayrog'i ko'rsatilishi kerak.

Soketlar holatida (12-bob), rozetka yordamida yaratilganmi yoki qabul qilinganmi, bekor qilish atributi Winsock 1.1 da sukut bo'yicha o'rnatiladi, lekin Winsock 2.0 da aniq o'rnatilishi kerak. Bir-birining ustiga o'rnatilgan rozetkalardan Windowsning barcha versiyalarida asinxron foydalanish mumkin.

Shu paytgacha OVERLAPPED tuzilmalari LockFileEx funksiyasi bilan birgalikda va SetFilePointer funksiyasidan foydalanishga muqobil sifatida foydalanilgan (3-bob), lekin ular bir-birining ustiga chiqqan kiritish-chiqarishning muhim elementi hamdir. Ushbu tuzilmalar quyidagi to'rtta funktsiyani chaqirganda ixtiyoriy parametr sifatida ishlaydi, ular operatsiyalar tugagach bloklanishi mumkin.

Eslatib o'tamiz, FILE_FLAG_OVERLAPPED bayrog'ini dwAttrsAndFlags parametrining (CreateFile funktsiyasida) yoki dwOpen-Mode parametrining (CreateNamedPipe funktsiyasida) bir qismi sifatida belgilaganingizda, mos keladigan fayl yoki quvur faqat bir-birining ustiga qo'yilgan holda ishlatilishi mumkin. rejimi. Anonim quvurlar bilan bir-biriga yopishgan kiritish-chiqarish ishlamaydi.

Eslatma

CreateFile funksiyasi hujjatlari FILE_FLAG_NO_BUFFERING bayrog'idan foydalanish bir-biriga yopishgan kiritish-chiqarish ishini yaxshilashini ta'kidlaydi. Tajribalar unumdorlikning faqat chegaraviy yaxshilanishini ko'rsatadi (taxminan 15%, buni 14.1-dastur bilan tajriba orqali tekshirish mumkin), lekin ReadFile yoki WriteFile operatsiyasi davomida o'qiladigan ma'lumotlarning umumiy hajmi disk sektorining ko'pligiga ishonch hosil qilishingiz kerak. hajmi.

Bir-birining ustiga chiqadigan rozetkalar

Windows Sockets 2.0 dagi eng muhim yangiliklardan biri (12-bob) bir-birining ustiga chiqqan kiritish-chiqarishni standartlashtirishdir. Xususan, rozetkalar endi avtomatik ravishda bir-birining ustiga chiqadigan fayl deskriptorlari sifatida yaratilmaydi. Soket funktsiyasi bir-birining ustiga chiqmaydigan tutqichni yaratadi. Bir-biriga yopishgan rozetkani yaratish uchun siz WSASocket funksiyasining dwFlags parametri uchun WSA_FLAG_OVERLAPPED qiymatini belgilash orqali bir-birining ustiga tushgan rozetkani yaratishni aniq so'rab, WSASocket funksiyasini chaqirishingiz kerak.

SOCKET WSAAPI WSASocket(int iAddressFamily, int iSocketType, int iProtocol, LPWSAPROTOCOL_INFO lpProtocolInfo, GROUP g, DWORD dwFlags);

Soket yaratish uchun rozetka funktsiyasi o'rniga WSASocket funksiyasidan foydalaning. Qabul qilish funktsiyasi tomonidan qaytarilgan har qanday rozetka argument bilan bir xil xususiyatlarga ega bo'ladi.

Bir-biriga o'xshash kiritish-chiqarishdan foydalanish oqibatlari

Bir-biriga yopishgan kiritish-chiqarish asinxron tarzda amalga oshiriladi. Bu bir nechta ta'sirga ega.

Bir-biriga yopishgan kiritish/chiqarish operatsiyalari bloklanmaydi. ReadFile, WriteFile, TransactNamedPipe va ConnectNamedPipe funksiyalari kiritish/chiqarish jarayoni tugashini kutmasdan qaytadi.

Funktsiyaning qaytish qiymatidan uning bajarilishining muvaffaqiyati yoki muvaffaqiyatsizligi mezoni sifatida foydalanish mumkin emas, chunki kiritish-chiqarish operatsiyasi bu nuqtada hali tugashga ulgurmagan. Amalga oshirilayotgan kiritish-chiqarish holatini ko'rsatish boshqa mexanizmdan foydalanishni talab qiladi.

O'tkazilgan baytlar soni uchun qaytarilgan qiymat ham unchalik foydali emas, chunki ma'lumotlarni uzatish to'liq tugallanmagan bo'lishi mumkin. Bunday ma'lumotlarni olish uchun Windows boshqa mexanizmni taqdim etishi kerak.

Dastur bir xil fayl deskriptoridan foydalanib o'qish yoki yozishga qayta-qayta urinishi mumkin. Shuning uchun bunday identifikatorga mos keladigan fayl ko'rsatkichi ham ahamiyatsiz bo'lib chiqadi. Shuning uchun, har bir o'qish yoki yozish operatsiyasi uchun faylda pozitsiyani ta'minlash uchun qo'shimcha usul taqdim etilishi kerak. Nomlangan quvurlar bo'lsa, ma'lumotlarni qayta ishlashning o'ziga xos ketma-ketligi tufayli bu muammo emas.

Dastur kiritish/chiqarish tugallanishini kutish (sinxronlash) imkoniyatiga ega bo'lishi kerak. Agar bir xil tutqich bilan bog'langan bir nechta kutilayotgan kiritish-chiqarish operatsiyalari mavjud bo'lsa, dastur qaysi operatsiyalar allaqachon bajarilganligini aniqlay olishi kerak. Kirish-chiqarish operatsiyalari ular bajara boshlagan tartibda bajarilishi shart emas.

Yuqorida sanab o'tilgan so'nggi ikkita qiyinchilikni bartaraf etish uchun OVERLAPPED tuzilmalari qo'llaniladi.

QADAMLANGAN tuzilmalar

OVERLAPPED strukturasidan foydalanib (masalan, ReadFile funksiyasining lpOverlapped parametri bilan ko'rsatilgan) siz quyidagi ma'lumotlarni belgilashingiz mumkin:

3-bobda muhokama qilinganidek, o'qish yoki yozish jarayoni boshlanishi kerak bo'lgan fayldagi joy (64 bit).

Tegishli operatsiya tugagandan so'ng signal beriladigan hodisa (qo'lda tozalanadi).

Quyida OVERLAPPED strukturasining ta'rifi keltirilgan.

Ofset va OffsetHigh maydonlaridan fayl o‘rnini (ko‘rsatkichni) belgilash uchun foydalanish kerak, garchi ko‘rsatkichning yuqori qismi (OffsetHigh) ko‘p hollarda 0 ga teng.Tizimdan foydalanish uchun ajratilgan Ichki va InternalHigh maydonlari bo‘lmasligi kerak. ishlatilgan.

hEvent parametri hodisaning dastagi (CreateEvent funksiyasi bilan yaratilgan). Bu hodisa nomli yoki nomsiz bo'lishi mumkin, lekin u kerak Agar bir-biriga yopishgan kiritish-chiqarish uchun foydalanilsa, majburiy qo'lda qayta o'rnatilishi mumkin (8-bobga qarang); buning sabablari qisqa vaqt ichida tushuntiriladi. Kirish-chiqarish operatsiyasi tugagach, hodisa signalli holatga o'tadi.

Boshqa mumkin bo'lgan holatda, hEvent tutqichi NULL; bu holda dastur fayl identifikatoriga signal berilishini kutishi mumkin, u sinxronizatsiya ob'ekti sifatida ham harakat qilishi mumkin (quyidagi ogohlantirishlarga qarang). Tizim fayl deskriptorining signal holatidan amallarning bajarilishini kuzatish uchun foydalanadi, agar hEvent deskriptori NULL bo'lsa, ya'ni fayl deskriptori bu holda sinxronizatsiya ob'ekti bo'lsa.

Eslatma

Qulaylik uchun ReadFile, WriteFile va shunga o'xshash funksiyalarni chaqirishda ko'rsatilgan tutqichlarga nisbatan qo'llaniladigan "fayl tutqichi" atamasi bizda hatto nomli quvur yoki qurilma tutqichlari haqida gap ketganda ham qo'llaniladi. fayl.

I/U funksiyasi chaqiruvi amalga oshirilganda, bu hodisa tizim tomonidan darhol o'chiriladi (signalsiz holatga o'rnatiladi). Kirish/chiqarish operatsiyasi tugagach, hodisa signalli holatga o'rnatiladi va u boshqa kiritish/chiqarish operatsiyasi tomonidan foydalanilgunga qadar u erda qoladi. Agar bir nechta oqim signal berilishini kutayotgan bo'lsa, hodisani qo'lda tiklash mumkin bo'lishi kerak (garchi bizning misollarimizda faqat bitta ip ishlatilgan bo'lsa ham) va ular operatsiya tugashini kutishlari shart emas.

Agar fayl identifikatori sinxron bo'lsa ham (ya'ni FILE_FLAG_OVERLAPPED bayrog'isiz yaratilgan), OVERLAPPED strukturasi fayl o'rnini belgilash uchun SetFilePointer funktsiyasiga muqobil bo'lib xizmat qilishi mumkin. Bunday holda, qo'ng'iroqdan ReadFile-ga yoki boshqa qo'ng'iroqdan qaytish kiritish-chiqarish operatsiyasi tugamaguncha sodir bo'lmaydi. Biz bu xususiyatdan 3-bobda allaqachon foydalanganmiz. Shuni ham yodda tutingki, kutilayotgan kiritish-chiqarish operatsiyalari fayl identifikatori va mos keladigan OVERLAPPED tuzilmasi kombinatsiyasi orqali noyob tarzda aniqlanadi.

Quyida e'tiborga olinishi kerak bo'lgan ba'zi ogohlantirishlar keltirilgan.

OVERLAPPED tuzilmasi bilan bog‘liq bo‘lgan kiritish-chiqarish jarayoni hali tugallanmagan bo‘lsa, uni qayta ishlatishdan saqlaning.

Xuddi shunday, OVERLAPPED tuzilmasida ko'rsatilgan hodisani qayta ishlatishdan saqlaning.

Agar bir xil oʻxshash tutqichga murojaat qiluvchi bir nechta kutilayotgan soʻrovlar boʻlsa, sinxronizatsiya uchun fayl tutqichlari oʻrniga voqea tutqichlaridan foydalaning.

Agar OVERLAPPED strukturasi yoki hodisa blok ichida avtomatik o'zgaruvchi sifatida ishlayotgan bo'lsa, blok I/U operatsiyasi bilan sinxronlanmaguncha chiqolmasligiga ishonch hosil qiling. Bundan tashqari, resurslarning oqishi oldini olish uchun blokdan chiqishdan oldin tutqichni yopish uchun ehtiyot bo'lish kerak.

Bir-biriga o'xshash kirish/chiqish holatlari

ReadFile va WriteFile funktsiyalari, shuningdek, yuqorida ko'rsatilgan ikkita quvur funksiyalari bir-biriga mos keladigan kiritish-chiqarish operatsiyalarini bajarish uchun foydalanilganda darhol qaytadi. Ko'pgina hollarda, kiritish/chiqarish operatsiyasi shu nuqtaga qadar tugamaydi va o'qish/yozishning qaytish qiymati FALSE bo'ladi. GetLastError funksiyasi bu holatda ERROR_IO_PENDINGni qaytaradi.

Sinxronlash ob'ekti (hodisa yoki ehtimol fayl identifikatori) operatsiya tugaganligi to'g'risida signal berishini kutgandan so'ng, qancha bayt o'tkazilganligini aniqlashingiz kerak. Bu GetOverlappedResult funksiyasining asosiy maqsadi.

BOOL GetOverlappedResult(HANDLE hFile, LPOVERLAPPED lpOverlapped, LPWORD lpcbTransfer, BOOL bWait)

Muayyan kiritish-chiqarish operatsiyasining ko'rsatkichi tutqich va OVERLAPPED strukturasining kombinatsiyasi bilan ta'minlanadi. bWait parametr qiymati TRUE GetOverlappedResult funksiyasi operatsiya tugaguncha kutishi kerakligini bildiradi; aks holda, funktsiyadan qaytish darhol bo'lishi kerak. Har qanday holatda ham, bu funksiya operatsiya muvaffaqiyatli yakunlangandan keyingina TRUE qiymatini qaytaradi. Agar GetOverlappedResult funksiyasining qaytish qiymati FALSE bo'lsa, GetLastError funksiyasi ERROR_IO_INCOMPLETE ni qaytaradi, bu esa ushbu funktsiyani kiritish/chiqarishni yakunlash uchun so'rovga chaqirish imkonini beradi.

O'tkazilgan baytlar soni *lpcbTransfer o'zgaruvchisida saqlanadi. OVERLAPPED strukturasi bir-birining ustiga chiqqan kiritish-chiqarish operatsiyasida foydalanilgan paytdan boshlab har doim o'zgarishsiz qolishiga ishonch hosil qiling.

Bir-biriga yopishgan kiritish/chiqarish operatsiyalarini bekor qilish

Mantiqiy funksiya CancelIO ko'rsatilgan tutqich bilan bog'liq kutilayotgan bir-biriga yopishgan kiritish/chiqarish operatsiyalarini bajarilishini bekor qilish imkonini beradi (bu funksiya faqat bitta parametrga ega). Ushbu tutqich yordamida chaqiruvchi ip tomonidan boshlangan barcha operatsiyalar bekor qilinadi. Boshqa oqimlar tomonidan boshlangan operatsiyalar ushbu funktsiya chaqiruviga ta'sir qilmaydi. Bekor qilingan operatsiyalar ERROR OPERATION BORTED xatosi bilan tugaydi.

Misol: Sinxronizatsiya obyekti sifatida fayl deskriptoridan foydalanish

Bir-biriga o'xshash kiritish-chiqarish juda qulay va faqat bitta kutilayotgan operatsiya bo'lishi mumkin bo'lgan hollarda amalga oshirish oson. Keyin, sinxronizatsiya qilish uchun dastur hodisa emas, balki fayl identifikatoridan foydalanishi mumkin.

Quyidagi kod parchasi dastur faylning bir qismini o'qish uchun o'qish operatsiyasini qanday boshlashi, boshqa ishlov berish uchun uning bajarilishini davom ettirishi va keyin fayl identifikatorining signal berishini kutayotgan holatni kiritishi mumkinligini ko'rsatadi.

OVERLAPPED ov = ( 0, 0, 0, 0, NULL /* Voqealar ishlatilmaydi. */ );
hF = Fayl yaratish(…, FILE_FLAG_OVERLAPPED, …);
ReadFile(hF, Bufer, sizeof(Bufer), &nRead, &ov);
/* Boshqa ishlov berish. nRead shart emas.*/
/* O'qish jarayoni tugashini kuting. */
WaitForSingleObject(hF, INFINITE);
GetOverlappedResult(hF, &ov, &nRead, FALSE);

Misol: Bir-biriga yopishgan kiritish-chiqarish va bir nechta buferlash yordamida fayllarni konvertatsiya qilish

Dastur 2.4 (atou) faylni ketma-ket qayta ishlash orqali ASCII faylni UNICODE ga aylantirdi va 5-bobda faylni xaritalash yordamida bir xil ketma-ket ishlov berish qanday amalga oshirilishi ko'rsatilgan. Dastur 14.1 (atouOV) bir xil muammoni bir-biriga yopishgan kiritish-chiqarish va qattiq o'lchamdagi yozuvlarni saqlaydigan bir nechta buferlar yordamida hal qiladi.

14.1-rasmda to'rtta qattiq o'lchamli buferlar bilan dasturning tashkil etilishi ko'rsatilgan. Dastur shunday amalga oshiriladiki, buferlar sonini preprotsessorning ramziy konstantasi yordamida aniqlash mumkin, ammo keyingi muhokamada biz to'rtta bufer borligini taxmin qilamiz.

Birinchidan, dastur hodisalar va fayllardagi pozitsiyalarni belgilaydigan OVERLAPPED tuzilmalarining barcha elementlarini ishga tushiradi. Har bir kirish va chiqish buferi uchun alohida OVERLAPPED strukturasi mavjud. Shundan so'ng, kirish buferlarining har biri uchun bir-birining ustiga chiqqan o'qish operatsiyasi boshlanadi. Keyinchalik, WaitForMultipleObjects funksiyasidan foydalanib, dastur o'qish yoki yozish tugallanganligini ko'rsatadigan bitta hodisani kutadi. O'qish operatsiyasi tugagach, kirish buferi ko'chiriladi va tegishli chiqish buferiga aylantiriladi, shundan so'ng yozish jarayoni boshlanadi. Yozish tugagach, keyingi o'qish operatsiyasi boshlanadi. E'tibor bering, kirish va chiqish buferlari bilan bog'liq hodisalar WaitForMultipleObjects funksiyasini chaqirishda argument sifatida foydalaniladigan bitta massivga joylashtirilgan.

Guruch. 14.1. Asinxron faylni yangilash modeli


Dastur 14.1. atouOV: bir-biriga yopishgan kiritish-chiqarish yordamida faylni konvertatsiya qilish
Bir-biriga yopishgan kiritish-chiqarish yordamida faylni ASCII-dan Unicode-ga aylantirish. Dastur faqat Windows NT da ishlaydi. */

#define MAX_OVRLP 4 /* Bir-biriga yopishgan kiritish/chiqarishlar soni.*/
#define REC_SIZE 0x8000 /* 32 KB: Qabul qilinadigan ishlash uchun minimal rekord hajmi. */

/* Quyida aniqlangan oʻzgaruvchan massivlarning har bir elementi */
/* va tuzilmalar bitta kutilayotgan operatsiyaga mos keladi */
/* bir-biriga yopishgan kiritish/chiqarish. */
DWORD nin, nout, ic, i;
OVERLAPPED OverLapIn, OverLapOut;
/* Qattiq, ikki oʻlchovli massivdan foydalanish kerak */
/* WaitForMultipleObjects funktsiyasi tomonidan belgilanadi. */
/* Birinchi indeksning 0 qiymati o'qishga, 1 qiymati esa yozishga mos keladi. */
/* Quyida belgilangan ikkita bufer massivning har birida birinchi indeks */
/* kiritish-chiqarish operatsiyalarini raqamlang. */
LARGE_INTEGER CurPosIn, CurPosOut, FileSize;
/* Qayta ishlangan, hisoblangan yozuvlarning umumiy soni */
/* kirish fayl hajmiga asoslanadi. Oxirgi yozuv */
/* to'liq bo'lmasligi mumkin. */
uchun (ic = 0; ic< MAX_OVRLP; ic++) {
/* Har bir OVERLAPPED tuzilmasi uchun o‘qish va yozish hodisalarini yarating.*/
hEvents = OverLapIn.hEvent /* Voqea o'qing.*/
hEvents = OverLapOut.hEvent /* Hodisa yozish. */
= CreateEvent(NULL, TRUE, FALSE, NULL);
/* Har bir OVERLAPPED tuzilmasi uchun fayl pozitsiyalarini boshlash. */
/* OVERLAPPED strukturasida bir-biriga o'xshash o'qish operatsiyasini boshlang. */
agar (CurPosIn.QuadPart< FileSize.QuadPart) ReadFile(hInputFile, AsRec, REC_SIZE, &nin, &OverLapIn);
/* Barcha o'qish operatsiyalari bajariladi. Hodisa tugashini kuting va darhol uni qayta o'rnating. O'qish va yozish hodisalari bir-birining yonida joylashgan voqealar qatorida saqlanadi. */
iWaits=0; /* Hozirgacha bajarilgan kiritish-chiqarish operatsiyalari soni. */
esa (iWaits< 2 * nRecord) {
ic = WaitForMultipleObjects(2 * MAX_OVRLP, hEvents, FALSE, INFINITE) - WAIT_OBJECT_0;
iWaits++; /* Tugallangan kiritish-chiqarish operatsiyalari hisoblagichini oshirish. */
ResetEvent(hEvents);
/* Oʻqish tugallandi. */
GetOverlappedResult(hInputFile, &OverLapIn, &nin, FALSE);
uchun (i =0; i< REC_SIZE; i++) UnRec[i] = AsRec[i];
WriteFile(hOutputFile, UnRec, nin * 2, &nout, &OverLapOut);
/* Yuqorida boshlangan yozish jarayoni tugagandan so'ng boshlanadigan keyingi o'qishga tayyorlaning. */
OverLapIn.Offset = CurPosIn.LowPart;
OverLapIn.OffsetHigh = CurPosIn.HighPart;
) boshqa bo'lsa (ich< 2 * MAX_OVRLP) { /* Операция записи завершилась. */
/* O'qishni boshlang. */
ic -= MAX_OVRLP; /* Chiqish buferining indeksini o'rnating. */
agar (!GetOverlappedResult (hOutputFile, &OverLapOut, &nout, FALSE)) ReportError(_T("O'qishda xato."), 0, TRUE);
CurPosIn.LowPart = OverLapIn.Offset;
CurPosIn.HighPart = OverLapIn.OffsetHigh;
agar (CurPosIn.QuadPart< FileSize.QuadPart) {
/* Yangi o'qish operatsiyasini boshlang. */
ReadFile(hInputFile, AsRec, REC_SIZE, &nin, &OverLapIn);
/* Barcha hodisalarni yoping. */
uchun (ic = 0; ic< MAX_OVRLP; ic++) {

14.1 dasturi faqat Windows NT ostida ishlaydi. Windows 9x asinxron kiritish-chiqarish moslamalari diskdagi fayllardan foydalanishga ruxsat bermaydi. B ilovada atouOV dasturining nisbatan yomon ishlashi haqidagi natijalar va sharhlar keltirilgan. Tajribalar shuni ko'rsatdiki, maqbul ishlashga erishish uchun bufer hajmi kamida 32 KB bo'lishi kerak, ammo bu holda ham oddiy sinxron kiritish-chiqarish tezroq bo'ladi. Bundan tashqari, ushbu dasturning ishlashi SMP sharoitida ham yaxshilanmaydi, chunki faqat ikkita fayl qayta ishlanadigan ushbu misolda CPU muhim manba emas.

Tugatish protsedurasidan foydalangan holda kengaytirilgan kiritish-chiqarish

Sinxronizatsiya ob'ektlaridan foydalanishning boshqa mumkin bo'lgan yondashuvi ham mavjud. Tizim voqea yoki tutqichdan tugatish signalini kutish o'rniga, tizim kiritish-chiqarish operatsiyasi tugashi bilanoq foydalanuvchi tomonidan belgilangan tugatish tartibiga qo'ng'iroqni boshlashi mumkin. Tugatish protsedurasi keyin keyingi kiritish-chiqarish operatsiyasini boshlashi va tizim resurslaridan foydalanish uchun har qanday zarur hisobni amalga oshirishi mumkin. Bu bilvosita chaqirilgan (qayta qo'ng'iroq) tugatish protsedurasi 10-bobda qo'llanilgan asinxron protsedura chaqiruviga o'xshaydi va ogohlantirish kutish holatlaridan foydalanishni talab qiladi.

Dasturda tugatish tartibi qanday belgilanishi mumkin? ReadFile va WriteFile funksiyalarining parametrlari yoki ma'lumotlar tuzilmalari orasida tugatish protsedurasining manzilini saqlash uchun foydalaniladigan hech biri qolmagan. Biroq, "Ex" qo'shimchasi bilan belgilanadigan va tugatish protsedurasining manzilini o'tkazish uchun qo'shimcha parametrni o'z ichiga olgan kengaytirilgan kiritish-chiqarish funktsiyalari oilasi mavjud. O'qish va yozish funktsiyalari mos ravishda ReadFileEx va WriteFileEx. Bundan tashqari, quyidagi kutish funksiyalaridan biri talab qilinadi.

Kengaytirilgan kiritish-chiqarish ba'zan deb ataladi kirish/chiqish vazifasi(ogohlantiriladigan I/U). Murakkab xususiyatlardan qanday foydalanish quyidagi bo'limlarda tasvirlangan.

Eslatma

Windows 9x da kengaytirilgan kiritish-chiqarish disk fayllari va aloqa portlari bilan ishlay olmaydi. Shu bilan birga, Windows 9x ilg'or I/U nomli quvurlar, pochta qutilari, rozetkalar va ketma-ket qurilmalar bilan ishlashga qodir.

ReadFileEx, WriteFileEx funktsiyalari va tugatish protseduralari

Kengaytirilgan o'qish va yozish funksiyalari ochiq fayl, nomli quvur va pochta qutisi tutqichlari bilan birgalikda ishlatilishi mumkin, agar mos keladigan ob'ekt FILE_FLAG_OVERLAPPED bayroqchasi bilan ochilgan (yaratilgan) bo'lsa. E'tibor bering, bu bayroq tutqich atributini o'rnatadi va bir-birining ustiga chiqqan va kengaytirilgan kiritish-chiqarish har xil bo'lsa-da, bir xil bayroq asinxron kiritish-chiqarish tutqichlarining ikkala turiga ham tegishli.

Bir-biriga yopishgan rozetkalar (12-bob) Windowsning barcha versiyalarida ReadFileEx va WriteFileEx funksiyalari bilan ishlatilishi mumkin.

BOOL ReadFileEx(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPOVERLAPPED lpOverlapped, LPOVERLAPPED_COMPLETION_ROUTINE lpcr)
BOOL WriteFileEx(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPOVERLAPPED lpOverlapped, LPOVERLAPPED_COMPLETION_ROUTINE lpcr)

Siz ikkala funktsiya bilan allaqachon tanishsiz, faqat ularning har birida tugatish protsedurasining manzilini ko'rsatishga imkon beruvchi qo'shimcha parametr mavjud.

Funktsiyalarning har biri OVERLAPPED tuzilmasini ta'minlashi kerak, lekin bu strukturaning hEvent elementini ko'rsatishga hojat yo'q; tizim bunga e'tibor bermaydi. Biroq, bu element dastur 14.2 da ko'rsatilganidek, individual kiritish-chiqarish operatsiyalarini farqlash uchun foydalaniladigan tartib raqami kabi ma'lumotlarni uzatish uchun juda foydali.

ReadFile va WriteFile funksiyalari bilan solishtirsak, kengaytirilgan funksiyalar uzatilgan baytlar sonini saqlash uchun parametrlarni talab qilmasligini ko'rishingiz mumkin. Ushbu ma'lumot dasturga kiritilishi kerak bo'lgan tugatish funktsiyasiga uzatiladi.

Tugatish funksiyasi bayt soni, xato kodi va OVERLAPPED strukturasining manzili parametrlarini beradi. Ushbu parametrlarning oxirgisi talab qilinadi, shuning uchun tugatish protsedurasi eng muhim operatsiyalardan qaysi biri bajarilganligini aniqlashi mumkin. E'tibor bering, OVERLAPPED tuzilmalarini qayta ishlatish yoki yo'q qilish bo'yicha oldingi ogohlantirishlar, xuddi bir-birining ustiga chiqqan kiritish-chiqarish holatlarida bo'lgani kabi, bu erda ham amal qiladi.

WINAPI BO'LDI FileIOCompletionRutine(DWORD dwError, DWORD cbTransferred, LPOVERLAPPED lpo)

CreateThread funktsiyasida bo'lgani kabi, u ham ba'zi funktsiya nomi bilan ataladi, nomi FileIOCompletionRutine tugatish protsedurasining haqiqiy nomi emas, balki to'ldiruvchidir.

dwError parametri uchun qiymatlar 0 (muvaffaqiyat) va ERROR_HANDLE_EOF (fayldagi chegaradan tashqarida o'qishga harakat qilganda) bilan cheklangan. OVERLAPPED tuzilmasi ReadFileEx yoki WriteFileEx-ga tugallangan qo'ng'iroq tomonidan ishlatiladigan tuzilmadir.

Tugatish jarayoni tizim tomonidan chaqirilishidan oldin ikkita narsa sodir bo'lishi kerak:

1. I/U operatsiyasi tugallanishi kerak.

2. Qo'ng'iroq qiluvchi ip uyqu holatida bo'lishi kerak, bu tizimga navbatda turgan tugatish protsedurasini bajarishi kerakligi haqida xabar beradi.

Qanday qilib ip kutish holatiga o'tadi? U keyingi bo'limda tasvirlangan kuzatuv funksiyalaridan biriga aniq qo'ng'iroq qilishi kerak. Shunday qilib, ip tugatish protsedurasini muddatidan oldin bajarishga imkon bermaydigan sharoitlarni yaratadi. Ip faqat uyqu holatida bo'lishi mumkin, chunki u uyqu funksiyasiga chaqiriladi; bu funksiya qaytgandan so'ng, ip belgilangan holatdan chiqadi.

Agar ushbu shartlarning ikkalasi ham bajarilsa, kiritish-chiqarish operatsiyalarini bajarish natijasida navbatga qo'yilgan tugatish tartiblari bajariladi. Yakunlash tartiblari dastlabki kiritish/chiqarish funksiyasi chaqiruvini amalga oshirgan va boʻsh kutish holatida boʻlgan bir xil tarmoqda ishlaydi. Shuning uchun ip kutish holatiga faqat tugatish protseduralarini bajarish uchun xavfsiz sharoitlar mavjud bo'lganda kirishi kerak.

Kutish funksiyalari

Hammasi bo'lib beshta kutish funksiyasi mavjud, ammo quyida biz uchun bevosita qiziq bo'lgan faqat uchtasining prototiplari keltirilgan:

DWORD WaitForSingleObjectEx(HANDLE hObject, DWORD dwMilliseconds, BOOL bAlertable)
DWORD WaitForMultipleObjectsEx(DWORD cObjects, LPHANDLE lphObjects, BOOL fWaitAll, DWORD dwMilliseconds, BOOL bAlertable)
DWORD SleepEx(DWORD dwMilliseconds, BOOL baAlertable)

Har bir qo'riqchi funksiyasi bAlertable bayrog'iga ega bo'lib, asinxron kiritish-chiqarish holatida TRUE ga o'rnatilishi kerak. Yuqoridagi funksiyalar sizga tanish boʻlgan Kutish va Kutish funksiyalarining kengaytmalaridir.

Kutish oraliqlarining davomiyligi, odatdagidek, millisekundlarda ko'rsatilgan. Ushbu uchta funktsiyaning har biri zudlik bilan qaytadi har qanday quyidagi vaziyatlardan:

Tutqich(lar) signalli holatga o'tadi va shu bilan ikkita kutish funksiyasining standart talablarini qondiradi.

Vaqt tugaydi.

Tarmoqning navbatdagi barcha tugatish protseduralari bajarilishini to'xtatadi va bAlertable TRUE ga o'rnatiladi. Tegishli kiritish-chiqarish operatsiyasi tugagach, tugatish protsedurasi navbatga qo'yiladi (14.2-rasm).

ReadFileEx va WriteFileEx funksiyalarida hech qanday hodisa OVERLAPPED tuzilmalari bilan bog'lanmaganligini unutmang, shuning uchun kutish funksiyasi chaqirilganda ko'rsatilgan tutqichlarning hech biri to'g'ridan-to'g'ri biron bir kiritish-chiqarish operatsiyasi bilan bog'liq emas. Shu bilan birga, SleepEx funksiyasi sinxronizatsiya ob'ektlari bilan bog'liq emas va shuning uchun uni ishlatish eng oson. SleepEx funksiyasi bo'lsa, uyqu oralig'ining davomiyligi odatda INFINITE ga o'rnatiladi, shuning uchun bu funksiyadan qaytish faqat hozirda navbatda turgan bir yoki bir nechta tugatish protseduralari bajarilishini tugatgandan so'ng sodir bo'ladi.

Tugatish protsedurasini bajaring va kutish funksiyasidan qayting

Kengaytirilgan kiritish-chiqarish operatsiyasi tugagach, uning argumentlari OVERLAPPED tuzilmasini, bayt sonini va xato kodini ko'rsatuvchi bog'liq bajarish protsedurasi bajarish uchun navbatga qo'yiladi.

Tarmoq navbatidagi barcha tugatish tartib-qoidalari ip boʻsh kutish holatiga kirganda bajarila boshlaydi. Ular birin-ketin bajariladi, lekin kiritish-chiqarish operatsiyalari bajarilgan ketma-ketlikda bo'lishi shart emas. Kuzatuv funksiyasidan qaytish faqat tugatish protsedurasi qaytgandan keyin sodir bo'ladi. Bu xususiyat ko'pchilik dasturlarning to'g'ri ishlashini ta'minlash uchun muhimdir, chunki u tugatish tartib-qoidalari OVERLAPPED tuzilmasidan keyingi foydalanishga tayyorgarlik ko'rish va uyqu holatidan qaytishdan oldin dasturni ma'lum holatga keltirish uchun boshqa zarur harakatlarni bajarish imkoniyatini oladi deb taxmin qiladi. davlat.

Agar SleepEx funktsiyasidan qaytish bir yoki bir nechta navbatda turgan tugatish protseduralarining bajarilishi bilan bog'liq bo'lsa, u holda funktsiyaning qaytish qiymati WAIT_TO_COMPLETION bo'ladi va xuddi shu qiymat kutish funksiyalaridan biri tugaganidan keyin chaqirilgan GetLastError funktsiyasi tomonidan qaytariladi. qaytdi.

Xulosa qilib aytganda, biz ikkita fikrni ta'kidlaymiz:

1. Har qanday kuzatuv funksiyasini chaqirganda, kutish oralig'i parametrining qiymati sifatida INFINITE dan foydalaning. Kutish oralig'i tugashi mumkin bo'lmagan taqdirda, funktsiyalardan qaytish faqat barcha tugatish protseduralari bajarilishi tugagandan yoki identifikatorlar signalli holatga o'tgandan keyin amalga oshiriladi.

2. Axborotni yakunlash protsedurasiga uzatish uchun OVERLAPPED strukturasining hEvent ma'lumotlar elementidan foydalanish odatiy holdir, chunki bu maydon OT tomonidan e'tiborga olinmaydi.

Asosiy ip, tugatish tartiblari va kuzatuv funktsiyalari o'rtasidagi o'zaro ta'sir 1-rasmda ko'rsatilgan. 14.2. Ushbu misol bir vaqtning o'zida uchta o'qishni boshlaydi, ulardan ikkitasi kutish rejimida kutish boshlanishi bilan tugaydi.

Guruch. 14.2. Tugatish tartiblaridan foydalangan holda asinxron kiritish-chiqarish

Misol: Kengaytirilgan kiritish-chiqarish yordamida faylni konvertatsiya qilish

14.3 dasturi (atouEX) 14.1 dasturining qayta ko'rib chiqilgan versiyasidir. Ushbu dasturlar asinxron kiritish-chiqarishning ikkita usuli o'rtasidagi farqni ko'rsatadi. atouEx dasturi 14.1 dasturiga o'xshaydi, lekin u ko'pgina manbalarni tartiblash kodini yakunlovchiga o'tkazdi va yakunlovchi ularga kirishi uchun ko'plab o'zgaruvchilarni global qildi. Biroq, B ilovasi unumdorlik nuqtai nazaridan atouEx faylni xaritalashdan foydalanmaydigan boshqa usullar bilan ancha raqobatbardosh ekanligini ko'rsatadi, atouOV esa sekinroq.

Dastur 14.2. atouEx: kengaytirilgan kiritish-chiqarish yordamida fayl konvertatsiyasi
EXTENDED I/U yordamida faylni ASCII dan Unicode ga aylantirish. */
/* atouEX fayl 1 fayl 2 */

#define REC_SIZE 8096 /* Blok hajmi atouOV bilan bo'lgani kabi unumdorlik nuqtai nazaridan unchalik muhim emas. */
#UREC_SIZE 2 * REC_SIZE ni aniqlang

statik VOID WINAPI ReadDone(DWORD, DWORD, LPOVERLAPPED);
statik VOID WINAPI WriteDone(DWORD, DWORD, LPOVERLAPPED);

/* Birinchi OVERLAPPED strukturasi o'qish uchun, ikkinchisi esa yozish uchun. Har bir kelgusi operatsiya uchun tuzilmalar va buferlar ajratiladi. */
OVERLAPPED OverLapIn, OverLapOut ;
CHAR AsRec;
WCHAR UnRec;
HANDLE hInputFile, hOutputFile;

int _tmain (int argc, LPTSTR argv) (
hInputFile = Create File(argv, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
hOutputFile = Fayl yaratish(argv, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_OVERLAPPED, NULL);
FileSize.LowPart = GetFileSize(hInputFile, &FileSize.HighPart);
nRecord = FileSize.QuadPart / REC_SIZE;
agar ((FileSize.QuadPart % REC_SIZE) != 0) nRecord++;
uchun (ic = 0; ic< MAX_OVRLP; ic++) {
OverLapIn.hEvent = (HANDLE)ic; /* Hodisani qayta yuklash. */
OverLapOut.hEvent = (HANDLE)ic; /* Maydonlar. */
OverLapIn.Offset = CurPosIn.LowPart;
OverLapIn.OffsetHigh = CurPosIn.HighPart;
agar (CurPosIn.QuadPart< FileSize.QuadPart) ReadFileEx(hInputFile, AsRec, REC_SIZE, &OverLapIn , ReadDone);
CurPosIn.QuadPart += (LONGLONG)REC_SIZE;
/* Barcha o'qish operatsiyalari bajariladi. Kutish holatiga kiring va barcha yozuvlar qayta ishlanmaguncha unda qoling.*/
esa (nBajarildi< 2 * nRecord) SleepEx(INFINITE, TRUE);
_tprintf(_T("ASCIIdan Unicodega oʻtkazish tugallandi.\n"));

statik VOID WINAPI o‘qildi (DWORD kodi, DWORD nBytes, LPOVERLAPPED pOv) (
/* Oʻqish tugallandi. Ma'lumotlarni o'zgartiring va yozishni boshlang. */
LARGE_INTEGER CurPosIn, CurPosOut;
/* Yozishni qayta ishlash va yozish jarayonini boshlash. */
CurPosIn.LowPart = OverLapIn.Offset;
CurPosIn.HighPart = OverLapIn.OffsetHigh;
CurPosOut.QuadPart = (CurPosIn.QuadPart / REC_SIZE) * UREC_SIZE;
OverLapOut.Offset = CurPosOut.LowPart;
OverLapOut.OffsetHigh = CurPosOut.HighPart;
/* Yozuvni ASCII dan Unicode ga aylantirish. */
uchun (i = 0; i< nBytes; i++) UnRec[i] = AsRec[i];
WriteFileEx(hOutputFile, UnRec, nBytes*2, &OverLapOut, WriteDone);
/* OVERLAPPED strukturasini keyingi o‘qish uchun tayyorlang. */
CurPosIn.QuadPart += REC_SIZE * (LONGLONG) (MAX_OVRLP);
OverLapIn.Offset = CurPosIn.LowPart;
OverLapIn.OffsetHigh = CurPosIn.HighPart;

statik VOID WINAPI WriteDone(DWORD kodi, DWORD nBytes, LPOVERLAPPED pOv) (
/* Yozish tugallandi. Keyingi o'qish operatsiyasini boshlang. */
CurPosIn.LowPart = OverLapIn.Offset;
CurPosIn.HighPart = OverLapIn.OffsetHigh;
agar (CurPosIn.QuadPart< FileSize.QuadPart) {
ReadFileEx(hInputFile, AsRec, REC_SIZE, &OverLapIn, ReadDone);

Bir nechta iplardan foydalangan holda asinxron kiritish-chiqarish

Bir-biriga o'xshash va kengaytirilgan kiritish-chiqarish bitta oqim ichida asinxron kiritish-chiqarish imkonini beradi, garchi OS bu funksiyani qo'llab-quvvatlash uchun o'z ish zarralarini yaratadi. U yoki bu turdagi usullar ko'pincha ko'plab dastlabki operatsion tizimlarda bitta oqimli tizimlarda asinxron operatsiyalarni bajarishning cheklangan shakllarini qo'llab-quvvatlash uchun ishlatiladi.

Biroq, Windows ko'p ish zarralarini qo'llab-quvvatlaydi, shuning uchun bir nechta mustaqil bajariladigan iplarda sinxron kiritish-chiqarish operatsiyalarini bajarish orqali bir xil effektga erishish mumkin. Bu imkoniyatlar allaqachon ko'p tarmoqli serverlar va grepMT dasturi bilan namoyish etilgan (7-bob). Bundan tashqari, iplar asinxron kiritish-chiqarishni amalga oshirishning kontseptual ketma-ketligi va go'yoki ancha sodda usulini ta'minlaydi. 14.1 va 14.2 dasturlarida qo'llaniladigan usullarga muqobil ravishda har bir ipga o'z fayl identifikatorini berish mumkin, keyin esa har bir oqim har to'rtinchi yozuvni sinxron tarzda qayta ishlash mumkin.

Oqimlardan foydalanishning bunday usuli kitobga kiritilmagan, lekin veb-saytda joylashtirilgan materialga kiritilgan atouMT dasturida ko'rsatilgan. atouMT nafaqat Windows-ning istalgan versiyasida ishlay oladi, balki u ikkita asinxron kiritish-chiqarish dasturidan ham soddaroq, chunki resurslardan foydalanishni hisobga olish unchalik murakkab emas. Har bir ip oddiygina o'z buferlarini o'z stekida saqlaydi va sinxron o'qish, o'zgartirish va yozish ketma-ketligi orqali aylanadi. Shu bilan birga, dasturning ishlashi ancha yuqori darajada qolmoqda.

Eslatma

Veb-saytdagi atouMT.c dasturi bir vaqtning o'zida bir nechta mavzularga bir faylga kirishga ruxsat berganingizda duch kelishi mumkin bo'lgan bir nechta mumkin bo'lgan "tuzoqlar" haqida izoh beradi. Xususan, barcha individual fayl tutqichlari DuplicateHandle funksiyasidan emas, balki CreateHandle funksiyasidan foydalanib yaratilishi kerak.

Shaxsan men asinxron kiritish-chiqarish o'rniga ko'p oqimli fayllarni qayta ishlashdan foydalanishni afzal ko'raman. Oqimlarni dasturlash osonroq va aksariyat hollarda yaxshiroq ishlashni ta'minlaydi.

Ushbu umumiy qoidadan ikkita istisno mavjud. Ulardan birinchisi, ushbu bobda avval ko'rsatilgandek, faqat bitta ajoyib operatsiya bo'lishi mumkin bo'lgan holatlar bilan bog'liq va sinxronizatsiya maqsadlarida fayl identifikatoridan foydalanish mumkin. Ikkinchi, muhimroq istisno, ushbu bobning oxirida muhokama qilinadigan asinxron kiritish-chiqarish portlari holatida sodir bo'ladi.

Kutish taymerlari

Windows NT kutish taymerlarini qo'llab-quvvatlaydi, ular kutishni bajaradigan yadro ob'ektlarining bir turi.

Kutish funksiyasi chaqirilgandan so'ng uyg'onish hodisasini o'rnatadigan soat ipini yaratish orqali siz har doim o'zingizning soat signalini yaratishingiz mumkin. ServerNP dasturida (Dastur 11.3) server vaqti-vaqti bilan kanal nomini translyatsiya qilish uchun soat oqimidan ham foydalanadi. Shu sababli, kutish taymerlari vaqti-vaqti bilan yoki ma'lum bir jadvalga muvofiq bajarish uchun vazifalarni tashkil qilishning biroz ortiqcha, ammo qulay usulini taqdim etadi. Xususan, kutish taymerini signalni qat'iy belgilangan vaqtda hosil qiladigan tarzda sozlash mumkin.

Kutish taymeri sinxronizatsiya taymeri yoki qo'lda qayta o'rnatish bildirishnomasi bo'lishi mumkin. Sinxronlash taymeri kengaytirilgan kiritish-chiqarish jarayonini yakunlash protsedurasiga o‘xshash bilvosita qo‘ng‘iroq funksiyasi bilan bog‘langan, kutish funksiyasi esa qo‘lda qayta o‘rnatish bildirishnoma taymerida sinxronlash uchun ishlatiladi.

Birinchidan, CreateWaitableTimer funksiyasidan foydalanib, taymer tutqichini yaratishingiz kerak.

HANDLE CreateWaitableTimer(LPSECURITY_ATTRIBUTES lpTimerAttributes, BOOL bManualReset, LPCTSTR lpTimerName);

Ikkinchi parametr, bManualReset, yaratiladigan taymer turi sinxronlash yoki bildirishini aniqlaydi. Dastur 14.3 sinxronlash taymeridan foydalanadi, ammo sharhlar va parametr sozlamalarini o'zgartirib, uni osongina bildirishnoma taymeriga aylantirishingiz mumkin. Uchinchi argument tomonidan taqdim etilgan ixtiyoriy nomdan foydalanishi mumkin bo'lgan OpenWaitableTimer funksiyasi ham mavjudligini unutmang.

Dastlab, taymer nofaol holatda yaratilgan, lekin SetWaitableTimer funksiyasidan foydalanib, siz uni faollashtirishingiz va boshlang'ich kechikish vaqtini, shuningdek davriy ravishda hosil bo'ladigan signallar orasidagi vaqt oralig'ining davomiyligini belgilashingiz mumkin.

BOOL SetWaitableTimer(HANDLE hTimer, const LARGE_INTEGER *pDueTime, LONG IPperiod, PTIMERAPCROUTINE pfnCompletionRutine, LPVOID lpArgToCompletionRoutine, BOOL fResume);

hTimer - bu CreateWaitableTimer funksiyasi yordamida yaratilgan taymer uchun yaroqli dastak.

pDueTime ko'rsatkichi ko'rsatadigan ikkinchi parametr mutlaq vaqtga mos keladigan ijobiy qiymatlarni yoki nisbiy vaqtga to'g'ri keladigan salbiy qiymatlarni qabul qilishi mumkin, haqiqiy qiymatlar 100 nanosekundlik vaqt birliklarida ifodalangan va ularning formati FILETIME strukturasi tomonidan tasvirlangan. . FILETIME tipidagi o'zgaruvchilar 3-bobda kiritilgan va allaqachon timep dasturida 6-bobda ishlatilgan (Dastur 6.2).

Uchinchi parametrda ko'rsatilgan signallar orasidagi intervalning qiymati millisekundlarda ifodalanadi. Agar bu qiymat 0 ga o'rnatilgan bo'lsa, u holda taymer faqat bir marta signallanadi. Agar bu parametr ijobiy bo'lsa, taymer davriy bo'ladi va uning harakati CancelWaitableTimer funksiyasini chaqirish orqali tugatilguncha vaqti-vaqti bilan ishlaydi. Belgilangan oraliq uchun salbiy qiymatlarga ruxsat berilmaydi.

To'rtinchi parametr pfnCompletionRoutine taymerni sinxronlashda ishlatiladi va taymer signal berilganda chaqiriladigan tugatish tartibining manzilini belgilaydi. va taqdim etilgan ipning bo'sh kutish holatiga kirishi. Ushbu protsedura chaqirilganda, argumentlardan biri sifatida beshinchi parametr plArgToComplretionRoutine tomonidan belgilangan ko'rsatgich ishlatiladi.

Sinxronizatsiya taymerini o'rnatish orqali siz tugatish protsedurasini chaqirish mumkinligini ta'minlash uchun SleepEx funksiyasini chaqirish orqali ipni uyqu holatiga qo'yishingiz mumkin. Ogohlantirish taymerini qo'lda qayta o'rnatishda taymer tutqichi signal berilishini kutishingiz kerak. Tutqich SetWaitableTimer funksiyasiga keyingi qo'ng'iroqqa qadar signal berilgan holatda qoladi. Veb-saytda joylashgan 14.3 dasturining to'liq versiyasi o'zingiz tanlagan taymer yordamida o'zingizning tajribalaringizni bajarishga imkon beradi, tugatish tartibi bilan birlashtiriladi yoki taymer tutqichining signalini kutish, natijada to'rt xil kombinatsiya hosil bo'ladi.

Oxirgi parametr fResume quvvatni tejash rejimlari bilan bog'liq. Ushbu mavzu bo'yicha qo'shimcha ma'lumot olish uchun yordam hujjatlariga qarang.

CancelWaitableTimer funksiyasi avval chaqirilgan SetWaitableTimer funksiyasini bekor qilish uchun ishlatiladi, lekin taymerning signalli holatini o‘zgartirmaydi. Buning uchun siz yana SetWaitableTimer funksiyasini chaqirishingiz kerak.

Misol: Kutish taymeridan foydalanish

Dastur 14.3 davriy signallarni ishlab chiqarish uchun uyqu taymeridan foydalanishni ko'rsatadi.

Dastur 14.3. TimeBeep: davriy signallarni yaratish
/* 14-bob. TimeBeep.p. Vaqti-vaqti bilan ovozli xabar. */
/* Foydalanish: TimeBeep davri (millisekundlarda). */

statik BOOL WINAPI ishlov beruvchisi (DWORD CntrlEvent);
statik VOID APIENTRY signali (LPVOID, DWORD, DWORD);
uchuvchi statik BOOL Exit = FALSE;

int _tmain (int argc, LPTSTR argv) (
/* Klaviatura bosishlarini kesish operatsiyani tugatish uchun. 4-bobga qarang. */
SetConsoleCtrlHandler(Handler, TRUE);
DueTime.QuadPart = -(LONGLONG)Davlat * 10000;
/* DueTime parametri birinchi kutish davri uchun manfiy va joriy vaqtga nisbatan. Vaqt tugashi vaqti ms (10 -3 s), DueTime esa FILETIME turiga mos kelishi uchun 100 ns (10 -7 s) birliklarida o'lchanadi. */
hTimer = CreateWaitableTimer(NULL, FALSE /* "Sinxronizatsiya taymer" */, NULL);
SetWaitableTimer(hTimer, &DueTime, Davr, Beeper, &Count, TRUE);
_tprintf(_T("Hisob = %d\n"), Sanoq);
/* Hisoblagich qiymati taymer protsedurasida oshiriladi. */
/* Kutish holatini kiriting. */
_tprintf(_T("To'ldirish. Hisoblagich = %d"), Hisoblash);

statik VOID APIENTRY signali (LPVOID lpCount, DWORD dwTimerLowValue, DWORD dwTimerHighValue) (
*(LPDWORD)lpCount = *(LPDWORD)lpCount + 1;
_tprintf(_T("Signal raqamini yaratish: %d\n"), *(LPDWORD) lpCount);
Fan(1000 /* Chastotasi. */, 250 /* Davomiyligi (ms. */);

BOOL WINAPI ishlov beruvchisi (DWORD CntrlEvent) (
_tprintf(_T("O'chirish\n"));

Kirish-chiqarish operatsiyasi uchun so'rovni bergan vazifa rahbar tomonidan buyurtma qilingan operatsiyani bajarishni kutish holatiga o'tkaziladi. Nazoratchi bajarilish bo‘limidan operatsiya tugallanganligi to‘g‘risida xabar olganida, u vazifani bajarish uchun tayyor holatga keltiradi va u o‘z ishini davom ettiradi. Bu holat sinxron I/U ga mos keladi. Sinxron kiritish-chiqarish ko'pgina operatsion tizimlarda standart hisoblanadi. Ilovani bajarish tezligini oshirish uchun, agar kerak bo'lsa, asinxron kiritish-chiqarishdan foydalanish taklif qilindi.

Asinxron chiqishning eng oddiy varianti tashqi qurilmaga bufer deb ataladigan chiqish bo'lib, unda ilovadan olingan ma'lumotlar to'g'ridan-to'g'ri kiritish-chiqarish qurilmasiga emas, balki maxsus tizim buferiga uzatiladi. Bunday holda, mantiqan, dastur uchun chiqish operatsiyasi darhol tugallangan deb hisoblanadi va vazifa qurilmaga haqiqiy ma'lumotlarni uzatish jarayonining tugashini kutishi shart emas. Tizim buferidan ma'lumotlarni haqiqatda chiqarish jarayoni kiritish-chiqarish nazoratchisi tomonidan amalga oshiriladi. Tabiiyki, tizim xotirasi hududidan kiritish-chiqarish nazoratchisi ko'rsatmasi bo'yicha bufer ajratish bilan maxsus tizim jarayoni shug'ullanadi. Shunday qilib, ko'rib chiqilayotgan holat uchun chiqish asinxron bo'ladi, agar birinchidan, kiritish-chiqarish so'rovi ma'lumotlarni buferlash zarurligini ko'rsatsa, ikkinchidan, agar kirish / chiqish qurilmasi bunday asinxron operatsiyalarga ruxsat bersa va bu UCBda qayd etilgan bo'lsa. Siz ma'lumotlarni asenkron kiritishni tashkil qilishingiz mumkin. Biroq, buning uchun nafaqat qurilmadan o'qilgan ma'lumotlarni vaqtincha saqlash uchun xotira maydonini ajratish va ajratilgan buferni operatsiyani buyurgan vazifa bilan bog'lash, balki kiritish-chiqarish operatsiyasiga so'rovni ajratish kerak. ikki qism (ikki so'rovga). Birinchi so'rov sinxron kiritish-chiqarish bilan bajariladiganga o'xshash ma'lumotlarni o'qish operatsiyasini belgilaydi. Shu bilan birga, so'rovning turi (kodi) boshqacha qo'llaniladi va so'rovda kamida bitta qo'shimcha parametr - so'rovga javoban topshiriq oladigan va ajratilgan buferni aniqlaydigan tizim ob'ektining nomi (kodi) ko'rsatiladi. Bufer nomini olgandan so'ng (biz shartli ravishda ushbu tizim ob'ektini shu tarzda chaqiramiz, garchi turli xil operatsion tizimlarda uni belgilash uchun boshqa atamalar, masalan, sinf ishlatiladi), vazifa o'z ishini davom ettiradi. Bu erda shuni ta'kidlash juda muhimki, asinxron kiritish so'rovi natijasida vazifa kiritish-chiqarish nazoratchisi tomonidan kiritish-chiqarish operatsiyasi tugashini kutish holatiga o'tkazilmaydi, balki ishlayotgan holatda qoladi yoki bajarishga tayyor holatda. Biroz vaqt o'tgach, dasturchi tomonidan aniqlangan kerakli kodni bajargandan so'ng, topshiriq kiritish-chiqarish operatsiyasini bajarish uchun ikkinchi so'rovni beradi. Albatta, boshqa kodga (yoki so'rov nomiga) ega bo'lgan bir xil qurilmaga ikkinchi so'rovda vazifa tizim ob'ektining nomini (asenkron ma'lumotlarni kiritish uchun bufer) va ma'lumotlar muvaffaqiyatli yakunlangan taqdirda belgilaydi. o'qish operatsiyasi, ularni darhol tizim buferidan oladi. Agar ma'lumotlar tashqi qurilmadan tizim buferiga hali to'liq qayta yozilmagan bo'lsa, kiritish-chiqarish nazoratchisi vazifani kiritish-chiqarish operatsiyasi tugashini kutish holatiga qo'yadi va keyin hamma narsa oddiy sinxron ma'lumotlarni kiritishga o'xshaydi. .

Odatda, asinxron kiritish-chiqarish ko'p dasturli operatsion tizimlarda taqdim etiladi, ayniqsa, agar OT tishli mexanizm orqali ko'p vazifalarni qo'llab-quvvatlasa. Biroq, agar aniq asenkron kirish/chiqish bo'lmasa, ma'lumotlarni chiqarish uchun mustaqil ish zarrachasini tashkil qilish orqali uning g'oyalarini o'zingiz amalga oshirishingiz mumkin.

Kirish-chiqarish apparatlarini to'plam sifatida ko'rish mumkin apparat protsessorlari, ular bir-biriga nisbatan, shuningdek, markaziy protsessorlarga (protsessorlarga) nisbatan parallel ravishda ishlashga qodir. Bunday "protsessorlar" da shunday deb ataladi tashqi jarayonlar. Masalan, tashqi qurilma (kirish/chiqarish qurilmasi) uchun tashqi jarayon bosib chiqarish kallagini harakatga keltiradigan, qog'ozni bir pozitsiyaga oldinga siljituvchi, siyoh rangini o'zgartiruvchi yoki ba'zi belgilarni chop etuvchi operatsiyalar to'plami bo'lishi mumkin. Kirish-chiqarish uskunasidan foydalangan holda tashqi jarayonlar bir-biri bilan va markaziy protsessorda ishlaydigan oddiy "dasturiy ta'minot" jarayonlari bilan o'zaro ta'sir qiladi. Bu holda muhim bo'lgan narsa shundaki, tashqi jarayonlarni bajarish tezligi odatdagidan (" ichki”) jarayonlar. Ularning normal ishlashi uchun tashqi va ichki jarayonlar sinxronlashtirilishi kerak. Ichki va tashqi jarayonlar o'rtasidagi kuchli tezlik mos kelmasligi ta'sirini yumshatish uchun yuqorida aytib o'tilgan buferlash qo'llaniladi. Shunday qilib, biz parallel o'zaro ta'sir qiluvchi jarayonlar tizimi haqida gapirishimiz mumkin (6-bobga qarang).

Buferlar ichki (dasturiy ta'minot) va tashqi jarayonlarga nisbatan muhim resurs bo'lib, ular parallel rivojlanishida axborot bilan o'zaro ta'sir qiladi. Bufer (buferlar) orqali ma'lumotlar yoki biror jarayondan adreslangan tashqi jarayonga (tashqi qurilmaga ma'lumotlarni chiqarish operatsiyasi) yuboriladi yoki tashqi jarayondan ba'zi bir dasturiy jarayonga (ma'lumotlarni o'qish operatsiyasi) uzatiladi. Buferlashni axborot bilan o'zaro ta'sir qilish vositasi sifatida joriy etish ushbu tizim buferlarini boshqarish muammosini qo'yadi, bu esa OT ning nazorat qismi orqali hal qilinadi. Shu bilan birga, supervayzerga nafaqat tizim xotirasi maydonida buferlarni ajratish va bo'shatish, balki buferlarni to'ldirish yoki bo'shatish operatsiyalari holatiga muvofiq jarayonlarni sinxronlashtirish, shuningdek, agar mavjud bo'lmasa, ularni kutish vazifasi yuklanadi. bepul buferlar mavjud va kirish / chiqish uchun so'rov buferlashni talab qiladi. Odatda, kiritish-chiqarish nazoratchisi yuqoridagi vazifalarni hal qilish uchun berilgan OTda qabul qilingan standart sinxronlash vositalaridan foydalanadi. Shuning uchun, agar OT o'zaro ta'sir qiluvchi ilovalar va vazifalarni parallel bajarish muammolarini hal qilish uchun vositalarni ishlab chiqqan bo'lsa, u holda, qoida tariqasida, asinxron kiritish-chiqarishni ham amalga oshiradi.

Ma'lumotlarni kiritish/chiqarish

Oldingi maqolalarning aksariyati hisoblash samaradorligini optimallashtirishga bag'ishlangan. Biz axlat yig'ish, aylanish va rekursiv algoritmlarni sozlash va hatto ish vaqtini qisqartirish uchun algoritmlarni optimallashtirishning ko'plab misollarini ko'rdik.

Ba'zi ilovalar uchun hisoblash jihatlarini optimallashtirish unchalik katta bo'lmagan samaradorlikni ta'minlaydi, chunki ulardagi qiyinchilik tarmoq orqali ma'lumotlarni uzatish yoki diskka kirish kabi kiritish-chiqarish operatsiyalari hisoblanadi. Bizning tajribamizdan shuni aytishimiz mumkinki, ishlash muammolarining muhim qismi suboptimal algoritmlardan foydalanish yoki protsessorga haddan tashqari yuklanish bilan bog'liq emas, balki kiritish-chiqarish qurilmalaridan samarasiz foydalanish bilan bog'liq. Keling, I/U optimallashtirish umumiy ish faoliyatini yaxshilashi mumkin bo'lgan ikkita vaziyatni ko'rib chiqaylik:

    Qo'shimcha xarajatlarni oshiradigan samarasiz kiritish-chiqarish operatsiyalari tufayli dastur jiddiy hisoblash yuklanishiga duch kelishi mumkin. Bundan ham yomoni, ortiqcha yuk shu qadar katta bo'lishi mumkinki, u I/U qurilmasining tarmoqli kengligidan maksimal darajada foydalanishga to'sqinlik qiluvchi cheklovchi omilga aylanadi.

    Kichkina bo'laklarga katta hajmdagi ma'lumotlarni jo'natish yoki barcha tarmoqli kengligidan foydalanmaslik kabi samarasiz dasturlash naqshlari tufayli kiritish-chiqarish qurilmasidan to'liq foydalanilmasligi yoki uning imkoniyatlari isrof bo'lishi mumkin.

Ushbu maqolada umumiy kiritish-chiqarish tushunchalari tavsiflanadi va har qanday kiritish-chiqarishning ishlashini yaxshilash bo'yicha tavsiyalar beriladi. Ushbu tavsiyalar tarmoq ilovalariga, diskni ko'p talab qiladigan jarayonlarga va hatto nostandart, yuqori unumli apparat qurilmalariga kiradigan dasturlarga ham tegishli.

Sinxron va asinxron kiritish-chiqarish

Sinxron rejimda bajarilganda, Win32 API I/U funksiyalari (masalan, ReadFile, WriteFile yoki DeviceloControl) operatsiya tugaguniga qadar dastur bajarilishini bloklaydi. Ushbu modelni ishlatish juda qulay bo'lsa-da, u juda samarali emas. Ketma-ket kiritish-chiqarish so'rovlarini bajarish orasidagi vaqt oralig'ida qurilma bo'sh turishi mumkin, ya'ni to'liq ishlatilmaydi.

Sinxron rejim bilan bog'liq yana bir muammo shundaki, bajarilish chizig'i har qanday bir vaqtda kiritish-chiqarish operatsiyasida vaqtni behuda sarflaydi. Misol uchun, bir vaqtning o'zida ko'plab mijozlarga xizmat ko'rsatadigan server ilovasida har bir seans uchun alohida ijro chizig'ini yaratish mumkin bo'lishi mumkin. Ko'pincha bo'sh bo'lgan bu iplar xotirani yo'qotadi va vaziyatlarni yaratishi mumkin ipni urish, bir vaqtning o'zida ko'plab bajarilish iplari kiritish-chiqarishni yakunlash bo'yicha ishni davom ettirganda va protsessor vaqti uchun kurashni boshlaydi, bu vaqt birligiga kontekstli kalitlarning ko'payishiga va miqyoslilikning pasayishiga olib keladi.

Windows kiritish-chiqarish quyi tizimi (shu jumladan qurilma drayverlari) ichki asinxron rejimda ishlaydi - dastur kiritish-chiqarish operatsiyasi bilan bir vaqtda ishlashni davom ettirishi mumkin. Deyarli barcha zamonaviy apparat qurilmalari asinxron xususiyatga ega va ma'lumotlarni uzatish yoki kiritish-chiqarish operatsiyasi qachon tugaganligini aniqlash uchun doimiy so'rovni talab qilmaydi.

Aksariyat qurilmalar qobiliyatni qo'llab-quvvatlaydi to'g'ridan-to'g'ri xotiraga kirish (Direct Memory Access, DMA) operatsiyada protsessor ishtirokini talab qilmasdan qurilma va kompyuterning operativ xotirasi o‘rtasida ma’lumotlarni uzatish va ma’lumotlarni uzatish tugallanganda uzilish hosil qilish. Ichki asinxron bo'lgan sinxron kiritish-chiqarish faqat Windows ilova qatlamida qo'llab-quvvatlanadi.

Win32 da asinxron kiritish-chiqarish chaqiriladi bir-biriga o'xshash kirish/chiqish (bir-biriga yopishgan kirish/chiqish), sinxron va bir-biriga yopishgan kiritish/chiqarish rejimlarining taqqoslanishi quyidagi rasmda ko'rsatilgan:

Ilova kiritish-chiqarish operatsiyasini bajarish uchun asinxron so'rovni yuborganda, Windows operatsiyani darhol bajaradi yoki operatsiya kutilayotganligini ko'rsatuvchi holat kodini qaytaradi. Keyin ip boshqa kiritish-chiqarish operatsiyalarini boshlashi yoki ba'zi hisob-kitoblarni amalga oshirishi mumkin. Dasturchi kiritish-chiqarish operatsiyalari tugaganligi to'g'risida bildirishnomalarni olishni tashkil qilishning bir necha usullariga ega:

    Win32 hodisasi: I/U tugagach, ushbu hodisani kutayotgan operatsiya bajariladi.

    Mexanizm bilan foydalanuvchi tomonidan belgilangan funktsiyani chaqirish Asinxron protsedura chaqiruvi (APC): Bajarish chizig'i ogohlantiriladigan kutish holatida bo'lishi kerak.

    orqali bildirishnomalarni oling I/U tugatish portlari (IOCP): Bu odatda eng samarali mexanizmdir. Biz buni batafsilroq ko'rib chiqamiz.

Ba'zi kiritish-chiqarish qurilmalari (masalan, bufersiz rejimda ochilgan fayl), agar ilova oz sonli kutilayotgan kiritish-chiqarish so'rovlarining doimo mavjudligini ta'minlay olsa, qo'shimcha imtiyozlar berishi mumkin. Buning uchun birinchi navbatda kiritish-chiqarish operatsiyalarini bajarish uchun bir nechta so'rovlarni bajarish va har bir bajarilgan so'rov uchun yangi so'rov ishlab chiqarish tavsiya etiladi. Bu qurilma drayveri dasturning keyingi so'rovni amalga oshirishini kutmasdan, keyingi operatsiyani imkon qadar tezroq ishga tushirishini ta'minlaydi. Ammo uzatilgan ma'lumotlar miqdori bilan uni haddan tashqari oshirmang, chunki bu cheklangan yadro xotirasi resurslarini iste'mol qiladi.

I/U tugatish portlari

Windows asinxron kiritish-chiqarish operatsiyalari tugaganligi to'g'risida xabar berishning samarali mexanizmini qo'llab-quvvatlaydi I/U tugatish portlari (IOCP). .NET ilovalarida u usul orqali mavjud ThreadPool.BindHandle(). Ushbu mexanizm .NETda kiritish-chiqarish operatsiyalarini bajaradigan bir nechta turlar tomonidan ichkarida qo'llaniladi: FileStream, Socket, SerialPort, HttpListener, PipeStream va ba'zi .NET Remoting kanallari.

Yuqoridagi rasmda ko'rsatilgan IOCP mexanizmi asinxron ravishda ochiq bo'lgan va ma'lum bir ijro chizig'iga ega bo'lgan bir nechta kiritish-chiqarish tutqichlari (rozetkalar, fayllar va maxsus qurilma drayverlari ob'ektlari) bilan bog'lanadi. Bunday tutqich bilan bog'liq bo'lgan kiritish-chiqarish operatsiyasi tugallangandan so'ng, Windows tegishli IOCP portiga bildirishnoma qo'shadi va uni qayta ishlash uchun bog'langan bajarilish chizig'iga uzatadi.

Bildirishnomalarga xizmat ko'rsatish va asinxron kiritish-chiqarish operatsiyalarini boshlagan ish zarrachalarining bajarilishini davom ettirish uchun iplar hovuzidan foydalanish vaqt birligidagi kontekstli kalitlar sonini kamaytiradi va protsessordan foydalanishni oshiradi. Microsoft SQL Server kabi yuqori unumli serverlar kiritish-chiqarish portlaridan foydalanishi ajablanarli emas.

Tugatish porti Win32 API funksiyasini chaqirish orqali yaratiladi IoCompletionPort yaratish, bu maksimal parallellik qiymati (torlar soni), yakunlash kaliti va kiritish-chiqarish ob'ektiga ixtiyoriy tutqichdan o'tadi. Tugatish kaliti foydalanuvchi tomonidan belgilangan qiymat bo'lib, u turli kiritish-chiqarish tutqichlarini aniqlash uchun ishlatiladi. CreateIoCompletionPort funksiyasini qayta-qayta chaqirish va uni mavjud tugatish portiga o'tkazish orqali bir nechta tutqichlarni bir xil IOCP portiga ulashingiz mumkin.

Belgilangan IOCP porti bilan ulanishni o'rnatish uchun foydalanuvchi iplari funksiyani chaqiradi GetCompletionStatus va uning tugashini kuting. Amalga oshirish oqimi bir vaqtning o'zida faqat bitta IOCP porti bilan bog'lanishi mumkin.

Funktsiya chaqiruvi GetQueuedCompletionStatus ipning bajarilishini ogohlantirilgunga qadar bloklaydi (yoki vaqt tugaydi) va keyin tugallangan kiritish-chiqarish operatsiyasi haqidagi ma'lumotlarni qaytaradi, masalan, uzatilgan baytlar soni, tugatish kaliti va asinxron kiritish-chiqarish operatsiyasining tuzilishi . Agar bildirishnoma vaqtida kiritish-chiqarish porti bilan bog'langan barcha oqimlar band bo'lsa (ya'ni GetQueuedCompletionStatus chaqiruvida hech qanday mavzu kutilmasa), IOCP mexanizmi maksimal moslik qiymatiga qadar yangi bajarish oqimini yaratadi. . Agar GetQueuedCompletionStatus deb nomlangan ip va bildirishnoma navbati bo'sh bo'lmasa, funktsiya operatsion tizim yadrosida ipni bloklamasdan darhol qaytadi.

IOCP mexanizmi ba'zi "band" iplar aslida sinxron kiritish-chiqarishni amalga oshirayotganini aniqlay oladi va qo'shimcha ish zarrachasini ishga tushiradi, bu maksimal parallellik qiymatidan oshib ketishi mumkin. Bildirishnomalar funktsiyani chaqirish orqali kiritish-chiqarishni amalga oshirmasdan ham qo'lda yuborilishi mumkin PostQueuedCompletionStatus.

Quyidagi kod ThreadPool.BindHandle() dan Win32 fayl identifikatori bilan foydalanish misolini ko'rsatadi:

Tizimdan foydalanish; System.Threading yordamida; Microsoft.Win32.SafeHandles-dan foydalanish; System.Runtime.InteropServices-dan foydalanish; umumiy sinf Extensions (ichki statik extern SafeFileHandle CreateFile (string lpFileName, EFileAccess dwDesiredAccess, EFileShare dwShareMode, IntPtr lpSecurityAttributes, ECreationDisposition dwCreationDisposition, EFileAttributes dwFlagsAndAttributes, IntPtr hTemplateFile); statik xavfli extern bool WriteFile (SafeFileHandle hFile, lpBuffer bayt, uint nNumberOfBytesToWrite, amalga uint lpNumberOfBytesWritten , System.Threading.NativeOverlapped* lpOverlapped); enum EFileShare: uint (Yo‘q = 0x00000000, O‘qish = 0x00000001, Yozish = 0x00000002, O‘chirish = 0x000000002, O‘chirish = 0x00000004, Openway =Al, Openway =Al,Ochish =Al3D , TruncateExisting = 5 ) enum EFileAttributes: uint ( // ... Ba'zi bayroqlar ko'rsatilmagan Normal = 0x00000080, Overlapped = 0x40000000, NoBuffering = 0x20000000, ) enum EFileAccess: flags ( //0, Ba'zilar ko'rsatilmagan ...08) GenericWrite = 0x40000000, ) statik lo ng_numBytesWritten; // Yozish oqimining statik tormozi AutoResetEvent _waterMarkFullEvent; statik int _pendingIosCount; const int MaxPendingIos = 10; // Tugallash tartibi, kiritish-chiqarish oqimlari tomonidan chaqirilgan statik xavfli void WriteComplete(uint errorCode, uint numBytes, NativeOverlapped* pOVERLAP) ( _numBytesWritten += numBytes; Overlapped ovl = Overlapped.Unpack(pOVERLAP(pOVERLAF.) /Pe); / Agar (Interlocked.Decrement(ref _pendingIosCount) = MaxPendingIos) ( _waterMarkFullEvent.WaitOne(); ) ) ) ) ) kutilayotgan kiritish/chiqarish operatsiyalari soni // ruxsat etilgan chegaraga kamayganligi haqida yozuvchiga xabar bering.

Avval TestIOCP usulini ko'rib chiqamiz. Bu fayl yoki qurilmani ochish yoki yaratish uchun ishlatiladigan P/Invoke mexanizmi funksiyasi boʻlgan CreateFile() funksiyasini chaqiradi. Asinxron rejimda kiritish-chiqarish operatsiyalarini bajarish uchun funksiyaga EFileAttributes.Overlapped bayrog'i uzatilishi kerak. Muvaffaqiyatli bo'lsa, CreateFile() funktsiyasi Win32 fayl identifikatorini qaytaradi, biz uni ThreadPool.BindHandle() ga qo'ng'iroq qilish orqali I/U yakunlash portiga bog'laymiz. Keyinchalik, agar bunday operatsiyalar juda ko'p bo'lsa, kiritish-chiqarish operatsiyasini boshlagan ipni vaqtincha blokirovka qilish uchun foydalaniladigan hodisa ob'ekti yaratiladi (cheklov MaxPendingIos konstantasi tomonidan o'rnatiladi).

Keyin asinxron yozish operatsiyalari sikli boshlanadi. Har bir iteratsiyada yoziladigan ma'lumotlar bilan bufer yaratiladi va bir-biriga yopishgan struktura, fayl ichidagi ofsetni o'z ichiga oladi (bu misolda yozish har doim 0 ofsetda amalga oshiriladi), operatsiya tugagach yuboriladigan voqea dastagi (IOCP mexanizmi tomonidan foydalanilmaydi) va ixtiyoriy foydalanuvchi ob'ekti IAsyncResult Bu holatni yakunlovchi funksiyaga o'tkazish uchun ishlatilishi mumkin.

Keyinchalik, o'rash funktsiyasi va ma'lumotlar buferini qabul qiluvchi Overlapped.Pack() usuli chaqiriladi. U boshqarilmaydigan xotirada ekvivalent past darajadagi I/U strukturasini yaratadi va ma'lumotlar buferini mahkamlaydi. Past darajadagi tuzilma egallagan boshqarilmaydigan xotirani bo'shatish va buferni ajratish qo'lda bajarilishi kerak.

Agar bir vaqtning o'zida juda ko'p kiritish/chiqarishlar bo'lmasa, biz WriteFile() ni chaqiramiz va uni belgilangan past darajadagi tuzilmaga o'tkazamiz. Aks holda, kutilayotgan operatsiyalar soni yuqori chegaradan pastga tushganini ko'rsatadigan voqea sodir bo'lguncha kutamiz.

WriteComplete yakunlash funksiyasi operatsiya tugashi bilanoq kiritish-chiqarishni yakunlash iplari hovuzidagi ip tomonidan chaqiriladi. Unga ko'rsatgich quyi darajadagi asinxron kiritish-chiqarish strukturasiga uzatiladi, uni ochish va boshqariladigan Overlapped strukturaga aylantirish mumkin.

Xulosa qilib aytganda, yuqori unumdorlikka ega kiritish-chiqarish qurilmalari bilan ishlaganda, boshqarilmaydigan kutubxonada oʻz tugallash portingizni yaratish va ishlatish orqali yoki Win32 tutqichlarini .NET-dagi tugatish porti bilan bogʻlash orqali tugallanish portlari bilan asinxron kiritish-chiqarishdan foydalaning. ThreadPool.BindHandle() usuli yordamida.

.NET-dagi mavzular hovuzi

.NET dagi iplar hovuzidan har xil maqsadlarda muvaffaqiyatli foydalanish mumkin, ularning har biri har xil turdagi iplarni yaratadi. Ilgari parallel hisoblashni muhokama qilishda biz iplik hovuzi API bilan tanishdik, u erda biz hisoblash vazifalarini parallellashtirish uchun foydalandik. Biroq, ip hovuzlari boshqa turdagi muammolarni hal qilish uchun ham ishlatilishi mumkin:

    Ishchi mavzular foydalanuvchi delegatlariga (masalan, BeginInvoke yoki ThreadPool.QueueUserWorkItem) asinxron qo'ng'iroqlarni boshqarishi mumkin.

    Kirish/chiqarishni yakunlash iplari global IOCP portidan bildirishnomalarga xizmat qilishi mumkin.

    Ofitsiant iplari ro'yxatdan o'tgan voqealarni kutishi mumkin, bu sizga bir vaqtning o'zida bir nechta voqealarni bir vaqtning o'zida kutish imkonini beradi (WaitForMultipleObjects yordamida), Windows yuqori chegarasigacha (maksimal kutish ob'ektlari = 64). Hodisalarni kutishni qabul qilish asinxron kiritish-chiqarishni tugatish portlaridan foydalanmasdan tashkil qilish uchun ishlatiladi.

    Bir vaqtning o'zida bir nechta taymerlarning muddati tugashini kutayotgan taymer oqimlari.

    Darvoza iplari protsessorni hovuzdan iplar orqali ishlatishni nazorat qilish, shuningdek, eng yuqori ishlashga erishish uchun iplar sonini (belgilangan chegaralar ichida) o'zgartirish.

Asinxron bo'lib ko'rinadigan, lekin bo'lmagan kiritish-chiqarish operatsiyalarini boshlash mumkin. Misol uchun, ThreadPool.QueueUserWorkItem delegatini chaqirish va keyin sinxronlash kiritish-chiqarish operatsiyasini bajarish haqiqatan ham asinxron operatsiya emas va oddiy bajarilish chizig'ida bir xil operatsiyani bajarishdan yaxshiroq emas.

Xotira nusxasi

Jismoniy kiritish-chiqarish qurilmasi ilova uni qayta ishlashni tugatmaguncha qayta-qayta nusxalanadigan ma'lumotlar buferini qaytarishi odatiy hol emas. Bunday nusxa ko'chirish protsessorning qayta ishlash quvvatining muhim qismini iste'mol qilishi mumkin, shuning uchun maksimal o'tkazuvchanlikni ta'minlash uchun undan qochish kerak. Keyinchalik, biz ma'lumotlarni nusxalash odatiy bo'lgan bir nechta vaziyatlarni ko'rib chiqamiz va buni oldini olish usullari bilan tanishamiz.

Boshqarilmaydigan xotira

Boshqarilmaydigan xotirada bufer bilan ishlash .NET da boshqariladigan bayt massiviga qaraganda ancha qiyin, shuning uchun dasturchilar eng oson yo'lni izlash uchun ko'pincha buferni boshqariladigan xotiraga ko'chiradi.

Agar siz foydalanadigan funksiyalar yoki kutubxonalar xotirada buferni aniq belgilashga yoki buferni ajratish uchun unga qayta qo'ng'iroq qilish funksiyasini o'tkazishga imkon bersa, boshqariladigan buferni ajrating va unga ko'rsatgich va boshqariladigan havola orqali kirish mumkin bo'lishi uchun uni xotiraga mahkamlang. Agar bufer etarlicha katta bo'lsa (> 85 000 bayt), u yaratiladi katta ob'ektlar to'plami (Large Object Heap), shuning uchun mavjud buferlarni qayta ishlatishga harakat qiling. Agar buferdan qayta foydalanish ob'ektning ishlash muddatining noaniqligi bilan murakkablashsa, xotira hovuzlaridan foydalaning.

Funktsiyalar yoki kutubxonalar o'zlari buferlar uchun (boshqarilmaydigan) xotira ajratadigan boshqa hollarda, siz ushbu xotiraga to'g'ridan-to'g'ri ko'rsatgich orqali (xavfsiz koddan) yoki o'rash sinflari kabi kirishingiz mumkin. UnmanagedMemoryStream Va BoshqarilmaydiganMemoryAccessor. Biroq, agar siz buferni faqat bayt massivlari yoki satr obyektlarida ishlaydigan ba'zi kodlarga o'tkazishingiz kerak bo'lsa, nusxa ko'chirishdan qochib bo'lmaydi.

Agar siz xotiradan nusxa ko'chirishdan qochib qutula olmasangiz va ma'lumotlaringizning bir qismi yoki ko'pchiligi erta filtrlangan bo'lsa ham, ularni nusxalashdan oldin ma'lumotlarning zarurligini tekshirish orqali keraksiz nusxalashdan qochishingiz mumkin.

Buferning bir qismini eksport qilish

Dasturchilar ba'zan bayt massivlarida faqat kerakli ma'lumotlarni o'z ichiga oladi, deb taxmin qilishadi, bu esa chaqiruvchi kodni buferni buzishga majbur qiladi (yangi bayt massivi uchun xotira ajratadi va faqat kerakli ma'lumotlarni nusxalash). Bunday holatni ko'pincha protokollar stekini amalga oshirishda ko'rish mumkin. Ekvivalent boshqarilmaydigan kod, aksincha, oddiy ko'rsatgichni, hatto haqiqiy buferning boshiga yoki o'rtasiga ishora qilishini bilmasdan va ishlov berilayotgan ma'lumotlarning oxiri qayerda ekanligini aniqlash uchun bufer uzunligi parametrini olishi mumkin.

Keraksiz xotiradan nusxa ko'chirishning oldini olish uchun bayt parametrini olgan joyingizda ofset va uzunlikni qabul qilishni tartibga soling. Massivning Length xususiyati o‘rniga uzunlik parametridan foydalaning va joriy indekslarga ofset qiymatini qo‘shing.

Tasodifiy o'qish va yozishni birlashtirish

Tasodifiy o'qish va yozishni birlashtirish Windows tomonidan qo'llab-quvvatlanadigan qo'shni bo'lmagan hududlarni o'qish yoki qo'shni bo'lmagan hududlardan ma'lumotlarni yozish, go'yo u qo'shni xotira qismini egallagandek qobiliyatdir. Bu funksiya Win32 API-da funksiyalar sifatida taqdim etilgan ReadFileScatter Va WriteFileGather. Windows Sockets Library shuningdek, WSASend, WSARecv va boshqalarni ta'minlash orqali tasodifiy o'qish va yozishni qo'llab-quvvatlaydi.

Tasodifiy o'qish va birlashma yozish quyidagi holatlarda foydali bo'lishi mumkin:

    Har bir paketda haqiqiy ma'lumotlardan oldin sobit o'lchamli sarlavha mavjud bo'lganda. Tasodifiy o'qish va birlashtirish yozish sizga qo'shni buferni olish uchun har safar sarlavhalarni nusxalashdan qochish imkonini beradi.

    Bir nechta buferlar bilan kiritish-chiqarishni amalga oshirishda tizim qo'ng'iroqlari uchun ortiqcha yukdan xalos bo'lish kerak bo'lganda.

ReadFileScatter va WriteFileGather funksiyalari bilan solishtirganda, har bir bufer aynan bir sahifa oʻlchamiga ega boʻlishini va tutqichning asinxron va bufersiz ochilishini talab qiladi (bundan ham katta cheklov), rozetkaga asoslangan oʻqish va birlashtirish yozish funksiyalari amaliyroq koʻrinadi. ., chunki ularda bunday cheklovlar yo'q. .NET Framework haddan tashqari yuklangan usullar orqali rozetkalar uchun tarqoq o'qish va birlashtirish yozishni qo'llab-quvvatlaydi Socket.Send() Va Socket.Receive() umumiy o'qish/yozish funksiyalarini eksport qilmasdan.

Tarqalgan o'qish va yozish funksiyalaridan foydalanish misolini HttpWebRequest sinfida topish mumkin. U HTTP sarlavhalarini saqlash uchun qo'shni bufer yaratmasdan turib, haqiqiy ma'lumotlar bilan birlashtiradi.

Fayl kiritish/chiqarish

Odatda, fayl kiritish/chiqarish fayl tizimining keshi orqali amalga oshiriladi, bu esa bir qancha ishlash afzalliklarini taqdim etadi: yaqinda foydalanilgan ma'lumotlarni keshlash, oldindan o'qish (diskdagi ma'lumotlarni oldindan o'qish), dangasa yozish (diskga asinxron yozish) va birlashtirish. kichik ma'lumotlar bo'laklarini yozadi. Windows-ga kutilayotgan fayllarga kirish namunasi haqida so'rash orqali siz qo'shimcha ish unumdorligini oshirishingiz mumkin. Agar ilovangiz asinxron kiritish-chiqarish bilan shug'ullansa va ba'zi buferlash muammolarini hal qila olsa, keshlash mexanizmidan butunlay qochish yaxshiroq yechim bo'lishi mumkin.

Keshni boshqarish

Fayllarni yaratish yoki ochishda dasturchilar CreateFile funktsiyasiga bayroqlar va atributlarni o'tkazadilar, ularning ba'zilari keshlash mexanizmining ishlashiga ta'sir qiladi:

    Bayroq FILE_FLAG_SEQUENTIAL_SCAN faylga ketma-ket kirishni, ehtimol qismlarni o'tkazib yuborishni va tasodifiy kirish ehtimoli yo'qligini ko'rsatadi. Natijada, kesh menejeri odatdagidan uzoqroqqa qarab, oldinga o'qiydi.

    Bayroq FILE_FLAG_RANDOM_ACCESS faylga tasodifiy tartibda kirishni bildiradi. Bunday holda, kesh menejeri o'qishni biroz oldinda amalga oshiradi, chunki oldinda o'qilgan ma'lumotlar dasturga kerak bo'lishi ehtimoli kamayadi.

    Bayroq FILE_ATTRIBUTE_TEMPORARY faylning vaqtinchalik ekanligini bildiradi, shuning uchun jismoniy muhitga haqiqiy yozish operatsiyalari (ma'lumotlar yo'qolishining oldini olish uchun) kechiktirilishi mumkin.

.NET da bu opsiyalarni (oxirgisidan tashqari) FileOptions enum tipi parametrini oladigan ortiqcha yuklangan FileStream konstruktori yordamida qo‘llab-quvvatlaydi.

Tasodifiy kirish, ayniqsa disk qurilmalari bilan ishlashda ishlashga salbiy ta'sir ko'rsatadi, chunki u harakatlanuvchi boshlarni talab qiladi. Texnologiyaning rivojlanishi bilan diskning o'tkazuvchanligi kechikishni kamaytirish orqali emas, balki saqlash zichligini oshirish orqali oshdi. Zamonaviy disklar boshlarni ko'chirish uchun sarflangan umumiy vaqtni qisqartirish uchun tasodifiy kirish so'rovlarini bajarish tartibini o'zgartirishga qodir. Ushbu yondashuv deyiladi apparat buyruq navbati (Native Command Queuing, NCO). Ushbu texnikani samaraliroq qilish uchun disk boshqaruvchisi bir vaqtning o'zida bir nechta kiritish-chiqarish so'rovlarini yuborishi kerak. Boshqacha qilib aytganda, iloji bo'lsa, bir vaqtning o'zida bir nechta asenkron kiritish-chiqarish so'rovlarini kutishga harakat qiling.

Buferlanmagan kiritish-chiqarish

Buferlanmagan kiritish-chiqarish operatsiyalari har doim keshdan foydalanmasdan amalga oshiriladi. Ushbu yondashuv o'zining afzalliklari va kamchiliklariga ega. Keshni boshqarish nayrangida bo'lgani kabi, fayllarni yaratishda "bayroqlar va atributlar" opsiyasi orqali xom kiritish-chiqarish yoqiladi, ammo .NET bu imkoniyatdan foydalanishni ta'minlamaydi.

    Bayroq FILE_FLAG_NO_BUFFERING o'qish va yozishni keshlashni o'chirib qo'yadi, lekin disk boshqaruvchisi tomonidan bajariladigan keshlashga ta'sir qilmaydi. Bu nusxa ko'chirish (foydalanuvchi buferidan keshga) va keshni "ifloslantirish" (keshni keraksiz ma'lumotlar bilan to'ldirish va kerakli ma'lumotlarni chiqarib tashlash) oldini oladi. Biroq, buferlanmagan o'qish va yozishlar moslashtirish talablariga javob berishi kerak.

    Quyidagi parametrlar disk sektori o'lchamiga teng yoki ko'p bo'lishi kerak: bitta uzatish hajmi, fayldagi ofset va xotiradagi bufer manzili. Odatda, disk sektori hajmi 512 baytni tashkil qiladi. Eng yangi yuqori sig'imli disk qurilmalari 4096 bayt sektor hajmiga ega, biroq ular 512 baytli sektorlarga taqlid qilib, muvofiqlik rejimida ishlashi mumkin (ish unumdorligi hisobiga).

    Bayroq FILE_FLAG_WRITE_ROUGH kesh menejeriga yozish ma'lumotlarini keshdan darhol tozalash kerakligini aytadi (agar FILE_FLAG_NO_BUFFERING bayrog'i o'rnatilmagan bo'lsa) va disk boshqaruvchisiga ma'lumotlarni oraliq apparat keshida saqlamasdan darhol jismoniy tashuvchiga yozish kerakligini aytadi.

Oldindan o'qish, dastur sinxron rejimda operatsiyalar orasidagi kechikishlar bilan o'qiyotganda ham diskdan yaxshiroq foydalanish orqali ishlashni yaxshilaydi. Ilova faylning qaysi qismini keyingi so'rashini to'g'ri aniqlash Windowsga bog'liq. Buferlashni o'chirib qo'yish orqali siz oldinga o'qishni ham o'chirib qo'yasiz va bir-biriga o'xshash bir nechta kiritish/chiqarishlarni bajarish orqali disk qurilmasini band qilishingiz kerak.

Lazy writes, shuningdek, sinxron yozish operatsiyalarini bajaradigan ilovalarning ishlashini yaxshilaydi, bu esa diskka yozish juda tez ekanligi haqidagi tasavvurni beradi. Ilova qisqaroq vaqt davomida blokirovka qilish orqali CPU foydalanishni yaxshilashi mumkin. Buferlash o'chirilgan bo'lsa, yozish operatsiyalarining davomiyligi diskka ma'lumotlarni yozishni yakunlash uchun zarur bo'lgan to'liq vaqtga teng bo'ladi. Shu sababli, o'chirilgan bufer bilan asinxron kiritish / chiqish rejimidan foydalanish yanada muhimroq bo'ladi.

I/U boshqaruvi.

blokga yo'naltirilgan qurilmalar va baytga yo'naltirilgan

Asosiy fikr

kalit tamoyilidir qurilma mustaqilligi

Ishni to'xtatib turish,

qurilma drayverlari,

Ko'rinib turibdiki, turli xil sabablarga ko'ra turli xil uzilishlar mumkin. Shuning uchun raqam uzilish bilan bog'lanadi - uzilish raqami deb ataladi.

Bu raqam alohida hodisaga mos keladi. Tizim uzilishlarni taniy oladi va ular sodir bo'lganda, uzilish raqamiga mos keladigan protsedurani boshlaydi.

Ba'zi uzilishlar (raqamli tartibda birinchi beshta) protsessor tomonidan nolga bo'linish, to'lib ketish va hokazo kabi har qanday maxsus hodisalarda foydalanish uchun ajratilgan (bular haqiqatan ham J ichki uzilishlar).

Uskuna uzilishlari har doim ishlaydigan dasturlarga nisbatan asinxron ravishda sodir bo'ladi. Bundan tashqari, bir vaqtning o'zida bir nechta uzilishlar sodir bo'lishi mumkin!

Qaysi uzilishni birinchi bo'lib xizmat ko'rsatishni hal qilishda tizim yo'qolmasligi uchun alohida ustuvorlik sxemasi mavjud. Har bir uzilish o'z ustuvorligiga ega. Agar bir vaqtning o'zida bir nechta uzilishlar sodir bo'lsa, tizim boshqa uzilishlarni biroz vaqtga qoldirib, eng yuqori ustuvorlikka ustunlik beradi.

Prioritet tizimi ikkita Intel 8259 chiplarida (yoki shunga o'xshash) amalga oshiriladi. Har bir chip uzilishni boshqaruvchi bo'lib, sakkiztagacha ustuvorlikni boshqaradi. Tizimdagi ustuvor darajalar sonini oshirish uchun chiplar birlashtirilishi mumkin (kaskad).

Ustuvorlik darajalari IRQ0 - IRQ15 deb qisqartiriladi.


24. Kirish / chiqishni boshqarish. Sinxron va asinxron kiritish-chiqarish.

OT ning asosiy vazifalaridan biri kompyuterning barcha kiritish/chiqarish qurilmalarini boshqarishdir. OT qurilmalarga buyruqlar yuborishi, uzilishlarni ushlashi va xatolarni boshqarishi kerak; shuningdek, qurilmalar va tizimning qolgan qismi o'rtasida interfeysni ta'minlashi kerak. Rivojlanish maqsadlarida interfeys barcha turdagi qurilmalar uchun bir xil bo'lishi kerak (qurilma mustaqilligi). 23-sonli kiritish-chiqarish nazorati haqida batafsil.

Himoya tamoyillari

UNIX operatsion tizimi o'zining boshidanoq ko'p foydalanuvchili operatsion tizim sifatida yaratilganligi sababli, turli foydalanuvchilarning fayl tizimi fayllariga kirishiga ruxsat berish muammosi doimo dolzarb bo'lib kelgan. Kirish avtorizatsiyasi deganda, foydalanuvchining kirish huquqlari va faylga o'rnatilgan kirish cheklovlariga qarab, ma'lum bir foydalanuvchining ma'lum faylga kirishiga ruxsat beruvchi yoki ruxsat bermaydigan tizimning harakatlarini tushunamiz. UNIX operatsion tizimida foydalaniladigan kirishni avtorizatsiya qilish sxemasi shunchalik sodda va qulay va ayni paytda shu qadar kuchliki, u zamonaviy operatsion tizimlarning amalda standartiga aylandi (ular ko'p darajali himoyalangan tizimlar sifatida ko'rinmaydi).

Fayl himoyasi

Ko'p foydalanuvchili operatsion tizimda odat bo'lganidek, UNIX fayllar va fayl tizimi kataloglariga kirishni boshqarishning yagona mexanizmini saqlaydi. Har qanday jarayon ma'lum bir faylga kirishi mumkin, agar fayl bilan tavsiflangan kirish huquqlari ushbu jarayonning imkoniyatlariga mos kelsa.

UNIX da fayllarni ruxsatsiz kirishdan himoya qilish uchta faktga asoslanadi. Birinchidan, faylni (yoki katalogni) yaratadigan har qanday jarayon tizim uchun noyob foydalanuvchi identifikatori (UID -) bilan bog'langan. Foydalanuvchi identifikatori), kelajakda yangi yaratilgan fayl egasining identifikatori sifatida talqin qilinishi mumkin. Ikkinchidan, faylga kirishga urinayotgan har bir jarayonda tegishli identifikatorlar juftligi, joriy foydalanuvchi va guruh identifikatorlari mavjud. Uchinchidan, har bir fayl o'zining deskriptoriga - i-tuguniga o'ziga xos tarzda mos keladi.

Oxirgi fakt haqida batafsilroq to'xtalib o'tishga arziydi. Fayl nomlari va fayllar bir xil narsa emasligini tushunish muhimdir. Xususan, bitta faylga bir nechta qattiq havolalar mavjud bo'lganda, bir nechta fayl nomlari aslida bir xil faylni ifodalaydi va bir xil i-tugun bilan bog'lanadi. Fayl tizimida ishlatiladigan har qanday i-tugun har doim yagona va faqat bitta faylga mos keladi. I-tugun juda ko'p turli xil ma'lumotlarni o'z ichiga oladi (ularning aksariyati stat va fstat tizimi qo'ng'iroqlari orqali foydalanuvchilarga mavjud) va bu ma'lumotlar orasida fayl tizimiga ma'lum jarayonga kirish huquqlarini baholashga imkon beruvchi qism mavjud. kerakli rejimda berilgan faylga.

Umumiy himoya tamoyillari tizimning barcha mavjud variantlari uchun bir xil: i-tugun ma'lumotlari faylning joriy egasining UID va GID-larini o'z ichiga oladi (fayl yaratilgandan so'ng darhol uning joriy egasining identifikatorlari yaratuvchi jarayonining tegishli joriy identifikatori, lekin keyinchalik chown va chgrp tizim chaqiruvlari orqali o'zgartirilishi mumkin) . Bundan tashqari, faylning i-tugunida foydalanuvchi - uning egasi fayl bilan nima qila olishi, egasi bilan bir xil foydalanuvchilar guruhiga kiruvchi foydalanuvchilar fayl bilan nima qilishlari va boshqalar bilan nima qilishlari mumkinligini ko'rsatadigan shkala mavjud. fayl foydalanuvchilari. Tizimning turli versiyalarida amalga oshirishning kichik tafsilotlari farqlanadi.

28. Windows NT da fayllarga kirishni boshqarish. Kirish huquqlari ro'yxati.

Windows NT da kirishni boshqarish tizimi yuqori darajada moslashuvchanligi bilan ajralib turadi, bunga kirishning turli xil sub'ektlari va ob'ektlari, shuningdek, kirish operatsiyalarining granülyarligi orqali erishiladi.

Faylga kirishni boshqarish

Umumiy resurslar uchun Windows NT ruxsat etilgan operatsiyalar to'plami, ega identifikatori va kirishni boshqarish ro'yxati kabi xavfsizlik xususiyatlarini o'z ichiga olgan umumiy ob'ekt modelidan foydalanadi.

Windows NT dagi ob'ektlar har qanday resurs uchun ular umumiy bo'lgan yoki umumiy bo'lgan taqdirda yaratiladi - fayllar, kataloglar, qurilmalar, xotira bo'limlari, jarayonlar. Windows NT da ob'ektlarning xarakteristikalari ikki qismga bo'linadi - tarkibi ob'ekt turiga bog'liq bo'lmagan umumiy qism va ob'ekt turiga qarab belgilanadigan alohida qism.
Barcha ob'ektlar daraxtga o'xshash ierarxik tuzilmalarda saqlanadi, ularning elementlari filial ob'ektlari (kataloglar) va barg ob'ektlari (fayllar). Fayl tizimi ob'ektlari uchun bu munosabatlar sxemasi kataloglar va fayllar ierarxiyasining bevosita aksidir. Boshqa turdagi ob'ektlar uchun ierarxik munosabatlar sxemasi o'z mazmuniga ega, masalan, jarayonlar uchun u ota-ona munosabatlarini aks ettiradi va qurilmalar uchun u ma'lum turdagi qurilmalarga tegishliligini va qurilmaning boshqa qurilmalar bilan ulanishini aks ettiradi. masalan, disklar bilan SCSI kontroller.

Har qanday turdagi ob'ektlarga kirish huquqlarini tekshirish imtiyozli rejimda ishlaydigan Xavfsizlik ma'lumotnomasi monitori yordamida markaziy tarzda amalga oshiriladi.

Windows NT xavfsizlik tizimi ko'p sonli turli xil oldindan belgilangan (o'rnatilgan) kirish sub'ektlari - individual foydalanuvchilar va guruhlar mavjudligi bilan tavsiflanadi. Shunday qilib, tizimda har doim Adinistrator, System va Guest kabi foydalanuvchilar, shuningdek, Users, Adiniiistrators, Account Operators, Server Operators, Everyone va boshqalar guruhlari mavjud. Ushbu o'rnatilgan foydalanuvchilar va guruhlarning mohiyati shundaki, ular ba'zi huquqlarga ega bo'lib, administratorga kirishni boshqarishning samarali tizimini yaratishni osonlashtiradi. Yangi foydalanuvchi qo'shganda, administrator faqat ushbu foydalanuvchini qaysi guruh yoki guruhlarga tayinlashni hal qilishi kerak. Albatta, ma'mur yangi guruhlar yaratishi mumkin, shuningdek, o'z xavfsizlik siyosatini amalga oshirish uchun o'rnatilgan guruhlarga huquqlar qo'shishi mumkin, lekin ko'p hollarda o'rnatilgan guruhlar etarli.

Windows NT ushbu operatsiyalarda ishtirok etuvchi sub'ektlar va ob'ektlar turiga ko'ra farq qiluvchi kirish operatsiyalarining uchta sinfini qo'llab-quvvatlaydi.

□ Ruxsatlar - bu har qanday turdagi ob'ektlarga nisbatan barcha turdagi sub'ektlar uchun aniqlanishi mumkin bo'lgan operatsiyalar to'plami: fayllar, kataloglar, printerlar, xotira bo'limlari va boshqalar. Ruxsatlar o'z maqsadiga ko'ra fayllar va kataloglarga kirish huquqlariga mos keladi. QC UNIX da.

□ Huquqlar (foydalanuvchi huquqlari) - guruh tipidagi sub'ektlar uchun ba'zi tizim operatsiyalarini bajarish uchun belgilanadi: tizim vaqtini belgilash, fayllarni arxivlash, kompyuterni o'chirish va hokazo. Bu operatsiyalar maxsus kirish ob'ektini - butun operatsion tizimni o'z ichiga oladi. .

Bir o'rnatilgan foydalanuvchilar guruhini boshqasidan ajratib turadigan, birinchi navbatda, ruxsatlar emas, balki huquqlardir. O'rnatilgan guruhning ba'zi huquqlari ham o'rnatilgan - ularni ushbu guruhdan olib tashlab bo'lmaydi. O'rnatilgan guruhning qolgan huquqlari olib tashlanishi (yoki umumiy huquqlar ro'yxatidan qo'shilishi) mumkin.

□ Foydalanuvchining qobiliyatlari individual foydalanuvchilar uchun o'zlarining operatsion muhitini shakllantirish bilan bog'liq harakatlarni bajarish uchun belgilanadi, masalan, dasturning asosiy menyusi tarkibini o'zgartirish, "Ishga tushirish" menyusi bandidan foydalanish va boshqalar. Imkoniyatlar to'plamini qisqartirish orqali ( foydalanuvchi uchun sukut bo'yicha mavjud bo'lgan), administrator foydalanuvchini administrator eng mos deb hisoblagan va foydalanuvchini mumkin bo'lgan xatolardan himoya qiladigan operatsion muhit bilan ishlashga majbur qilishi mumkin.

Guruhga berilgan huquqlar va ruxsatlar uning a'zolariga avtomatik ravishda beriladi, bu esa administratorga ko'p sonli foydalanuvchilarni hisob ma'lumotlari birligi sifatida ko'rib chiqish va ularning harakatlarini minimallashtirish imkonini beradi.

Foydalanuvchi tizimga kirganda, u uchun foydalanuvchi identifikatori va foydalanuvchi tegishli bo'lgan barcha guruhlarning identifikatorlarini o'z ichiga olgan kirish tokeni yaratiladi. Token shuningdek quyidagilarni o'z ichiga oladi: ruxsatlardan iborat bo'lgan va jarayon tomonidan yaratilgan ob'ektlarga qo'llaniladigan standart kirishni boshqarish ro'yxati (ACL); tizim harakatlarini bajarish uchun foydalanuvchi huquqlari ro'yxati.

Barcha ob'ektlar, jumladan, fayllar, oqimlar, hodisalar, hatto kirish tokenlari ham yaratilganda xavfsizlik identifikatori bilan ta'minlanadi. Xavfsizlik deskriptorida kirishni boshqarish ro'yxati mavjud - ACL.

Fayl deskriptori jarayon tomonidan ochilgan faylga OT tomonidan tayinlangan manfiy bo'lmagan butun sondir.

ACL(inglizcha) Kirish nazorati ro'yxati- kirishni boshqarish ro'yxati, ingliz tilida "ekl" deb talaffuz qilinadi) - ma'lum bir ob'ektga kim yoki nima kirishi mumkinligini va ushbu sub'ektga ob'ektda qanday operatsiyalarni bajarishga ruxsat etilgan yoki taqiqlanganligini aniqlaydi.

Kirishni boshqarish ro'yxatlari selektiv kirishni boshqarish tizimlarining asosidir. ( Wiki)

Ob'ekt egasi, odatda uni yaratgan foydalanuvchi, ob'ektga kirishni tanlab boshqarish huquqiga ega va ob'ektning ACL ni boshqalarga ob'ektga kirishiga ruxsat berish yoki ruxsat bermaslik uchun o'zgartirishi mumkin. Windows NT o'rnatilgan administratori, UNIX superuseridan farqli o'laroq, ob'ektga kirish uchun ba'zi ruxsatlarga ega bo'lmasligi mumkin. Ushbu xususiyatni amalga oshirish uchun administrator identifikatorlari va administrator guruhi identifikatorlari oddiy foydalanuvchi identifikatorlari kabi ACLga kiritilishi mumkin. Biroq, administrator har qanday ob'ekt bilan har qanday operatsiyalarni bajarish qobiliyatiga ega, chunki u har doim ob'ektning egasi bo'lishi mumkin, keyin esa egasi sifatida ruxsatlarning to'liq to'plamini olishi mumkin. Biroq, administrator ob'ektning oldingi egasiga egalik huquqini qaytara olmaydi, shuning uchun foydalanuvchi har doim administrator o'z fayli yoki printeri bilan ishlaganligini bilib olishi mumkin.

Jarayon Windows NT da ob'ektga kirish uchun operatsiyani talab qilganda, boshqaruv doimo xavfsizlik monitoriga o'tadi, u kirish tokenidagi foydalanuvchi va foydalanuvchilar guruhi identifikatorlarini ob'ektning ACL elementlarida saqlangan identifikatorlar bilan solishtiradi. UNIX dan farqli o'laroq, Windows NT ning ACL elementlari ruxsat etilgan operatsiyalar ro'yxatini ham, foydalanuvchi uchun taqiqlangan operatsiyalar ro'yxatini ham o'z ichiga olishi mumkin.

Windows NT yangi yaratilgan ob'ektga ACL tayinlash qoidalarini aniq belgilaydi. Agar qo'ng'iroq qiluvchi kod ob'ektni yaratishda yangi yaratilgan ob'ektga barcha kirish huquqlarini aniq belgilab qo'ysa, xavfsizlik tizimi ushbu ACLni ob'ektga belgilaydi.

Agar chaqiruv kodi ob'ektni ACL bilan ta'minlamasa, lekin ob'ekt nomiga ega bo'lsa, u holda ruxsatni meros qilib olish printsipi qo'llaniladi. Xavfsizlik tizimi yangi ob'ekt nomi saqlanadigan ob'ekt katalogining ACL ga qaraydi. Ob'ekt katalogining ba'zi ACL yozuvlari meros qilib olingan deb belgilanishi mumkin. Bu shuni anglatadiki, ular ushbu katalogda yaratilgan yangi ob'ektlarga tayinlanishi mumkin.

Agar jarayon yaratilayotgan ob'ekt uchun ACL ni aniq o'rnatmagan bo'lsa va katalog ob'ektida meros qilib olingan ACL elementlari bo'lmasa, jarayonning kirish tokenidagi standart ACL ishlatiladi.


29. Java dasturlash tili. Java virtual mashinasi. Java texnologiyasi.

Java Sun Microsystems tomonidan ishlab chiqilgan ob'ektga yo'naltirilgan dasturlash tilidir. Java ilovalari odatda maxsus bayt-kodga kompilyatsiya qilinadi, shuning uchun ular kompyuter arxitekturasidan qat'iy nazar har qanday Java virtual mashinasida (JVM) ishlashi mumkin. Java dasturlari Java virtual mashinasi tomonidan bajariladigan bayt-kodga tarjima qilinadi ( JVM) - bayt kodini qayta ishlaydigan va ko'rsatmalarni tarjimon sifatida uskunaga uzatuvchi dastur, ammo farqi bilan bayt kodlari matndan farqli o'laroq, tezroq qayta ishlanadi.

Dasturlarni bajarishning bunday usulining afzalligi bayt-kodning operatsion tizim va apparat ta'minotidan to'liq mustaqilligi bo'lib, u Java dasturlarini mos keladigan virtual mashina mavjud bo'lgan har qanday qurilmada ishga tushirish imkonini beradi. Java texnologiyasining yana bir muhim xususiyati bu moslashuvchan xavfsizlikdir dasturning bajarilishi virtual mashina tomonidan to'liq nazorat qilinadi. Dasturning belgilangan ruxsatlaridan oshib ketadigan har qanday operatsiya (masalan, ma'lumotlarga ruxsatsiz kirishga urinish yoki boshqa kompyuterga ulanish) darhol to'xtatilishiga olib keladi.

Ko'pincha virtual mashina kontseptsiyasining kamchiliklari orasida virtual mashina tomonidan bayt-kodning bajarilishi Java tilida amalga oshirilgan dasturlar va algoritmlarning ishlashini kamaytirishi mumkin.

Java virtual mashinasi(qisqartirilgan Java VM, JVM) - Java virtual mashinasi - Java Runtime Environment (JRE) deb ataladigan Java ish vaqti tizimining asosiy qismi. Java virtual mashinasi Java kompilyatori (javac) tomonidan Java dasturining manba kodidan avval yaratilgan Java baytekodini sharhlaydi va bajaradi. JVM dan boshqa dasturlash tillarida yozilgan dasturlarni bajarish uchun ham foydalanish mumkin. Masalan, Ada manba kodi Java baytekodiga kompilyatsiya qilinishi mumkin, keyin esa JVM tomonidan bajarilishi mumkin.

JVM Java platformasining asosiy komponentidir. Java virtual mashinalari ko'plab apparat va dasturiy platformalar uchun mavjud bo'lganligi sababli, Java ham o'rta dastur, ham mustaqil platforma sifatida ko'rib chiqilishi mumkin, shuning uchun "bir marta yozing, istalgan joyda ishga tushiring" tamoyili. Ko'pgina platformalar uchun bitta bayt kodidan foydalanish Java-ni "bir marta kompilyatsiya qiling, istalgan joyda ishga tushiring" (bir marta kompilyatsiya qiling, istalgan joyda ishga tushiring) deb ta'riflash imkonini beradi.

Ish vaqti

JVM da ishlash uchun mo'ljallangan dasturlar standartlashtirilgan portativ ikkilik formatda kompilyatsiya qilinishi kerak, bu odatda .class fayllari sifatida taqdim etiladi. Dastur turli fayllarga joylashtirilgan ko'plab sinflardan iborat bo'lishi mumkin. Katta dasturlarni joylashtirishni osonlashtirish uchun ba'zi .class fayllari .jar deb ataladigan faylga (Java Arxiv uchun qisqartma) to'planishi mumkin.

JVM .class yoki .jar fayllarini bajaradi, JVM uchun yozilgan ko'rsatmalarni talqin qilish yoki Sun microsystems'dan HotSpot kabi bir vaqtning o'zida (JIT) kompilyatoridan foydalanish orqali taqlid qiladi. Hozirgi kunda JIT kompilyatsiyasi ko'pchilik JVM-larda yuqori tezlikka erishish uchun qo'llaniladi.

Ko'pgina virtual mashinalar singari, Java virtual mashinasi ham mikrokontrollerlar va mikroprotsessorlar uchun umumiy bo'lgan stekga yo'naltirilgan arxitekturaga ega.

JRE (Java Runtime Environment) ning namunasi bo'lgan JVM Java dasturlarini bajarishda ishga tushadi. Bajarish tugagandan so'ng, ushbu misol axlat yig'uvchi tomonidan olib tashlanadi. JIT Java virtual mashinasining bir qismi bo'lib, ilovalarni bajarish vaqtini tezlashtirish uchun ishlatiladi. JIT bir vaqtning o'zida o'xshash funksiyalarga ega bo'lgan bayt-kod qismlarini kompilyatsiya qiladi va shuning uchun kompilyatsiya qilish vaqtini qisqartiradi.

j2se (java 2 standart nashri) - Standart kutubxona quyidagilarni o'z ichiga oladi:

GUI, NET, ma'lumotlar bazasi…


30. .NET platformasi. Asosiy g'oyalar va qoidalar. .NET dasturlash tillari.

.NET Framework- an'anaviy dasturlar va veb-ilovalarni yaratish uchun mo'ljallangan Microsoft-dan dasturiy ta'minot texnologiyasi.

Microsoft .NET ning asosiy g'oyalaridan biri - turli tillarda yozilgan turli xizmatlarning mosligi. Masalan, Microsoft .NET uchun C++ da yozilgan xizmat Delphida yozilgan kutubxonadan sinf usuliga kirishi mumkin; C# da siz Visual Basic .NET da yozilgan sinfdan meros bo'ladigan sinfni yozishingiz mumkin va C# da yozilgan usul bilan chiqarilgan istisno Delphida ushlanib, ishlov berilishi mumkin. .NET-dagi har bir kutubxonada (montajda) o'z versiyasi haqida ma'lumot mavjud bo'lib, bu yig'ilishlarning turli versiyalari o'rtasida yuzaga kelishi mumkin bo'lgan ziddiyatlarni bartaraf etish imkonini beradi.

Ilovalar matn muharririda ham ishlab chiqilishi va konsol kompilyatoridan foydalanishi mumkin.

Java texnologiyasi singari, .NET ishlab chiqish muhiti virtual mashina tomonidan bajarilishi uchun bayt kodini yaratadi. Ushbu mashinaning .NET da kiritish tili MSIL (Microsoft Intermediate Language) yoki CIL (Common Intermediate Language, keyinchalik) yoki oddiygina IL deb ataladi.

Bayt-koddan foydalanish kompilyatsiya qilingan loyiha darajasida kross-platformani olish imkonini beradi (.NET shartlarida: yig'ilish), va faqat manba darajasida emas, masalan, C da. CLR ish vaqtida yig'ishni boshlashdan oldin, bayt-kod muhitga o'rnatilgan JIT kompilyatori tomonidan o'zgartiriladi (o'z vaqtida, tezda kompilyatsiya) maqsadli protsessorning mashina kodlari. .NET Framework bilan ta'minlangan NGen.exe yordam dasturidan foydalanib, tanlangan platforma uchun mahalliy kodga yig'ilishni kompilyatsiya qilish ham mumkin.

Tarjima jarayonida dasturning manba kodi (SML, C #, Visual Basic, C ++ yoki .NET tomonidan qo'llab-quvvatlanadigan boshqa dasturlash tilida yozilgan) kompilyator tomonidan yig'ilish deb ataladigan narsaga aylantiriladi ( assembly) va dinamik bog'langan kutubxona fayli (Dynamically Linked Library, DLL) yoki bajariladigan fayl (Executable, EXE) sifatida saqlanadi.

Tabiiyki, har bir kompilyator uchun (u C# tili kompilyatori, csc.exe yoki Visual Basic, vbc.exe bo'ladimi), ish vaqti muhiti CTS turlari uchun ishlatiladigan turlarning zaruriy xaritasini va dastur kodini dastur kodini amalga oshiradi. "mavhum mashina" .NET - MSIL (Microsoft Intermediate Language).

Natijada, dasturiy ta'minot loyihasi montaj sifatida shakllanadi - joylashtirish, takrorlash va qayta foydalanish uchun o'zini o'zi etarli komponent. Assambleya muallifning raqamli imzosi va noyob versiya raqami bilan aniqlanadi.

O'rnatilgan dasturlash tillari (.NET Framework bilan ta'minlangan):

C#; J#; VB.NET JScript .NET C++/CLI - C++ ning yangi versiyasi (boshqariladigan).


31. OTning funksional komponentlari. Fayl boshqaruvi

Funktsional OS komponentlari:

Mustaqil kompyuterning operatsion tizimining funktsiyalari odatda OT boshqaradigan mahalliy resurslar turlariga yoki barcha resurslarga tegishli bo'lgan maxsus vazifalarga ko'ra guruhlanadi. Ba'zan bunday funktsiyalar guruhlari quyi tizimlar deb ataladi. Resurslarni boshqarishning eng muhim quyi tizimlari jarayon, xotira, fayl va tashqi qurilmalarni boshqarish quyi tizimlari, barcha resurslar uchun umumiy bo‘lgan quyi tizimlar esa foydalanuvchi interfeysi, ma’lumotlarni himoya qilish va boshqaruv quyi tizimlari hisoblanadi.

Fayl boshqaruvi:

OT ning haqiqiy apparatning murakkabliklarini "qalqon" qilish qobiliyati OT ning asosiy quyi tizimlaridan biri - fayl tizimida juda aniq namoyon bo'ladi.

Fayl tizimi bir tomondan saqlash muhitini, ikkinchi tomondan fayllarga kirish uchun API (Ilova dasturlash interfeysi) ni ulaydi. Amaliy dastur faylga kirganda, ma'lumot ma'lum bir faylda qanday joylashganligi, shuningdek, u qanday jismoniy turdagi tashuvchilarda (CD, qattiq disk, magnit lenta yoki flesh-xotira bloki) yozilganligi haqida hech qanday tasavvurga ega emas. Dastur faqat fayl nomini, uning hajmi va atributlarini biladi. U ushbu ma'lumotlarni fayl tizimi drayveridan oladi. Bu faylning jismoniy muhitda (masalan, qattiq diskda) qayerda va qanday yozilishini aniqlaydigan fayl tizimi.

Operatsion tizim nuqtai nazaridan butun disk 512 bayt va undan yuqori bo'lgan klasterlar to'plamidir. Fayl tizimi drayverlari klasterlarni fayllar va kataloglarga (aslida ushbu katalogdagi fayllar ro'yxatini o'z ichiga olgan fayllar) tashkil qiladi. Xuddi shu drayverlar qaysi klasterlar hozirda foydalanilayotgani, qaysilari bepul va qaysi biri muvaffaqiyatsiz deb belgilanganligini kuzatib boradi.

Biroq, fayl tizimi jismoniy saqlash muhiti bilan bevosita bog'lanishi shart emas. Virtual fayl tizimlari, shuningdek, tarmoq fayl tizimlari mavjud bo'lib, ular faqat masofaviy kompyuterdagi fayllarga kirishning bir usuli hisoblanadi.

Eng oddiy holatda, berilgan diskdagi barcha fayllar bitta katalogda saqlanadi. Ushbu bir darajali sxema CP/M da va MS-DOS 1.0 ning birinchi versiyasida ishlatilgan. Ichki kataloglarga ega ierarxik fayl tizimi dastlab Multics da, keyin UNIX da paydo bo'ldi.

Turli disklardagi kataloglar DOS/Windows da bo'lgani kabi bir nechta alohida daraxtlarni tashkil qilishi yoki UNIX-ga o'xshash tizimlardagi kabi barcha disklar uchun umumiy bo'lgan bitta daraxtga birlashtirilishi mumkin.

Aslida, DOS / Windows tizimlarida, shuningdek, UNIX-ga o'xshash tizimlarda "c:", "d:" va hokazo nomli ichki kataloglari bo'lgan bitta asosiy katalog mavjud. Ushbu kataloglarga qattiq disk bo'limlari o'rnatilgan. Ya'ni, c:\ faqat faylga havola: ///c:/. Biroq, UNIX-ga o'xshash fayl tizimlaridan farqli o'laroq, Windows asosiy katalogga yozishni, shuningdek uning mazmunini ko'rishni taqiqlaydi.

UNIX da faqat bitta asosiy katalog mavjud va boshqa barcha fayllar va kataloglar unda joylashgan. Diskdagi fayllar va kataloglarga kirish uchun ushbu drayverni mount buyrug'i bilan ulashingiz kerak. Masalan, CD dagi fayllarni ochish uchun, oddiy qilib aytganda, operatsion tizimga aytish kerak: "Fayl tizimini ushbu kompakt diskda oling va uni /mnt/cdrom katalogida ko'rsating." Kompakt diskdagi barcha fayllar va kataloglar ushbu /mnt/cdrom katalogida paydo bo'ladi, u o'rnatish nuqtasi deb ataladi. Ko'pgina UNIX-ga o'xshash tizimlarda olinadigan disklar (floppilar va kompakt disklar), flesh-disklar va boshqa tashqi xotira qurilmalari /mnt, /mount yoki /media katalogiga o'rnatilgan. Unix va UNIX-ga o'xshash operatsion tizimlar, shuningdek, operatsion tizim yuklanganda disklarni avtomatik ravishda o'rnatishga imkon beradi.

Windows, UNIX va UNIX-ga o'xshash operatsion tizimlarda qiya chiziqdan foydalanishga e'tibor bering (Windows "\" teskari chiziqdan foydalanadi, UNIX va UNIX-ga o'xshash operatsion tizimlar esa oddiy slash "/" dan foydalanadi)

Bundan tashqari, shuni ta'kidlash kerakki, yuqoridagi tizim nafaqat jismoniy qurilmalarning fayl tizimlarini, balki alohida kataloglarni (--bind parametri) yoki, masalan, ISO tasvirini (loop varianti) o'rnatishga imkon beradi. FUSE kabi qo'shimchalar, masalan, FTP-ga butun katalogni va juda ko'p turli xil resurslarni o'rnatishga imkon beradi.

Bundan ham murakkab tuzilma NTFS va HFS da qo'llaniladi. Ushbu fayl tizimlarida har bir fayl atributlar to'plamidir. Atributlar nafaqat an'anaviy faqat o'qish uchun mo'ljallangan tizim, balki fayl nomi, hajmi va hatto mazmuni ham hisoblanadi. Shunday qilib, NTFS va HFS uchun faylda saqlanadigan narsa uning atributlaridan biridir.

Ushbu mantiqdan kelib chiqqan holda, bitta faylda bir nechta kontent o'zgarishlari bo'lishi mumkin. Shunday qilib, bitta hujjatning bir nechta versiyalari bir faylda, shuningdek qo'shimcha ma'lumotlar (fayl belgisi, fayl bilan bog'langan dastur) saqlanishi mumkin. Ushbu tashkilot Makintoshdagi HFSga xosdir.


32. OTning funksional komponentlari. Jarayonni boshqarish.

Jarayonni boshqarish:

Kompyuterning ishlashiga bevosita ta'sir ko'rsatadigan operatsion tizimning eng muhim qismi jarayonni boshqarish quyi tizimidir. Jarayon (yoki boshqacha aytganda, vazifa) ishlaydigan dasturni tavsiflovchi abstraksiyadir. Operatsion tizim uchun jarayon ish birligi, tizim resurslarini iste'mol qilish so'rovidir.

Ko'p vazifali (ko'p jarayonli) tizimda jarayon uchta asosiy holatdan birida bo'lishi mumkin:

RUNNING - jarayonning faol holati, bu jarayon davomida barcha zarur resurslar mavjud va bevosita protsessor tomonidan amalga oshiriladi;

KUTISH - jarayonning passiv holati, jarayon bloklangan, uni o'zining ichki sabablariga ko'ra bajarib bo'lmaydi, u qandaydir hodisa ro'y berishini kutmoqda, masalan, kiritish-chiqarish operatsiyasining tugashi, boshqasidan xabar olish jarayon, o'ziga kerak bo'lgan ba'zi resursni chiqarish;

TAYYOR - jarayonning ham passiv holati, lekin bu holda jarayon unga tashqi holatlar tufayli bloklanadi: jarayonda buning uchun zarur bo'lgan barcha resurslar mavjud, u ishga tayyor, lekin protsessor boshqa jarayonni bajarish bilan band.

Hayotiy tsikl davomida har bir jarayon ushbu operatsion tizimda amalga oshirilgan jarayonni rejalashtirish algoritmiga muvofiq bir holatdan ikkinchi holatga o'tadi.

CP/M standarti

Mikrokompyuterlar uchun operatsion tizimlarni yaratishning boshlanishi OS SR / M tomonidan qo'yilgan. U 1974 yilda ishlab chiqilgan, shundan so'ng u ko'plab 8 bitli mashinalarga o'rnatildi. Ushbu operatsion tizim doirasida katta hajmdagi dasturiy ta'minot, jumladan, BASIC, Paskal, C, Fortran, Cobol, Lisp, Ada va boshqa ko'plab matn tarjimonlari yaratildi. Ular hujjatlarni yozuv mashinkasidan ko'ra tezroq va qulayroq tayyorlashga imkon beradi.

MSX standarti

Ushbu standart nafaqat operatsion tizimni, balki maktab shaxsiy kompyuterlari uchun texnik vositalarning xususiyatlarini ham aniqladi. MSX standartiga ko'ra, mashinada kamida 16 K operativ xotira, o'rnatilgan BASIC tili tarjimoni bilan 32 K doimiy xotira, 256x192 pikselli rangli grafik displey va 16 rang, uch kanalli bo'lishi kerak edi. 8 oktava uchun ovoz generatori, printerni ulash uchun parallel port va tashqi ulangan tashqi drayverni boshqarish uchun kontroller.

Bunday mashinaning operatsion tizimi quyidagi xususiyatlarga ega bo'lishi kerak: talab qilinadigan xotira - 16 K dan oshmasligi, tizim chaqiruvlari darajasida CP / M bilan mosligi, floppi disklarga asoslangan tashqi disklardagi fayl formatlari bo'yicha DOS bilan mosligi, BASIC, C, Fortran va Lisp tarjimonlarini qo'llab-quvvatlash.

Pi - tizimi

Shaxsiy kompyuterlar rivojlanishining dastlabki davrida USCD p-tizimi operatsion tizimi yaratildi. Ushbu tizimning asosi P-mashina deb nomlangan - faraziy universal kompyuterga taqlid qiluvchi dastur edi. P-mashina P-kod deb nomlangan maxsus ko'rsatmalarni bajarish orqali protsessor, xotira va tashqi qurilmalarning ishlashini simulyatsiya qiladi. Pi-tizimning dasturiy komponentlari (shu jumladan kompilyatorlar) P-kodda, amaliy dasturlar ham P-kodda kompilyatsiya qilinadi. Shunday qilib, tizimning asosiy farqlovchi xususiyati shaxsiy kompyuter uskunasining xususiyatlariga minimal bog'liqlik edi. Bu Pi-tizimning har xil turdagi mashinalarga ko'chmaligini ta'minlagan narsa. P-kodning ixchamligi va qulay amalga oshirilgan peyjing mexanizmi kichik operativ xotiraga ega kompyuterda nisbatan katta dasturlarni bajarish imkonini berdi.

I/U boshqaruvi.

I/U qurilmalari ikki turga bo'linadi: blokga yo'naltirilgan qurilmalar va baytga yo'naltirilgan qurilmalar. Blokka yo'naltirilgan qurilmalar ma'lumotni har biri o'z manziliga ega bo'lgan qat'iy o'lchamli bloklarda saqlaydi. Eng keng tarqalgan blok yo'naltirilgan qurilma diskdir. Baytga yo'naltirilgan qurilmalar manzilli emas va qidiruv operatsiyasiga ruxsat bermaydi, ular baytlar ketma-ketligini hosil qiladi yoki iste'mol qiladi. Masalan, terminallar, chiziqli printerlar, tarmoq adapterlari. Elektron komponent qurilma boshqaruvchisi yoki adapter deb ataladi. Operatsion tizim boshqaruvchi bilan shug'ullanadi. Tekshirish moslamasi oddiy funktsiyalarni bajaradi, xatolarni nazorat qiladi va tuzatadi. Har bir kontroller markaziy protsessor bilan o'zaro aloqada bo'lish uchun ishlatiladigan bir nechta registrlarga ega. OT boshqaruvchi registrlarga buyruqlar yozish orqali kiritish-chiqarishni amalga oshiradi. IBM PC disket boshqaruvchisi READ, WRITE, SEEK, FORMAT va boshqalar kabi 15 ta buyruqni qabul qiladi. Buyruq qabul qilinganda protsessor kontrollerni tark etadi va boshqa ishlarni bajaradi. Buyruq tugagach, boshqaruvchi protsessorni boshqarishni operatsion tizimga o'tkazish uchun uzilishni tashkil qiladi, bu operatsiya natijalarini tekshirishi kerak. Protsessor qurilmaning natijalari va holatini tekshirgich registrlaridagi ma'lumotlarni o'qish orqali oladi.

Asosiy fikr I/U dasturiy ta'minotini tashkil etish uni bir necha darajalarga bo'lishdan iborat bo'lib, quyi darajalar apparat xususiyatlarini yuqoridan himoya qilishni ta'minlaydi va foydalanuvchilar uchun qulay interfeysni ta'minlaydi.

kalit tamoyilidir qurilma mustaqilligi. Dasturning shakli floppi diskdan yoki qattiq diskdan ma'lumotlarni o'qishiga bog'liq bo'lmasligi kerak. Kiritish-chiqarish dasturiy ta'minoti uchun yana bir muhim masala - xatolarni qayta ishlash. Umuman olganda, xatolar iloji boricha apparatga yaqinroq bo'lishi kerak. Agar tekshirgich o'qish xatosini aniqlasa, uni tuzatishga harakat qilishi kerak. Agar u muvaffaqiyatsiz bo'lsa, qurilma drayveri xatolarni tuzatishi kerak. Va faqat quyi daraja xatoni bartaraf eta olmasa, u xato haqida yuqori darajaga xabar beradi.

Yana bir asosiy masala - blokirovka qiluvchi (sinxron) va bloklanmaydigan (asinxron) uzatishlardan foydalanish. Ko'pgina jismoniy kiritish-chiqarish operatsiyalari asinxrondir - protsessor uzatishni boshlaydi va uzilish sodir bo'lguncha boshqa ishga o'tadi. I/U operatsiyalari blokirovka qilinishi kerak - READ buyrug'idan so'ng, ma'lumotlar dastur buferiga kirgunga qadar dastur avtomatik ravishda to'xtatiladi.

Oxirgi muammo shundaki, ba'zi qurilmalar umumiy (disklar: bir vaqtning o'zida bir nechta foydalanuvchining diskka kirishi muammo emas), boshqalari esa ajratilgan (printerlar: turli foydalanuvchilar tomonidan chop etilgan chiziqlarni aralashtira olmaysiz).

Qo'yilgan muammolarni hal qilish uchun kiritish-chiqarish dasturini to'rtta qatlamga bo'lish tavsiya etiladi (2.30-rasm):

Ishni to'xtatib turish,

qurilma drayverlari,

Operatsion tizimning qurilmadan mustaqil qatlami,

· Maxsus dasturiy ta'minot qatlami.

Texnik uzilish tushunchasi va uni qayta ishlash.

Asinxron yoki tashqi (apparat) uzilishlar - tashqi manbalardan (masalan, periferik qurilmalar) kelib chiqadigan va har qanday o'zboshimchalik bilan sodir bo'lishi mumkin bo'lgan hodisalar: taymerdan, tarmoq kartasidan yoki diskdan signal, klaviatura tugmachalarini bosish, sichqonchani harakatlantirish; Ular tezkor javobni (qayta ishlashni) talab qiladi.

Kompyuterdagi deyarli barcha kiritish-chiqarish tizimlari uzilishlar yordamida ishlaydi. Xususan, tugmachalarni bosganingizda yoki sichqonchani bosganingizda, apparat uzilishlar hosil qiladi. Ularga javoban tizim mos ravishda bosilgan tugma kodini o'qiydi yoki sichqoncha kursorining koordinatalarini eslab qoladi. Uzilishlar disk boshqaruvchisi, LAN adapteri, ketma-ket portlar, audio adapter va boshqa qurilmalar tomonidan hosil qilinadi.