Algoritmlarni loyihalash. Maruzachi o’qituvchi: katta o’qituvchi Ganihodjayeva Dilfuza Ziyavutdinovna


Download 57.94 Kb.
Sana03.06.2020
Hajmi57.94 Kb.

Algoritmlarni loyihalash.

Maruzachi o’qituvchi: katta o’qituvchi Ganihodjayeva Dilfuza Ziyavutdinovna

9-Maruza: Ko'p oqimlli dasturlash.

Reja:


  1. Ko'rsatmalar oqimlari va ko'p oqimli dasturlash.

  2. Oqimlarni yaratish va boshqarish.

  3. Resurslarni almashish va qulflash.

  4. Oqimlar orasidagi o'zaro ta'sir.

Bir oqimli yondashuv muammolari.

  • Protsessor vaqtining vazifasi bo'yicha monopoliyali egallash



  • Mantiqan bog'liq bo'lmagan kod qismlarini aralashtirish



  • Ularni ajratishga urinish dasturda yangi tizimlarning paydo bo'lishiga va kodning murakkabligiga olib keladi.

K’op oqimli dasturlash.

Tarkibiy ravishda bajariladigan ko'rsatmalar oqimni tashkil qiladi

Oqimlar mustaqil ravishda ishlaydi

Oqimlar bir-biri bilan o'zaro ta'sir qilishi mumkin

Ko'p yadroli tizimda oqim faqat bitta yadroni egallaydi.

K’op oqimli архитектура

Agar bir nechta protsessorlar mavjud bo'lsa, nazariy jihatdan, ularning har biri alohida vazifaga ega bo'lishi mumkin. Bitta protsessorli kompyuter tizimi ishlatilsa nima qilish kerak?



Vaqtni taqsimlash (Квантование времени
(Time-Slicing))

Vaqt intervallarga bo'lingan (vaqt kesimlari)

Kvant davomida bitta oqim ko'rsatmasi qayta ishlanadi

Oqimni tanlash haqida qaror interval boshlanishidan oldin qabul qilinadi

Yuqori chastotali oqimlarni almashtirish.

Yutyqlari

Bir nechta ilovalarning bir vaqtning o'zida ishlashi

Bitta ilova bilan bir vaqtning o'zida bir nechta so'rovlarga xizmat ko'rsatish

Bir nechta qurilmadan kelgan ma'lumotlarni bir vaqtning o'zida qayta ishlash

Ishni yanada moslashuvchan boshqarish, vazifalarni sozlash qobiliyati

Ko'p oqimlilik xususiyatlari

Quyi masalalarn oson ajratish

Sekinroq ijro

Ishlatilgan resurslar bo'yicha vazifalarni taqsimlashda bajarilish tezligining oshishi

Ko'p yadroli tizimlarda ishlash samaradorligi

Ish vaqtidagi nedeterminizm.



Ilovalar sinfi Thread

Amaliy oqim mavzusi "Thread" klassining namunasi bilan ko'rsatilgan.

Bajarish oqimini yaratish uchun siz qilishingiz mumkin

Thread-ni meros qilib olgan sinfni yarating

run () usulini bekor qilmoq

Oqimni ishga tushirish uchun boshlang'ich sinf ob'ektida start () usulidan foydalaning.



Ilovalar sinfi(Thread )dan foydalanish.

Sinf tavsifi




public class <Имя класса> extends Thread {

public void run() {

// Действия, выполняемые потоком

}

}

Oqim boshlanishi




<Имя класса> t = new <Имя класса>();

t.start(); //именно start(), а не run() !!!


Thread bilan ishlashga doir misol

Sinf tavsifi



public class MyThread extends Thread {

public void run() {

long sum = 0;

for (int i = 0; i < 1000000; i++) {

sum += i;

}

System.out.println(sum);

}

}

Oqim boshlanishi



MyThread t = new MyThread();

t.start(); // 499999500000

Runnable interfeysi

Bitta usulni e'lon qiladi - void run ()

Ushbu turdagi ob'ekt oqim emas.

To'g'ridan-to'g'ri tasniflash usulidan foydalanib bo'lmaydi

