Жазуға көшіру - Copy-on-write

Жазуға көшіру (Сиыр), кейде деп аталады жасырын бөлісу[1] немесе көлеңке,[2] - пайдаланылатын ресурстарды басқару әдістемесі компьютерлік бағдарламалау өзгертілетін ресурстарға «қайталау» немесе «көшіру» операциясын тиімді жүзеге асыру.[3] Егер ресурс қайталанса, бірақ өзгертілмеген болса, онда жаңа ресурс жасау қажет емес; ресурсты көшірме мен түпнұсқа арасында бөлуге болады. Модификация әлі де көшірмені жасауы керек, демек, техника: көшіру әрекеті бірінші жазғанға дейін кейінге қалдырылады. Ресурстарды осылайша бөлісу арқылы өзгертілмеген көшірмелердің ресурстарды тұтынуын едәуір азайтуға болады, сонымен бірге ресурстарды өзгерту операцияларына шағын үстеме шығындар қосылады.

Виртуалды жадыны басқаруда

Жазбаша көшіру негізгі бөлісті бөлісуде табады виртуалды жад туралы операциялық жүйе процестер жүзеге асыруда жүйелік қоңырау. Әдетте, процесс кез-келген жадты өзгертпейді және дереу жаңа процесті орындайды, адрес кеңістігін толығымен ауыстырады. Осылайша, процестің барлық жадын шанышқы кезінде көшіру артық болар еді, ал оның орнына жазуға көшіру әдісі қолданылады.

Жазбаны көшіруді тиімді қолдану арқылы жүзеге асыруға болады бет кестесі белгілі бір беттерін белгілеу арқылы жады тек оқуға арналған және параққа сілтемелер санының есебін жүргізу. Осы парақтарға деректер жазылған кезде ядро жазу әрекетін тоқтатады және жазбаға көшіру деректерімен инициалданған жаңа физикалық парақ бөледі, дегенмен тек бір сілтеме болған жағдайда бөлуді өткізіп жіберуге болады. Содан кейін ядро ​​парақ кестесін жаңа (жазылатын) парақпен жаңартады, сілтемелер санын азайтады және жазуды орындайды. Жаңа бөлу бір процестің жадындағы өзгерістің басқа процессте көрінбейтіндігіне кепілдік береді.

Жазуды көшіру әдісін тиімді қолдау үшін кеңейтуге болады жадыны бөлу парағын иелену арқылы физикалық жады нөлдермен толтырылған. Жад бөлінген кезде, қайтарылған барлық беттер нөлдер парағына сілтеме жасайды және барлығы көшіруге арналған деп белгіленген. Осылайша, процестерге физикалық жады физикалық жадыға қарағанда көбірек виртуалды жадыны сақтауға және виртуалды адрес кеңістігі таусылу қаупі бар жадты сирек пайдалануға мүмкіндік беретін мәліметтер жазылмайынша бөлінбейді. Біріктірілген алгоритм ұқсас пейджингті талап ету.[3]

Жазбада көшіру парақтары Linux ядросы Келіңіздер бір парақты біріктіру ерекшелігі.[4]

Кітапханаларды қосымшаға жүктеу - бұл жазуға көшіру техникасын қолдану. Динамикалық байланыстырушы кітапханаларды келесідей жеке карталармен бейнелейді. Кітапханалардағы кез-келген жазу әрекеті виртуалды жадыны басқаруда COW іске қосады.

openat(AT_FDCWD, «/lib64/libc.so.6», O_RDONLY|O_CLOEXEC) = 3ммап(ЖОҚ, 3906144, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0)ммап(0x7f8a3ced4000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b0000)

Бағдарламалық жасақтамада

COW сонымен бірге қолданылады кітапхана, қолдану және жүйе код.

