Кіріспе

Компьютерлік алгоритм

Бадди жадыны бөлу техникасы – жады сұранысын мүмкіндігінше жақсы қанағаттандыру үшін жадыны бөліктерге бөлетін жадыны бөлу алгоритмі. Бұл жүйе жадыны екіге бөліп, ең тиімді сәйкестікті табуға тырысады. Дональд Кнуттың сөзіне сүйенсек, бадди жүйесін 1963 жылы Гарри Марковиц ойлап тапқан, ал алғаш рет Кеннет К. Ноултон сипаттаған (1965 жылы жарияланған). Бадди жадыны бөлуді іске асыру салыстырмалы түрде оңай. Ол жад блоктарын бөлуге және біріктіруге шектеулі, бірақ тиімді мүмкіндіктер береді.

Алгоритм

Бадди жүйесінің әр түрлі нысандары бар; әр блок екі кіші блокқа бөлінетін түрлері ең қарапайым және кең таралғандары болып табылады. Бұл жүйедегі әрбір жад блогының дәрежесі болады, онда дәреже 0-ден белгілі бір жоғарғы шекке дейінгі бүтін сан. n дәрежелі блоктың көлемі 2n-ге пропорционал, сондықтан блоктар бір дәреже төмен блоктардан екі есе үлкен болады. Екінің дәрежесіндегі блок көлемдері адрестеуді жеңілдетеді, себебі барлық баддилер екінің дәрежесіндегі жад адресі шекараларында тегістеледі. Үлкен блок бөлінген кезде, ол екі кіші блокқа бөлінеді, және әр кіші блок екіншісі үшін бірегей баддиге айналады. Бөлінген блок тек өзінің бірегей бадди блогымен біріктіріле алады, содан кейін олар бұрын бөлінген үлкен блокты қайта құрайды. Бастапқыда ең кіші блок көлемі анықталады, яғни бөлуге болатын ең кішкентай жад блогы. Егер ешқандай төменгі шек болмаса (мысалы, биттік мөлшерде бөлу мүмкін болса), жадтың қай бөліктері бөлінген және қайсысы бөлінбегенін қадағалау үшін жүйеге көп жад және есептеу ресурстары қажет болар еді. Дегенмен, бөліністердің көлемі ең кішкентай блок көлемінің еселігіне сәйкес келмеген жағдайдағы орташа жадты ысырапты азайту үшін, салыстырмалы түрде төменгі шек қажет болуы мүмкін. Әдетте, төменгі шек бір бөлініске шаққандағы орташа ысырапты азайтуға жеткілікті кішкентай, бірақ артық шығындарды болдырмауға жеткілікті үлкен болады. Ең кішкентай блок көлемі 0 дәрежелі блок көлемі ретінде қабылданады, сондықтан барлық жоғары дәрежелер осы көлемнің екінің дәрежесіндегі еселігі ретінде беріледі. Бағдарламашы содан кейін қалған бос жад кеңістігіне сыятын ең жоғары дәрежені анықтау үшін код жазуы керек немесе оны алу үшін код жазылуы тиіс. Белгілі бір компьютер жүйесіндегі жалпы қолжетімді жад ең кішкентай блок көлемінің екінің дәрежесіндегі еселігі болмауы мүмкін болғандықтан, ең үлкен блок көлемі жүйенің барлық жадын қамтымайды. Мысалы, егер жүйеде 2000 К физикалық жад болса және 0 дәрежелі блок көлемі 4 К болса, онда дәреже шегі 8 болады, себебі 8 дәрежелі блок (256 0 дәрежелі блок, 1024 К) жадқа сыятын ең үлкен блок болып табылады. Осылайша, барлық физикалық жадты бір бөлікке бөлу мүмкін емес; қалған 976 К жад кішкентай блоктарда бөлінуі керек.

Орындау және тиімділік

Динамикалық бөлу сияқты басқа қарапайым техникалармен салыстырғанда, бадди жад жүйесінде сыртқы фрагментация аз, және жадты аз қосымшы шығынмен жинақтауға мүмкіндік береді. Жадты босатудың бадди әдісі жылдам, қажетті жинақтаулардың максималды саны O(ең жоғары рет) = O(log2(жалпы жад көлемі))-не тең. Әдетте, бадди жадты бөлу жүйесі пайдаланылған немесе бос бөлінген жад блоктарын көрсету үшін екілік ағаш пайдалану арқылы іске асырылады. Блоктың "баддисінің" адресі – блок адресі мен блок көлемінің биттік эксклюзивті НЕ (XOR) операциясының нәтижесіне тең. Дегенмен, ішкі фрагментация мәселесі де бар – сұралған жад кішкентай блоктан сәл үлкен, бірақ үлкен блоктан әлдеқайда кіші болғандықтан жад ысырапқа кетеді. Бадди жадты бөлу техникасының жұмыс істеу принципіне байланысты, 66 К жад сұраған бағдарламаға 128 К жад бөлінеді, бұл 62 К жадтың ысырап болуына әкеледі. Бұл мәселені табақша бөлу арқылы шешуге болады, оны одан ұсақ түйірлі бөлу үшін ірі бадди бөлушінің үстіне қоюға болады. Бадди бөлу алгоритмінің бір нұсқасын Дональд Кнут "Компьютерлік бағдарламалау өнері" кітабының 1-томында егжей-тегжейлі сипаттаған. Linux ядросы да бадди жүйесін қолданады, сыртқы фрагментацияны азайту үшін қосымша өзгерістермен, сондай-ақ блоктардағы жадты басқару үшін басқа да әртүрлі бөлушілермен бірге. jemalloc – бұл басқалармен қатар бадди техникасын қолданатын қазіргі заманғы жад бөлуші.