Xotira himoyasi. Xotirani himoya qilish - bu muayyan xotira hududlariga kirish huquqini boshqarish usuli. Ko'p ishlaydigan operatsion tizimlar tomonidan ishlatiladi. Xotirani himoya qilishning asosiy maqsadi bu jarayonga ajratilmagan xotiraga kirishning oldini olishdir. Bunday taqiqlar ikkala dastur va operatsion tizimlarning ishonchliligini oshiradi, chunki bitta dasturdagi xato boshqa dasturlarning xotirasiga ta'sir eta olmaydi. Xotirani himoya qilishning umumiy printsipi bilan ASLR yoki NX bitli texnologiya o'rtasida farqni aniqlash kerak.
Xotirani himoyalashning alternativ ta'rifi - bu davom etayotgan vazifani boshqa dasturga yozish yoki o'qishdan himoya qilishning tanlangan qobiliyati.
18-mavzu. OT VOSITASIDA HISOBLASH JARAYONINI PARALELLASH. FAYL TIZIMINI O’RNATISH. PROTSESSOR HOLATLARI VA ULAR USTIDA AMALLAR
Ancha oldin, parallel dasturlash - bu ulkan superkompyuterlar uchun vazifalar bilan qiziqadigan yolg'izlarning taqdiri edi. Ammo endi odatiy dasturlar ko'p yadroli protsessorlarda ishlay boshlagach, parallel dasturlash tezda har qanday professional dasturiy ta'minot ishlab chiqaruvchisi egallashi va foydalanishi kerak bo'lgan texnologiyaga aylanib bormoqda.
Parallel dasturlash qiyin bo'lishi mumkin, ammo uni "qiyin" emas, balki "biroz boshqacha" deb hisoblasangiz tushunish osonroq bo'ladi. U ko'proq an'anaviy, ketma-ket dasturlashning barcha xususiyatlarini o'z ichiga oladi, ammo parallel dasturlashda qo'shimcha uchta aniq, aniqlangan bosqich mavjud.
Qarama-qarshilikni aniqlash: bir vaqtning o'zida bajarilishi mumkin bo'lgan kichik vazifalarni aniqlash uchun vazifalarni tahlil qilish
Qarama-qarshilikni identifikatsiya qilish: pastki qismlarni samarali bajarish uchun vazifalar tarkibini o'zgartirish. Bu ko'pincha qism masalalar orasidagi bog'liqlikni topish va ularni samarali boshqarish uchun dastlabki kodni tashkil qilishni talab qiladi
Moslik ifodasi: Parallel dasturlash qaydlari tizimidan foydalanib, manba kodida parallel algoritmni amalga oshirish
Ushbu mavzu dasturlashning bir nechta parallel tizimlari haqida umumiy ma'lumot beradi, ularni qo'llashning asosiy usullarini, shuningdek kuchli va zaif tomonlarini batafsil tavsiflaydi. Xususan, bu yerda qayd etishning quyidagi tizimlari ko'rib chiqiladi:
OpenMP: oson parallel dasturlash uchun kompilyator ko'rsatmalar
MPI: yuqori samarali portativlikni amalga oshirish uchun kutubxona ishlari
Java: Etakchi ob'ektlarni dasturlash tilidagi moslik
Masalaning qo’yilishi. To’g’ri to’rtburchak formulasi bo’yicha integralni parallel hisoblash
Matematika kursidan ma'lumki, integralni egri chiziq ostidagi maydon shaklida geometrik tarzda ko'rsatish mumkin. Bu erda integral qiymatini taxminiy hisoblash algoritmi keladi. Integratsiya bo'limi ko'plab segmentlarga bo'linadi. Har bir segment segmentning to'rtburchagining poydevoriga aylanadi, uning balandligi bu segmentning markazidagi integrand qiymatiga teng. Integralning taxminiy qiymati barcha to'rtburchaklar sohalarining yig'indisiga teng.
Integrand va integratsiya chegaralarini tanlash mumkin, bunda integralning qiymati 'n' ga teng bo'ladi. Shunday qilib, dasturning to'g'ri ishlashini tekshirish oddiy vazifaga aylanadi. Ushbu algoritmni amalga oshiradigan oddiy C dasturi quyidagicha:
static long num_steps = 100000;
double step;
void main ()
{
int i;
double x, pi, sum = 0.0;
step = 1.0/(double) num_steps;
for (i=0;i<= num_steps; i++){
x = (i+0.5)*step;
sum = sum + 4.0/(1.0+x*x);
}
pi = step * sum;
}
OpenMP. OpenMP [omp] bu umumiy xotira kompyuterlari uchun parallel dasturlarni yaratish uchun sanoat standarti bo'lgan API. OpenMP-ning asosiy maqsadi - obyektga yo'naltirilgan dasturlarni yozishni osonlashtirish. Bunday dasturlar ko'pincha yuqori ishlashli hisoblash uchun yaratiladi. Bundan tashqari, OpenMP dasturiga parallel algoritmlarni qo'llab-quvvatlovchi komponentlar, masalan, SPMD, "asosiy va ish oqimi", quvur liniyasi va boshqalar kiritilgan.
OpenMP juda muvaffaqiyatli parallel dasturlash tiliga aylandi. U bozorga kiradigan har bir umumiy xotira kompyuterida mavjud. Bundan tashqari, Intel yaqinda klasterni qo'llab-quvvatlash uchun OpenMP optsiyasini yaratdi. OpenMP dasturlash uslubini qo'llab-quvvatlaydi, unga mavjud ketma-ket dastur parallel bo'lgunga qadar asta-sekin parallelizm qo'shiladi. Biroq, bu afzallik OpenMP-ning eng zaif nuqtasidir. Agar ketma-ketlik ketma-ket qo'shilsa, dasturchi dasturni keng ko'lamli qayta tiklamasligi mumkin, bu ko'pincha maksimal ishlashga erishish uchun zarurdir.
OpenMP bu doimiy ravishda rivojlanib boradigan standartdir. OpenMP Architecture Review Commission deb nomlangan soha guruhi tilga yangi kengaytmalarni qo'shish uchun muntazam ravishda uchrashuvlar o'tkazadi. OpenMP-ning keyingi versiyasi (3.0 versiyasi) vazifalarni navbatga qo'yish qobiliyatini o'z ichiga oladi. Bu OpenMP-ga boshqaruv tuzilmalarining kengroq doirasini boshqarishga va umumiy rekursiv algoritmlarni faollashtirishga imkon beradi.
Yuqoridagi dasturning OpenMP dan foydalanib tuzilgan ko’rinishi quyidagicha
#include "omp.h"
static long num_steps = 100000; double step;
void main ()
{
int i;
double x, pi, sum = 0.0;
step = 1.0/(double) num_steps;
#pragma omp parallel for private(x) reduction(+:sum)
for (i=0;i<= num_steps; i++){
x = (i+0.5)*step;
sum = sum + 4.0/(1.0+x*x);
}
pi = step * sum;
}
MPI. MPI yoki xabar almashish interfeysi, bugungi kunda ishlatiladigan eng eski parallel dasturlash API-laridan biridir. MPI dasturi bu bir-biri bilan xabar yuborish va qabul qilish orqali o'zaro ta'sir qiladigan mustaqil jarayonlar to'plami. MPI-ning kuchliligi shundaki, bu interfeys parallel kompyuter uchun juda kam texnik talablarga ega. Ushbu interfeysning barcha ehtiyojlari protsessorlar yoki yadrolarni bitta tarmoqni ulashishi uchun, har qanday ikkita jarayon o'rtasida xabarlarni uzatish uchun mos keladi. Bu MPI har qanday standart parallel tizimda, nosimmetrik ko'p protsessor tizimlaridan tortib tarqalgan xotira tizimlariga, yuqori darajadagi parallelizmga ega superkompyuterlardan klasterlarga qadar ishlashga imkon beradi.
MPI interfeysi 90-yillarning boshlarida, klasterlar endigina paydo bo'lganida yaratilgan va yuqori darajadagi parallelizm (MPP) yuqori samarali hisoblash protsessorlari ustunlik qilgan. Har bir MPP ishlab chiqaruvchisi xabarlar uchun o'z yozuvlaridan foydalangan. Garchi ishlab chiqaruvchilar ushbu yondashuvdan juda mamnun bo'lishgan bo'lsa-da, foydalanuvchilar o'z mahsulotlarini bog'lashgani sababli, dasturchilar buni umuman yoqtirmadilar. Dasturiy ta'minotga qaraganda ancha uzoq umr ko'radi. Portativ notatsion tizim mavjud bo'lmaganda, har safar yangi kompyuter sotib olayotganda, dasturchilar o'z dasturlarini xabarlarni bir yozuv tizimidan boshqasiga o'tkazish uchun ko'p harakat qilishga majbur bo'lishdi.
MPI xabar almashish bo'yicha birinchi ko'chma kutubxona emas, lekin u ishlab chiqaruvchilar, milliy laboratoriyalar va ilmiy institutlar ishtirokida tashkil etilgan birinchi shunday kutubxona edi. Deyarli barcha asosiy o'yinchilar MPI-ni yaratishda qatnashganligi sababli, ushbu interfeys tezda yuqori samarali kompyuterlarda ishlatiladigan xabar almashish uchun standartga aylandi. Va endi, yaratilganidan deyarli 15 yil o'tgach, MPI interfeysi hanuzgacha yuqori samarali hisoblash sohasidagi parallel dasturlash uchun eng mashhur tizim tizimidir.
Ko'pgina MPI dasturlari [mattson05] yagona dasturli ko'p ma'lumotli (SPMD) shablondan foydalanadi. Bu oddiy printsipga asoslanadi: har bir ishlov berish elementi (PE) bir xil dasturni ishlaydi. Har bir ishlov berish elementiga noyob butun son identifikatori beriladi, bu esa ishlov berish elementlari to'plamidagi o'rnini belgilaydi. Dastur ushbu darajadan foydalanib, ishni taqsimlaydi va qaysi PE elementi ishlashini aniqlaydi. Boshqacha aytganda, bitta dastur mavjud, ammo identifikatorga muvofiq tanlanganligi sababli har bir ishlov berish elementi uchun ma'lumotlar boshqacha bo'lishi mumkin. Bu "bitta dastur, turli xil ma'lumotlar" shablonidir.
MPIdan foydalanib yuqoridagi masalani yechishga harakat qilamiz.
#include "mpi.h"
static long num_steps = 100000;
void main (int argc, char *argv[])
{
int i, my_id, numprocs;
double x, pi, step, sum = 0.0 ;
step = 1.0/(double) num_steps ;
MPI_Init(&argc, &argv) ;
MPI_Comm_Rank(MPI_COMM_WORLD, &my_id) ;
MPI_Comm_Size(MPI_COMM_WORLD, &numprocs) ;
my_steps = num_steps/numprocs ;
for (i=my_id; i{
x = (i+0.5)*step;
sum += 4.0/(1.0+x*x);
}
sum *= step ;
MPI_Reduce(&sum, &pi, 1, MPI_DOUBLE, MPI_SUM, 0,
MPI_COMM_WORLD) ;
MPI_Finalize(ierr);
}
Do'stlaringiz bilan baham: |