Жадты басқару механизмі: Slab allocation – фрагментацияны азайтып, тиімді жадты бөлуді қамтамасыз етеді. Объекттерді қайта пайдалану арқылы жылдамдық арттырады.
Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Жадты басқару механизмі
Memory management mechanism
Slab allocation – объектілерді тиімді жадқа бөлуге арналған жадты басқару механизмі. Алдыңғы механизмдермен салыстырғанда, жадты бөлу және босату кезінде туындайтын фрагментацияны азайтады. Бұл техника белгілі бір типтегі дерек объектісін қамтитын бөлінген жадты, сол типтегі объектілерді кейінгі бөлістерде қайта пайдалану үшін сақтап тұруға мүмкіндік береді. Бұл объектілер жинағына ұқсас, бірақ басқа ресурстарға емес, жадқа ғана қолданылады. Slab allocation алғаш рет Джефф Бонвикпен Solaris 2.4 ядросында енгізілді, содан кейін Linux-та да қолданылды; алайда, ол ескірген бөлу әдісі болғандықтан, қазіргі уақытта қолданыстан шығарылған және жақын арада Linux ядросынан алынып тасталуы мүмкін.
Slab allocation is a memory management mechanism intended for the efficient memory allocation of objects. In comparison with earlier mechanisms, it reduces fragmentation caused by allocations and deallocations. This technique is used for retaining allocated memory containing a data object of a certain type for reuse upon subsequent allocations of objects of the same type. It is analogous to an object pool, but only applies to memory, not other resources. Slab allocation was first introduced in the Solaris 2.4 kernel by Jeff Bonwick. and Linux; however, due to it being an outdated allocation method, it is currently deprecated and may be removed soon from the Linux kernel.
Негізгі
Slab allocation ядролық деректер объектілерін бастау және жоюдың өте қымбат (процессор уақыты тұрғысынан) әрекетін сирек кездестіреді, бұл олар үшін жадты бөлуге кеткен шығыннан асып түсуі мүмкін. Егер ядро объектілерді жиі құрып, жоятын болса, бастамалауға кеткен қосымша шығын өнімділіктің айтарлықтай төмендеуіне әкелуі мүмкін. Объектілерді кэштеу объектінің күйін инициализациялайтын функцияларды шақыру жиілігін азайтады: slab арқылы бөлінген объект пайдаланылғаннан кейін босатылғанда, slab allocation жүйесі оны жоюдың орнына кэште сақтайды, келесіде сол типтегі объект қажет болғанда қайта пайдалануға дайын тұрады (осылайша жаңа объектіні құру және инициализациялау қажеттілігінен құтылады). Slab allocation кезінде, белгілі бір типті немесе мөлшердегі деректер объектісі үшін кэш алдын ала бөлінген бірнеше "slab-тардан" тұрады; әрбір slab-тың ішінде объектілерге сәйкес келетін белгілі бір мөлшердегі жад бөліктері болады. Slab allocator осы бөліктерді қадағалайды, сондықтан белгілі бір типтегі деректер объектісі үшін жадты бөлу туралы сұрау түскенде, әдетте ол қолданыстағы slab-тан бос орынды (бөлікті) тауып бере алады. Allocator-дан объектінің жадын босатуды сұрағанда, ол жай ғана бос (қолданылмаған) орындар тізіміне осы орынды қосады. Сол типтегі объектіні құруға (немесе сол мөлшердегі жадты бөлуге) келесі шақыру сол жад орынын (немесе басқа бос орынды) қайтарады және оны бос орындар тізімінен алып тастайды. Бұл процесс жадты іздеу қажеттілігін жояды және жадтың фрагментациясын азайтады. Осы контексте, slab – жадтағы бір немесе бірнеше тікелей жатқан беттер, олар алдын ала бөлінген жад бөліктерін қамтиды.
Slab allocation renders infrequent the very costly practice (in CPU time) of initialization and destruction of kernel data objects, which can outweigh the cost of allocating memory for them. When the kernel creates and deletes objects often, overhead costs of initialization can result in significant performance drops. Object caching leads to less frequent invocation of functions which initialize object state: when a slab allocated object is released after use, the slab allocation system typically keeps it cached (rather than doing the work of destroying it) ready for re use next time an object of that type is needed (thus avoiding the work of constructing and initialising a new object). With slab allocation, a cache for a certain type or size of data object has a number of pre allocated "slabs" of memory; within each slab there are memory chunks of fixed size suitable for the objects. The slab allocator keeps track of these chunks, so that when it receives a request to allocate memory for a data object of a certain type, usually it can satisfy the request with a free slot (chunk) from an existing slab. When the allocator is asked to free the object's memory, it just adds the slot to the containing slab's list of free (unused) slots. The next call to create an object of the same type (or allocate memory of the same size) will return that memory slot (or some other free slot) and remove it from the list of free slots. This process eliminates the need to search for suitable memory space and greatly alleviates memory fragmentation. In this context, a slab is one or more contiguous pages in the memory containing pre allocated memory chunks.
Тегін тізімдер
Слайб – машинадан кэшке жасалған бір жад бөлігін білдіреді, оның көлемі көбінесе бет көлемінің еселігіне тең болады. Слайб бірнеше жазбаларға бөлінеді, ал кэш клиенттік код жаңа нысандар үшін жад сұрағанда осы жазбаларды сұрайды. Сондықтан слайбтың қай бөліктері бос және қайсысы қолданылып қойғанын қадағалау қажет. Бұл әдетте "бос тізімдер" арқылы іске асырылады: жаңа нысандарды сақтауға дайын слайбтағы бос жазбалардың тізімі. Бос тізім жеке дерек құрылымы болуы мүмкін, мысалы, слайбтың қай жазбалары бос екенін көрсететін индекстер массиві, немесе ол слайбтың ішіне енгізілген болуы мүмкін. Linux SLUB жад бөлушісі бос тізімді сілтемеленген тізім түрінде сақтайды, оның әрқайсысы өкілдік ететін слайбтың бос жад аймағында тікелей сақталады.
A slab represents one memory allocation to the cache from the machine, and whose size is customarily a multiple of the page size. The slab will be divided into a number of entries, which will then be requested by the cache as the client code requests memory for new objects. It is necessary then to keep track of which parts of the slab are free to use and which ones were already occupied. This is generally done using "free lists": lists of free entries in the slab ready to store new objects. The free list may be a separate data structure, such as an array of indices indicating which entries of the slab are free, or it may be embedded within the slab. The Linux SLUB allocator keeps the free list as a linked list of pointers, each of which is stored directly in the free memory area of the slab they represent.