Кіріспе

Деректер сегменті – есептеу техникасында деректер сегменті (көбінесе «деректер» деп белгіленеді) – объектілік файлдың бөлігі немесе бағдарламаның сәйкес адрестік кеңістігі, онда инициализацияланған статикалық айнымалылар, яғни жаһандық айнымалылар мен статикалық жергілікті айнымалылар сақталады. Бұл сегменттің көлемі бағдарламаның бастапқы кодындағы мәндердің көлемімен анықталады және орындалу кезінде өзгермейді. Деректер сегменті оқуға/жазуға арналған, себебі айнымалылардың мәндері орындалу кезінде өзгеруі мүмкін. Бұл тек оқуға арналған деректер сегментінен (родата сегменті немесе родата), онда айнымалылар емес, статикалық тұрақтылар бар, және көптеген архитектураларда тек оқуға арналған код сегменті (мәтін сегменті) деп аталатын сегменттен өзгеше. Бастапқысы жоқ деректер, яғни айнымалылар мен тұрақтылар, BSS сегментінде сақталады. Тарихи тұрғыдан алғанда, жад адресі кеңістіктерінің ішкі адрестік тіркегіштің табиғи көлемінен үлкен болуын қолдау үшін, алғашқы процессорлар сегментация жүйесін іске асырды, осы арқылы белгілі бір аймақтарға смещение ретінде пайдалану үшін кішкентай индекс жиынтығын сақтады. Intel 8086 процессорлар отбасы төрт сегментті ұсынды: код сегменті, деректер сегменті, стек сегменті және қосымша сегмент. Әрбір сегмент орындалатын бағдарламалық құралмен жадтың белгілі бір орнына орналастырылды және осы сегменттердегі деректермен жұмыс істейтін барлық командалар сол сегменттің басына қатысты орындалды. Бұл 16 биттік адрестік тіркегішке, әдетте 64 КБ жад кеңістігіне қол жеткізе алатын, 1 МБ жад кеңістігіне қол жеткізуге мүмкіндік берді. Жад кеңістігін дискретті блоктарға бөлу сол кездегі бағдарламалау тілдеріне көшті және бұл ұғым қазіргі заманғы бағдарламалау тілдерінде де кеңінен қолданылады.

Бағдарлама жады

Компьютерлік бағдарлама жадының көп бөлігі екі негізгі бөлімге жіктеледі: тек оқуға арналған және оқу/жазуға арналған. Бұл ерекшелік алғашқы жүйелердің негізгі бағдарламаларын Mask ROM, EPROM, PROM немесе EEPROM сияқты тек оқуға арналған жадта сақтауынан туындады. Жүйелер күрделене түскенде және бағдарламалар ROM-нан тікелей орындалудың орнына RAM-ға басқа құралдардан жүктелгенде, бағдарлама жадының кейбір бөліктерін өзгертуге болмайтындығы туралы түсінік сақталды. Осы бөліктер бағдарламаның мәтіндік және rodata сегменттеріне айналды, ал қалған бөлігі нақты міндеттер үшін бірнеше басқа сегменттерге бөлінді.

Код

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

Топ

Heap сегменті динамикалық түрде бөлінген жадты қамтиды, әдетте BSS сегментінің соңынан басталады және одан үлкен адрестерге қарай өседі. Ол malloc, calloc, realloc және free функциялары арқылы басқарылады, олар оның өлшемін өзгерту үшін brk және sbrk жүйелік шақыруларын пайдалана алады (бірақ malloc/calloc/realloc/free шартын орындау үшін brk/sbrk және жалғыз heap сегментін пайдалану міндетті емес; олар mmap/munmap арқылы процестің виртуалды адрестік кеңістігіне жеке-жеке жад аймақтарын резервтеуге/босатуға да қолданылуы мүмкін). Heap сегменті процестегі барлық жіптер, ортақ кітапханалар және динамикалық түрде жүктелетін модульдермен ортақ пайдаланылады.

Қоры

Стек сегменті шақыру стегін, әдетте жадтың жоғары бөліктерінде орналасқан LIFO құрылымын қамтиды. "Стек көрсеткіші" тіркегі стектің жоғарғы жағын қадағалайды; ол стекке мән "қосылған сайын" реттеледі. Бір функцияны шақыру үшін стекке түрткіленген мәндер жиынтығы "стек кадры" деп аталады. Стек кадры ең аз дегенде қайтару мекенжайынан тұрады. Автоматты айнымалылар да стекте орналасады. Стек сегменті дәстүрлі түрде үйір сегментімен іргелес болып, бір-біріне қарай өседі; стек көрсеткіші үйір көрсеткішімен кездескенде, бос жад таусылады. Үлкен адрестік кеңістіктер мен виртуалды жад техникаларын пайдалану арқасында олар көбінесе еркін орналасады, бірақ олар әдетте бір-біріне жақындау бағытта өседі. Стандартты PC x86 архитектурасында стек нөлдік мекенжайға қарай өседі, яғни шақыру тізбегінде терең жатқан жаңа элементтер сандық тұрғыдан төменгі мекенжайларда және үйірге жақын орналасады. Кейбір басқа архитектураларда ол кері бағытта өседі.

Аударма тілдері

Кейбір интерпретацияланған тілдер деректер сегментіне ұқсас мүмкіндіктер ұсынады, атап айтқанда Perl және Ruby. Бұл тілдерде `DATA` (Perl) немесе `END` (Ruby, ескі Perl) жолын қосу код сегментінің соңы мен деректер сегментінің басталуын көрсетеді. Осы жолға дейінгі мазмұн ғана орындалады, ал осы жолдан кейінгі бастапқы файлдың мазмұны файлдық объекті ретінде қолжетімді: `PACKAGE::DATA` Perl-де (мысалы, `main::DATA`) және `DATA` Ruby-де. Бұл файлдық мәтіндік түрінің (here document) бір түрі деп санауға болады.