Кіріспе

Компьютерлік техникада readers-writer (бір жазушы құлып, көп оқушы құлып, итеру құлып немесе MRSW құлып) – readers-writer проблемаларының бірін шешетін синхрондау примитиві. RW құлыптысы тек оқу операцияларына бір мезгілде қол жеткізуге мүмкіндік береді, ал жазу операцияларына эксклюзивті қол жеткізу қажет. Яғни, бірнеше жіп деректерді параллель оқи алады, бірақ деректерді жазу немесе өзгерту үшін эксклюзивті құлып талап етіледі. Жазушы деректерді жазып жатқанда, басқа барлық жазушылар мен оқушылар жазу аяқталғанша тоқтатылады. Мұның жиі қолданылатын жағдайы – жадыдағы дерек құрылымына қол жеткізуді басқару, оны атомдық түрде жаңарту мүмкін емес және жаңарту аяқталғанша жарамсыз (және басқа жіптер оқуға болмайтын) жағдайда. Оқушы-жазушы құлыптары әдетте мьютекстер мен шартты айнымалылардың немесе семафорлардың негізінде құрастырылады.

Жаңартылатын RW бұғаттауыш

Кейбір RW бұғаттауыштары бұғаттауышты оқу режимінен жазу режиміне атомарлық түрде жаңартуға, сондай-ақ жазу режимінен оқу режиміне төмендетуге мүмкіндік береді. Бұғатты оқу режимінен жазу режиміне жаңарту тұйықталуға осал, себебі егер екі жіп оқырман бұғаттарын ұстап тұрса және екеуі де жазушы бұғаттарына жаңартуға тырысса, жіптердің бірі оқырман бұғаттарын босатқанға дейін бұзылмайтын тұйықталу пайда болады. Тұйықталудан сақтану үшін, жазу режиміне жаңарту ниетімен оқу режимінде бұғатты алуға тек бір жіпке ғана рұқсат ету керек, жазу режимінде жіптер болмағанда және оқу режимінде нөлден көп жіптер болуы мүмкін.

Басымдықты саясаттар

RW құлыптарын оқырман мен жазуға қол жеткізу үшін әртүрлі басымдық саясаттарымен жобалауға болады. Құлып әрқашан оқырмандарға басымдық беруге (оқығанды артық көруге), әрқашан жазушыларға басымдық беруге (жазуды артық көруге) немесе басымдыққа қатысты белгіленбеген болуы мүмкін. Бұл саясаттар бірмезгілділік пен аштыққа байланысты әртүрлі шарттарға әкеледі. Оқығанды артық көретін RW құлыптары максималды бірмезгілділікті қамтамасыз етеді, бірақ егер талас жоғары болса, жазу аштығына ұшырауы мүмкін. Өйткені жазу жіптері кем дегенде бір оқу жіпі құлыпты ұстап тұрса, құлыпты иелене алмайды. Бірнеше оқу жіптері бір уақытта құлыпты ұстап тұруы мүмкін болғандықтан, жазу жіпі жаңа оқу жіптері құлыпты иелене алатындықтан, құлыпты күтіп отыруы мүмкін, тіпті жазушы алғаш рет құлыпты иеленуге тырысқан кезде құлыпты ұстап тұрған барлық оқырмандар құлыпты босатқаннан кейін де күтіп отыруы мүмкін. Оқырмандарға басымдық әлсіз, жоғарыда сипатталғандай, немесе күшті болуы мүмкін, яғни жазушы құлыпты босатқанда, кезекте тұрған оқырмандар оны әрқашан келесі болып иеленеді. Жазуды артық көретін RW құлыптары жазушы аштығының алдын алу үшін жазушы кезекте тұрып, құлыпты күтіп тұрса, жаңа оқырмандардың құлыпты иеленуіне жол бермейді; жазушы құлыпты ұстап тұрған барлық оқырмандар жұмысын аяқтағаннан кейін құлыпты иеленеді. Кері жағы – жазуды артық көретін құлыптар жазу жіптерінің болуы кезінде оқығанды артық көретін RW құлыптарымен салыстырғанда бірмезгілділікті азайтады. Сондай-ақ, құлыптың өнімділігі төмендейді, өйткені әр операция – оқу немесе жазу үшін құлыпты алу немесе босату – күрделірек, ішкі жағынан бір емес, екі өзара құлыптасуды (mutex) алуды және босатуды қажет етеді. Бұл түр кейде «жазуға бағытталған» оқырман-жазушы құлыптары деп те аталады. Белгіленбеген басымдықты RW құлыптары оқу мен жазуға қол жеткізуге қатысты ешқандай кепілдік бермейді. Белгіленбеген басымдық кейбір жағдайларда тиімдірек іске асыруға мүмкіндік берсе, пайдалы болуы мүмкін.

Іске асыру

Оқырман-жазушы құлыптарын іске асырудың бірнеше стратегиясы бар, олар бұрыннан бар деп есептелетін синхрондау примитивтеріне келтіріледі.

Баламалар

Оқу көшірмесін жаңарту (RCU) алгоритмі – оқырмандар-жазушылар мәселесіне бір шешім. RCU оқырмандар үшін күтусіз жұмыс істейді. Linux ядросы бірнеше жазушыға арналған seqlock деп аталатын ерекше шешімді жүзеге асырады.