Bog'liq PARALLEL HISOBLASHNING ASOSIY TUSHUNCHALARI
5. PARALLEL HISOBLASHDA KO'P TABLILIKDAN FOYDALANISH 5.1. Threading qanday ishlaydi Net-da multithreading, CLR odatda operatsion tizimga o'tadigan xususiyat bo'lgan ish jadvali tomonidan boshqariladi. Tarmoq rejalashtiruvchisi barcha faol ish zarrachalariga tegishli bajarish vaqti ajratilishini ta'minlaydi va kutilayotgan yoki bloklangan iplar CPU vaqtini sarflamaydi. Yagona protsessorli kompyuterda ipni rejalashtiruvchi vaqtni taqsimlashni amalga oshiradi - har bir faol oqim o'rtasida tez almashish. Ko'p protsessorli kompyuterda ko'p ish zarralari vaqtni almashish va haqiqiy parallelizm aralashmasi bilan amalga oshiriladi, bu erda turli xil iplar bir vaqtning o'zida turli protsessorlarda kod ishlaydi. Vaqtni kesish kabi tashqi omillar ta'sirida uning bajarilishi to'xtatilsa, ip oldindan o'rnatilgan deyiladi. Aksariyat hollarda oqimning o'zi qachon va qayerda yuklanishini nazorat qila olmaydi. Tarmoq dasturni ishga tushiradigan operatsion tizim jarayoniga o'xshaydi. Kompyuterda jarayonlar parallel ravishda bajarilgani kabi, iplar ham bitta jarayon ichida parallel ishlaydi. Jarayonlar bir-biridan butunlay ajratilgan; oqimlar cheklangan darajadagi izolyatsiyaga ega. Xususan, ish zarrachalari bir xil ilovada ishlaydigan boshqa ish zarrachalari bilan xotirani almashadilar. Ko'p ish zarralarining eng keng tarqalgan qo'llanilishi: 1. Moslashuvchan foydalanuvchi interfeysini qo'llab-quvvatlash. Parallel ipda ko'p vaqt talab qiladigan vazifalarni bajarayotganda, asosiy UI ipi klaviatura va sichqoncha hodisalarini qayta ishlashni davom ettirishi mumkin. 2. Qulflangan protsessordan samarali foydalanish. Ko'p ish zarrachasi boshqa kompyuter yoki apparat qismidan javob kutayotganda foydali bo'ladi. Vazifa bajarilayotganda bitta ip bloklangan bo'lsa, boshqa ish zarrachalari boshqa boshqarilmaydigan kompyuterdan foydalanishi mumkin.
3. Parallel dasturlash. Intensiv hisob-kitoblarni amalga oshiradigan kod, agar ish yuki bir nechta oqimlar bo'ylab taqsimlangan bo'lsa, ko'p yadroli yoki ko'p protsessorli kompyuterlarda tezroq ishlashi mumkin. 4. So'rovlarni bir vaqtda qayta ishlash. Serverda mijoz so'rovlari bir vaqtning o'zida kelishi mumkin, shuning uchun ularni parallel ravishda qayta ishlash kerak. Multithreading, shuningdek, rejalashtirish va mavzuni almashtirishda resurs va protsessorga qo'shimcha xarajatlarni talab qiladi. Multithreading har doim ham dasturni tezlashtiravermaydi - agar noto'g'ri ishlatilsa, u hatto sizni sekinlashtirishi mumkin. 5.2. Tarmoqlarni yaratish va ishga tushirish. Ma'lumotlarni oqimga uzatish. Mavzular Thread sinfining konstruktori yordamida yaratiladi, ThreadStart-ga delegat uzatiladi, bu esa bajarilishini qaerdan boshlash kerakligini ko'rsatadi. ThreadStart delegati shunday aniqlanadi: umumiy delegat void ThreadStart(); Ipning bajarilishi uning usuli bajarilgunga qadar davom etadi va shu nuqtada ip tugaydi. Quyida TheadStart delegatini yaratish uchun kengaytirilgan C# sintaksisidan foydalanish misoli keltirilgan: class ThreadTest
{
static void Main()
{
Thread thread1 = new Thread(new ThreadStart(Go));
thread1.Start();
Go();
}
static void Go()
{
Console.WriteLine("hello!");57
}
}
Ushbu misolda thread1 Go() usulini bajarmoqda va shu bilan birga bu usul asosiy ipda ham bajarilmoqda. Natijada bir lahzaga yaqin ikkita salom chiqishi.
Ushbu misolda thread1 Go() usulini bajarmoqda va shu bilan birga bu usul asosiy ipda bajarilmoqda. Natijada bir lahzaga yaqin ikkita salom chiqishi. Argumentlarni ipning maqsadli usuliga o'tkazishning eng oson yo'li bu usulni kerakli argumentlar bilan chaqiradigan lambda ifodasini bajarishdir: class Program.
{
static void Main()
{
Thread thread1 = new Thread(() => Print("Hello from thread1!"));
thread1.Start();
}
static void Print(string message)
{
Console.WriteLine(message);
}
}
Yana bir usul - argumentni ThreadStart usuliga o'tkazish: sinf dasturi
{
static void Main()
{
Thread thread1 = new Thread(Print);
thread1.Start("Hello from thread1!");
}
static void Print(object messageObj)58
{
string message = (string)messageObj;
Console.WriteLine(message);
}
}
Bu ikkita delegatdan birini qabul qilish uchun Thread konstruktori haddan tashqari yuklanganligi sababli ishlaydi: umumiy delegat void ThreadStart(); ommaviy delegat void ParameterizedThreadStart (ob'ekt obj ); ParameterizedThreadStart ning cheklovi shundaki, u faqat bitta argumentni oladi