Oqimning tanasini tavsiflovchi va "Thread" dan boshqa sinfdan meros qolgan sinfni yaratish qobiliyati

Siz oqim mavzusiga yo'naltirilgan ma'lumotni Thread klassining currentThread () statik usuli yordamida olishingiz mumkin.



Runnable interfeysidan foydalanish

Sinf tavsifi



public class <Имя класса> implements Runnable {

public void run() {

// Действия, выполняемые потоком

}

}

Oqim boshlanishi



Runnable r = new <Имя класса>();

Thread t = new Thread(r);

t.start();

Runnable bilan ishlashga namuna

Sinf tavsifi



public class MyRunnable implements Runnable {

public void run() {

long sum = 0;

for (int i = 0; i < 1000000; i++) {

sum += i;

}

System.out.println(sum);

}

}

Oqim boshlanishi



Thread t = new Thread(new MyRunnable());

t.start(); // 499999500000

Oqimni boshqarish

void start () oqimning bajarilishini boshlaydi

void stop () oqimning bajarilishini to'xtatadi

void suspend () oqimlarning bajarilishini to'xtatib turadi

void resume () oqimning bajarilishini davom ettiradi

void join () usuli ishga tushirilgan oqimning oxirigacha joriy oqimning bajarilishini to'xtatadi

statik bo'shliq uyqusi (uzun millis) kamida joriy millisekund uchun joriy oqimning bajarilishini to'xtatadi

statik void rentabellik () joriy ipning bajarilishini to'xtatib qo'yadi, boshqa oqimlarni bajarish qobiliyatini ta'minlaydi.



Guruh oqimlari (ThreadGroup)

Har bir oqim bir guruhda.

Oqim guruhlari daraxtni hosil qiladi, ildiz guruhi - ildiz

Oqim ota-onalar guruhiga kira olmaydi

Guruhning parametrlari va holatini o'zgartirish uning barcha oqimlariga ta'sir qiladi.

Oqim guruhlarini yaratish.

Guruhlarni yaratish

//ona guruhini ko’rsatmasdan

ThreadGroup group1 = new ThreadGroup("Group1");

//ona guruhini ko’rsatib



ThreadGroup group2 = new ThreadGroup(group1, "Group2");

Oqimni yaratish

//guruhni ko’rsatmasdan

MyThread t = new MyThread("Thread1");

// guruhini ko’rsatib



MyThread t = new MyThread(group2, "Thread2");

Oqim guruhidagi operatsiyalar

int activCount () oqimlar sonini qaytaradi

