ҚАЗАҚСТАН РЕСПУБЛИКАСЫ БІЛІМ ЖӘНЕ ҒЫЛЫМ МИНИСТРЛІГІ
«Ғ.ДАУКЕЕВ АТЫНДАҒЫ АЛМАТЫ ЭНЕРГЕТИКА ЖӘНЕ БАЙЛАНЫС УНИВЕРСИТЕТІ»
Коммерциялық емес акционерлік қоғам
№2 РГР
Пәні: ЖҮЙЕЛІК ПРОГРАММАЛЫҚ ЖАБДЫҚТАУ ЖӘНЕ ПРОГРАММАЛАУ
Тақырыбы: Процестерді синхрондау және оның механизмдерін өңдеу
Орындаған: Қазизанов Азат
Тобы: АИСУк-20-6
Тексерген: Абдилдаева А
________ ____________ «___» ___________2022г.
(бағасы) (қолы)
Алматы 2022
Синхрондау (басқа грек тілінен. σύγχρονος-бір мезгілде) информатикада біреуін білдіреді: процестерді синхрондау, деректерді синхрондау немесе деректерді синхрондау процесі.
Процестерді синхрондау-бұл бірнеше процестер немесе ағындар кездейсоқ ретпен пайдаланған кезде кез келген ресурстың (файл, жадтағы деректер) тұтастығын қамтамасыз ететін механизм. Процестер мен ағындарды синхрондау үшін семафорлар, мутекстер және сыни бөлімдер қолданылады. Синхрондаудың баламасы актерлер моделі немесе транзакциялық жад болуы мүмкін.[1]
Деректерді синхрондау-деректердің екі көшірмесі арасындағы айырмашылықтарды жою. Бұрын бұл көшірмелер бірдей болған, содан кейін олардың біреуі немесе екеуі де дербес өзгертілген деп болжануда.
Деректерді синхрондау әдісі қосымша болжамдарға байланысты. Мұндағы басты мәселе-тәуелсіз жасалған өзгерістер бір-бірімен үйлеспеуі мүмкін ("өңдеу қақтығысы" деп аталады), тіпті теориялық тұрғыдан мұндай жағдайларды шешудің жалпы әдісі жоқ.
Дегенмен, белгілі бір жағдайларда қолданылатын бірқатар жеке әдістер бар:
Ең қарапайым әдіс: өзгерістер тек көшірмелердің біріне — "жұмыс" — және басқа көшірме оның мазмұнымен қайта жазылады деп есептеңіз. Бұл әдісті синхрондау Қосымшаларының көпшілігі жүзеге асырады; жасалған өзгерістердің қайтымсыздығына байланысты пайдаланушыға қай көшірмені "басты"деп санау керектігін таңдау беріледі.
Егер деректер тәуелсіз жазбалар жиынтығы болса (яғни жазбалардың кез — келген тіркесімі дұрыс болса-бұл, мысалы., телефон кітабы), содан кейін сіз көптеген жазбаларды біріктіре аласыз. Бұл ақпараттың жоғалу қаупін жояды, бірақ жазбаны жиынтықтан алып тастау үшін бұл әдісті біріншісімен біріктіру керек.
Егер жиынтықтар бірнеше рет синхрондалса, оларға қосымша қызметтік ақпаратты автоматты түрде енгізуге болады: жазбаның соңғы өзгертілген күні мен уақыты, жойылған жазбалар туралы белгілер (келесі синхрондаудан кейін немесе жеткілікті ұзақ уақыттан кейін өшіріледі) және т .б.. Бұл тәсіл, мысалы, Outlook бағдарламасында қолданылады.
Өңдеу қақтығыстарын өңдеу: автоматты түрде (мүмкін болса), әйтпесе қолмен. Бұл, ең жалпы әдіс, егер жоғарыда аталған жеңілдетілгендер қолайсыз болса ғана қолданылады — мысалы, нұсқаларды Басқару жүйелерінде. Сонымен, CVS екі тәуелсіз өзгерісті анықтаған кезде "жанжал" туралы хабарлайды және (қарапайым жағдайларда) оны автоматты түрде шешеді немесе пайдаланушыға оны қолмен шешуге мүмкіндік береді. Мұндай жағдайларда жанжалдарды болдырмауға тырысады-мысалы, құзыреттілік салаларын бөлу.
Деректерді синхрондау механизмдерінің бірі репликация болып табылады, ол әсіресе мәліметтер базасының мазмұнын синхрондау үшін қолданылады.
Деректерді синхрондау-сандық деректерді беру процесінде қабылдағыш таратқышпен синхрондалатын процесс.
Код:
#include
#include
#include
#include
#include
std::mutex cout_mutex; // control access to std::cout
std::timed_mutex mutex;
void job(int id)
{
using Ms = std::chrono::milliseconds;
std::ostringstream stream;
for (int i = 0; i < 3; ++i) {
if (mutex.try_lock_for(Ms(100))) {
stream << "success ";
std::this_thread::sleep_for(Ms(100));
mutex.unlock();
} else {
stream << "failed ";
}
std::this_thread::sleep_for(Ms(100));
}
std::lock_guard lock(cout_mutex);
std::cout << "[" << id << "] " << stream.str() << "\n";
}
int main()
{
std::vector threads;
for (int i = 0; i < 4; ++i) {
threads.emplace_back(job, i);
}
for (auto& i: threads) {
i.join();
}
}
/*
Возможный вывод:
[0] failed failed failed
[3] failed failed success
[2] failed success failed
[1] success failed success
*/
Бұл кодта timed_mutex класын қолданамыз. Timed_mutex класы - ортақ деректерді бір уақытта бірнеше ағынға қол жеткізуден қорғау үшін пайдалануға болатын синхрондау қарабайыры.
Mutex сияқты, timed_mutex эксклюзивті, рекурсивті емес меншік семантикасын ұсынады. Сонымен қатар, timed_mutex timed_mutex-ті try_lock_for() және try_lock_until () әдістерін қолдана отырып, уақытты ұстап алуға мүмкіндік береді.
Try_lock_for()әдісі:
Мутексті бұғаттауға тырысады. Ағын көрсетілген күту уақыты аяқталғанға дейін күтеді немесе қайсысы ертерек болатынына байланысты бұғаттауды алады. Құлыпты сәтті алған кезде true қайтарады, әйтпесе false қайтарады.
Егер timeout_duration timeout_duration-дан кіші немесе оған тең болса.zero (), функция try_lock () сияқты әрекет етеді.
Бұл мүмкіндік жоспарлаушының кешігуіне немесе ағындар арасындағы ресурстар үшін бәсекелестікке байланысты timeout_duration-қа қарағанда ағынды ұзағырақ бұғаттай алады.
Стандарт ұзақтығын өлшеу үшін steady_clock пайдалануды ұсынады. Егер іске асыру оның орнына system_clock пайдаланса, күту уақыты сағатты реттеуге де сезімтал болуы мүмкін.
Try_lock () сияқты, бұл функция timeout_duration кезінде мутекс басқа ағынмен бұғатталмаған болса да, жалған қайтаруға рұқсат етіледі.
Егер try_lock_for мутекске ие ағынмен шақырылса, мінез-құлық анықталмаған.
Қорытынды
Бұл ЕСЖ-2 да мен процесстерді синхрондаумен танысып және осыған байланысты кодты арнайы класс timed_mutex және функцияларды қолданып нәтиже алдым.
Достарыңызбен бөлісу: |