Жылы көп ағынды жүйелерді, COW дәстүрлі қолданусыз жүзеге асырылуы мүмкін құлыптау және оның орнына қолданыңыз салыстыру және ауыстыру ішкі анықтамалық есептегішті ұлғайту немесе азайту үшін. Түпнұсқа ресурс ешқашан өзгертілмейтіндіктен, оны бірнеше ағындармен қауіпсіз көшіруге болады (сілтеме саны артқаннан кейін), мысалы, өнімділігі жоғары құлыптауды қажет етпестен. мутекс. Егер анықтамалық есептегіш 0-ге айналса, онда анықтамаға сәйкес, тек 1 ағын сілтемені иеленді, сондықтан ресурстарды жадтан қауіпсіз түрде бөлуге болады, қайтадан өнімділігі жоғары құлыптау механизмдерін қолданбай. Ресурсты көшірудің қажеті жоқ пайдасы (және дәстүрлі терең көшіруден алынған өнімділік), сондықтан бір және көп ағынды жүйелерде де жарамды болады.

Мысалдар

The жіп қарастырылған сынып C ++ стандартты кітапханасы бастапқы C ++ 98 стандартында жазуға көшіруді жүзеге асыруға мүмкіндік беру үшін арнайы жасалған,[5] бірақ жаңа C ++ 11 стандартында емес:[6]

std::жіп х(«Сәлеметсіз бе»);std::жіп ж = х;  // x және y бірдей буферді пайдаланадыж += «, Әлем!»;    // енді y басқа буферді қолданады                    // x әлі де сол ескі буферді қолданады

Ішінде PHP бағдарламалау тілі, сілтемелерден басқа барлық түрлері жазба түрінде орындалады. Мысалы, жолдар мен массивтер сілтеме арқылы беріледі, бірақ өзгертілгенде, егер олар нөлдік емес сілтеме санына ие болса, көбейтіледі. Бұл оларға тапсырмаға көшіру немесе оларды өзгертпейтін ету кезінде проблемаларсыз құндылық типтері ретінде әрекет етуге мүмкіндік береді.[7]

Ішінде Qt фреймворк, көптеген түрлері жазуға арналған (Qt терминдерімен «жасырын түрде ортақ»). Qt атомды қолданады салыстыру және ауыстыру ішкі анықтамалық есептегішті ұлғайту немесе азайту операциялары. Көшірмелері арзан болғандықтан, Qt типтерін бірнеше құлыптар қауіпсіз қолдана алады, мысалы бұғаттау механизмдерін қажет етпейді мутекс. COW-дің артықшылықтары бір және көп қатарлы жүйелерде де қолданылады.[8]

Компьютер жадында

COW негізгі механизм ретінде де қолданыла алады суреттер сияқты қарастырылған көлемді логикалық басқару, сияқты файлдық жүйелер Btrfs және ZFS,[9] сияқты дерекқор серверлері Microsoft SQL Server. Әдетте, суреттер тек өзгертілген деректерді сақтайды және негізгі массивке жақын жерде сақталады, сондықтан олар әлсіз формасы болып табылады қосымша резервтік көшірме және а-ны алмастыра алмайды толық сақтық көшірме.[10] Сондай-ақ, кейбір жүйелерде COW техникасы қолданылады анық емес сақтық көшірмелер, әйтпесе сақтық көшірмесі жасалған файлдар жиынтығындағы кез-келген файл өзгертілген кезде пайда болады.

Суреттерді енгізген кезде екі әдіс бар:

  1. Жазуға қайта бағыттау немесе ROW: түпнұсқа сақтау орны ешқашан өзгертілмейді. Жазу туралы сұраныс жасалған кезде, ол бастапқы деректерден жаңа сақтау аймағына қайта бағытталады.
  2. Жазбаға көшіру немесе COW: жазу туралы сұраныс жасалған кезде, деректер жаңа сақтау аймағына көшіріледі, содан кейін түпнұсқа деректер өзгертіледі.

Атауларына қарамастан, көшіру кезінде жазу бірінші техниканы білдіреді. COW ROW-мен салыстырғанда екі дерек жазады; тиімді жүзеге асыру қиын, сондықтан сирек қолданылады.

Жазуды көшіру әдістемесі оқуды талап ететін тасымалдағыштарда оқуды және жазуды сақтауды еліктеу үшін қолданыла алады тегістеу кию немесе физикалық тұрғыдан бір рет жазыңыз көп оқыңыз.

