|
Bajarilishi kerak bo'lgan vazifa
|
bet | 39/64 | Sana | 13.05.2024 | Hajmi | 183,36 Kb. | | #230077 |
Bog'liq Системное программирование, практикаBajarilishi kerak bo'lgan vazifa:
Yuklab olish menejerini fonda ishlagan holda, foydalanuvchining Internetda kezishiga katta xalaqit bermasligi uchun amalga oshiring (har bir vazifa, bu holda ma'lum bir faylni yuklab olish, alohida mavzu tomonidan bajarilishi kerak. Trafik chegarasi jami bo'lishi kerak. barcha mavzular).
Amalga oshirish tartibi:
Biz ma'lum vaqt oralig'ida barcha iplar rozetkalaridan ma'lum miqdordagi baytdan ko'p o'qimasligini ta'minlashimiz kerak. Ushbu chegarani oqimlar o'rtasida teng taqsimlash samarasiz bo'ladi, chunki fayllarni yuklab olish juda notekis bo'lishi mumkin, biri tez, ikkinchisi sekin yuklab olinadi. Shuning uchun bizga barcha mavzular uchun umumiy hisoblagich kerak, qancha bayt o'qilgan va yana qancha o'qilishi mumkin.
Sinxronizatsiya tizimini maxsus sinfga kiriting. Mana uning interfeysi:
sinf CQuota {
ommaviy: // usullari
bekor o'rnatish( imzosiz int _nKvota );
imzosiz int so'rov( imzosiz int _nBytesToRead, HANDLE_hStopEvent );
bekor Chiqarish( imzosiz int _nBytesRevert, HANDLE_hStopEvent );
...
};
Vaqti-vaqti bilan, sekundiga bir marta ayting, boshqaruv chizig'i yuklab olish kvotasi o'rnatgan holda Set usulini chaqiradi. Ishchi ip tarmoqdan olingan ma'lumotlarni o'qishdan oldin, u joriy kvotaning nolga teng emasligini tekshiradigan Request usulini chaqiradi va agar shunday bo'lsa, joriy kvota ichida o'qilishi mumkin bo'lgan baytlar sonini qaytaradi. Kvota mos ravishda bu raqamga kamayadi. Agar so'rov chaqirilganda kvota nolga teng bo'lsa, chaqiruvchi ip paydo bo'lguncha kutishi kerak. Ba'zan shunday bo'ladiki, aslida talab qilinganidan kamroq bayt olinadi, bu holda ip Release usuli yordamida unga ajratilgan kvotaning bir qismini qaytaradi. Va, men aytganimdek, foydalanuvchi istalgan vaqtda yuklab olishni to'xtatish buyrug'ini berishi mumkin. Bunday holda, kutish kvotasi mavjudligidan qat'i nazar, to'xtatilishi kerak. Buning uchun maxsus hodisa ishlatiladi: _hStopEvent. Vazifalarni bir-biridan mustaqil ravishda boshlash va to'xtatish mumkin bo'lganligi sababli, har bir ishchi ipning o'z to'xtash hodisasi mavjud. Uning dastagi Request va Release usullariga o'tkaziladi.
Muteks ob'ektidan foydalaning (bir vaqtning o'zida ikkitasi):
sinf CQuota {
...
shaxsiy: // ma'lumotlar
imzosiz int m_nQuota;
CEvent m_eventHasQuota;
CEvent m_eventNoQuota;
};
Bir vaqtning o'zida ushbu hodisalardan faqat bittasini o'rnatish mumkin. Kvotani boshqaradigan har qanday ish zarrachasi, agar qolgan kvota nolga teng bo'lmasa, birinchi hodisani va agar kvota tugagan bo'lsa, ikkinchi hodisani ko'tarishi kerak. Kvota olishni istagan mavzu birinchi voqeani kutishi kerak. Kvotani oshiruvchi ip faqat ushbu hodisalardan birini kutishi kerak, chunki ularning ikkalasi ham asl holatini tiklash holatida bo'lsa, bu boshqa ish zarrachasi hozirda kvota bilan ishlayotganligini bildiradi. Shunday qilib, ikkita hodisa bir vaqtning o'zida ikkita funktsiyani bajaradi: ma'lumotlarga kirishni sinxronlashtirish va kutish. Nihoyat, ip ikkita hodisadan birini kutayotganligi sababli, uni to'xtatish uchun signal beruvchi hodisa osongina kiritiladi.
|
| |