int enumerate (Thread [] ro'yxati) Aktiv oqimlarni massivga nusxalash

int activGroupCount () pastki guruhlar sonini hisoblashni qaytaradi

int enumerate (ThreadGroup [] ro'yxati) Aktiv kichik guruhlarni qatorga ko'chiradi

void interrupt () Guruhdagi barcha mavzularning bajarilishini to'xtatadi.



Oqim ustuvorliklari

Ustuvorlik - oqimning ahamiyatini miqdoriy o'lchov.

Tizimni tartibga solish tartibiga aniq ta'sir ko'rsatmaydi

Dasturning asosiy algoritmi oqimlarni ustuvorlashtirish sxemasiga bog'liq bo'lmasligi kerak

Ustuvor qiymatlarni belgilashda konstantalarni ishlatish tavsiya etiladi

O’zgarmaslar



static int MAX_PRIORITY
static int MIN_PRIORITY
static int NORM_PRIORITY

Oqim usullari



int getPriority()
void setPriority(int newPriority)

Guruh oqimlari usullari



int getMaxPriority()
void setMaxPriority(int priority)


public class MyThread extends Thread {

public void run() {

long sum = 0;

for (int i = 0; i < 1000000; i++) {

if (i % 1000 == 0) {System.out.println(getName() + ": " + i/1000);}

}

}

}

Thread t1 = new MyThread();

t1.setPriority(Thread.MIN_PRIORITY);

t1.start();

Thread t2 = new MyThread();

t2.setPriority(Thread.MAX_PRIORITY);

t2.start();

Thread-0: 0

Thread-1: 0

Thread-1: 1

Thread-0: 1

Thread-1: 2

Thread-0: 2

Thread-1: 3

Thread-0: 3

Thread-1: 4

Thread-0: 4

Thread-1: 5

Thread-0: 5

Thread-1: 6

Thread-0: 6

Thread-1: 7

Thread-0: 0

Thread-0: 1

Thread-1: 0

Thread-0: 2

Thread-1: 1

Thread-0: 3

Thread-1: 2

Thread-0: 4

Thread-1: 3

Thread-0: 5

Thread-1: 4

Thread-1: 5

Thread-1: 6

Thread-1: 7

Thread-1: 8

Demon oqimlari (Daemons)

Daemon oqimlari sizga asosiy ijro etaklariga xizmat qilish uchun kerak bo'lgan va ularsiz mavjud bo'lmaydigan fon jarayonlarini tasvirlashga imkon beradi

Guruhda hech qanday to'siqsiz oqimlar qolmasa, virtual mashina tomonidan yo'q qilinadi

void setDaemon (boolean yoqilgan) oqim ko'rinishini sozlaydi. Mavzu boshlanishidan oldin qo'ng'iroq.

boolean isDaemon () Oqim turini qaytaradi: true - demon, false – normal

Demon guruhi oqimlari

Uning oxirgi oqimi to'xtatilganda yoki oqimlarning oxirgi kichik guruhi yo'q qilinganida demon guruhi avtomatik ravishda yo'q qilinadi

void setDaemon (boolean yoq) Guruh ko'rinishini o'rnatadi

boolean isDaemon () guruh turini qaytaradi: true - demon, false – normal



Nazorat qilinmagan manbalarni ulashish

Dasturning aniqlanmaganligi Dasturning yakuniy natijasini oldindan aytib bo'lmaydi

Dasturning noto'g'ri ishlashi, algoritmning noto'g'ri ishlashi, favqulodda vaziyatlarning paydo bo'lishi.

public class Shared {

private int a = 0, b = 1;

public void one() { a = b; }

public void two() { b = a; }

...

}

public static void main(String[] args) {

final Shared object = new Shared();

for (int i = 0; i < 1000; i++) {

new Thread() { public void run() { object.one(); } }.start();

new Thread() { public void run() { object.two(); } }.start();

}

...

}

Qulflar (Bloklar)

Bir vaqtning o'zida faqat bitta oqim ba'zi bir ob'ektni qulflashi mumkin

Qulflangan ob'ektni blokirovka qilishga urinish, ushbu ob'ekt qulflanmaguncha oqimning to'xtatilishiga olib keladi

Qulfning mavjudligi ob'ekt bilan bog'liq barcha harakatlarga taqiq bermaydi.


Oqim 1






Oqim 2

Oqim 3

  1. Bloklaydi

  2. Ishlaydi

  3. Blokdan oladi

Объеkt

  1. Blokni ochishga harakat qiladi

  2. Kutadi

  3. Bloklaydi

  4. Ishlaydi

Sinxronlash

Sinxronlangan blok



//Блокируется указанный объект

synchronized (<Ссылка на объект>) {

<Тело блока синхронизации>

}

Sinxronlangan usul



//Блокируется объект-владелец метода

public synchronized void <Имя метода>() {

<Тело метода>

}

Odatdagi xatolar

Sinxronizatsiya yetishmasligi

Obyektlarni uzoq muddatli asossiz blokirovka qilish

O’zaro bloklash (deadlock)

Eksklyuziv(ko’p oqimli) oqimlarning paydo bo'lishi

Hususiyatlarni ratsional bo’linmasligi



Sinf o Object ning maxsus usullari

Har bir ob'ektda kutish oqimlari to'plami mavjud (kutish).

Har qanday oqim istalgan ob'ektning kutish () usuliga qo'ng'iroq qilishi va u uyg'onguncha to'xtab, kutish rejimiga kirishi mumkin

Ob'ektning xabar berish () usuli ob'ektni kutish to'plamidan tasodifiy tanlangan bitta oqimni uyg'otadi

Ob'ektning notifyAll () usuli ob'ektni kutish to'plamidagi barcha oqimlarni uyg'otadi

Class Object usulini qo'llash xususiyatlari

Usulni ob'ektga oqim orqali qo'ng'iroq qilish mumkin, faqat ushbu ob'ektda qulf o'rnatilgandan so'ng

Mavzular, kutish () usulini chaqirganingizdan keyin bajarishni to'xtatmasdan oldin, ularning barcha qulflarini bo'shating

Bo'shatish usulini chaqirgandan so'ng, oqimlar ilgari chiqarilgan qulflarni tiklashga harakat qilishadi.



Oqimlar bo'yicha taqiqlangan harakatlar

Mavzu.suspend (), mavzuga oid

Buzilishlar sonini ko'paytiradi

Thread.stop ()

Foydalanish buzilgan narsalarga olib keladi

Oqimning uzilishi

public void interrupt () oqim holatini to'xtatilgan holda o'zgartiradi

public static boolean interrupted () Qaytish va oqim holatini tozalash (to'xtatilgan yoki yo'q)

public boolean isInterrupted () Oqim holatini qaytaradi (uzilgan yoki yo'q)

Oqim ish paytida uning holatini tekshirishi kerak va agar u uzilib qolsa to'g'ri yopilishi kerak.

Agar oqim "uxlasa"?

Agar hozirgi vaqtda kutish (), uxlash (), qo'shilish () usullari bajarilayotgan bo'lsa va u interrupt () usulini chaqirib to'xtatilsa ...

usul InterruptedException otish bilan tugaydi!

Oqim uzilib qolganligi haqida xabar berilmagan



Bog’lovchi ob'ekt kodiga namuna

public class Keeper {

private Object data;

private boolean gettingData = false;

synchronized public void putData(Object obj)
try {


while(gettingData)

wait();

data = obj;

gettingData = true;

notifyAll();

} catch(InterruptedException e) {

Thread.currentThread().interrupt();

}

}

...

...

synchronized public Object getData()

throws InterruptedException {

while(!gettingData)

wait();

gettingData = false;

notifyAll();

return data;

}

}

Kutish wait() va uxlash sleep() o'rtasidagi farqlar

kutish wait () ob'ektning oqimi tomonidan chaqiriladi, sleep () esa oqim bilan chaqiriladi

kutish wait ()oqimini notifyAll () yoki notify () usullari bilan boshlash mumkin va "uxlab yotgan" ipni "uyg'otib bo'lmaydi"

Kutish wait () sinxron kontekstdan chaqiriladi, lekin uxlash uchun sleep () bu kerak emas



kutish wait () odatda oqim oqim ob'ektga qulfni bo'shatish sharti bilan chaqiriladi.

Foydalanilgan manbalar

  • Арнолд, К. Язык программирования Java [Текст] / Кен Арнолд, Джеймс Гослинг, Дэвид Холмс. – М. : Издательский дом «Вильямс», 2001. – 624 с.

  • Вязовик, Н.А. Программирование на Java. Курс лекций [Текст] / Н.А. Вязовик. – М. : Интернет-университет информационных технологий, 2003. – 592 с.

  • Хорстманн, К. Java 2. Библиотека профессионала. Том 2. Тонкости программирования [Текст] / Кей Хорстманн, Гари Корнелл. – М. : Издательский дом «Вильямс», 2010 г. – 992 с.

  • Эккель, Б. Философия Java [Текст] / Брюс Эккель. – СПб. : Питер, 2011. – 640 с.

  • JavaSE at a Glance [Электронный ресурс]. – Режим доступа: http://www.oracle.com/technetwork/java/javase/overview/index.html, дата доступа: 21.10.2011.

  • JavaSE APIs & Documentation [Электронный ресурс]. – Режим доступа: http://www.oracle.com/technetwork/java/javase/documentation/api-jsp-136079.html, дата доступа: 21.10.2011.

Download 57.94 Kb.

Do'stlaringiz bilan baham:




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2020
ma'muriyatiga murojaat qiling