The qcow2 (Жазу кезінде QEMU көшірмесі) диск кескінінің форматы дискідегі кескіннің көлемін азайту үшін жазуға көшіру техникасын қолданады.

Кейбіреулер Тікелей дискілер (және Тікелей USB ) кез-келген каталогқа файлдарды қосуға және жоюға мүмкіндік беру үшін жазу-көшіру тәсілдерін қолдану, CD-ге (немесе USB флэш-жадына) ешқандай өзгеріс енгізбестен.

Бағдарламалық қамтамасыздандырудың жоғары деңгейінде

Phantom OS мәліметтер базасын немесе файлдық жүйені ғана емес, барлық деңгейлерде COW қолданады. Кез-келген уақытта осы жүйені басқаратын компьютер істен шығуы мүмкін, содан кейін қайтадан басталған кезде бағдарламалық жасақтама мен амалдық жүйе жұмысын жалғастырады. Жұмыстың аз мөлшерін ғана жоғалтуға болады.

Негізгі тәсіл - бағдарламаның барлық деректері виртуалды жадта сақталады. Кейбір кестеде барлық бағдарламалық жасақтаманың қысқаша мазмұны виртуалды жадқа жазылады, әр мәннің ағымдағы мәні мен орналасуын қадағалайтын журнал құрылады.

Компьютер істен шыққан кезде журналдың және басқа деректердің соңғы көшірмесі дискіде сақталады. Операция қайта басталған кезде операциялық жүйенің бағдарламалық жасақтамасы барлық бағдарламалар мен деректердің дәйекті көшірмелерін қалпына келтіру үшін журналды оқиды.

Бұл тәсіл барлық бағдарламалық жасақтамада, оның ішінде қолданбалы бағдарламалық жасақтамада барлық деңгейлерде көшіруге жазуды қолданады. Бұл қолданбалы бағдарламалау тілінде қолдауды қажет етеді. Іс жүзінде Phantom OS тек Java байт кодтарын шығаратын тілдерге рұқсат береді.

Сондай-ақ қараңыз

Әдебиеттер тізімі

  1. ^ «Жасырын бөлісу». Qt жобасы. Алынған 4 тамыз 2016.
  2. ^ Rodeh, Ohad (1 ақпан 2008). «B-ағаштар, көлеңке және клондар» (PDF). Сақтаудағы ACM транзакциялары. 3 (4): 1. CiteSeerX  10.1.1.161.6863. дои:10.1145/1326542.1326544. S2CID  207166167. Алынған 4 тамыз 2016.
  3. ^ а б Бовет, Даниэль Пьер; Чесати, Марко (2002-01-01). Linux ядросы туралы түсінік. O'Reilly Media. б. 295. ISBN  9780596002138.
  4. ^ Аббас, Әли. «Ядролық беттің біріктіру процесі». alouche.net. Архивтелген түпнұсқа 2016 жылғы 8 тамызда. Алынған 4 тамыз 2016.
  5. ^ Мейерс, Скотт (2012), Тиімді STL, Аддисон-Уэсли, 64–65 б., ISBN  9780132979184
  6. ^ «Негізгі жолға параллельді модификациялау». Ашық стандарттар. Алынған 13 ақпан 2015.
  7. ^ Паули, Джулиен; Феррара, Энтони; Попов, Никита (2013). «Жадыны басқару». www.phpinternalsbook.com. PHP ішкі кітаптары. Алынған 4 тамыз 2016.
  8. ^ «Жіптер және жасырын түрде бөлісілген сыныптар». Qt жобасы. Алынған 4 тамыз 2016.
  9. ^ Касампалис, Сакис (2010). «Жазбаша файлдық жүйелер жұмысының тиімділігін талдау және енгізу» (PDF). б. 19. Алынған 11 қаңтар 2013.
  10. ^ Чиен, Тим. «Суреттердің сақтық көшірмелері ЕМЕС». www.oracle.com. Oracle. Алынған 4 тамыз 2016.