Tvůrce webu je i pro tebe! Postav třeba web. Bez grafika. Bez kodéra. Hned.
wz

Obsah / Utility / BUFFER / Záhlaví pole bufferů

Zdrojový kód: INCLUDE\UTIL\BUFFER.INC, UTIL\BUFFER.ASM


Záhlaví pole bufferů


; ------------- Buffer array head

struc		BUFHEAD

		resb	LIST_size	; 0: list of free buffer entries
BUFH_Lock:	resb	SPINLOCK_size	; 8: lock of buffer array
BUFH_EntrySize:	resd	1		; 0Ch: size of buffer entry (min. 8)
BUFH_BlockSize:	resd	1		; 10h: size of block (power of 2)
BUFH_BlockMask:	resd	1		; 14h: block mask (to get block head)
BUFH_Entries:	resd	1		; 18h: number of entries per block
BUFH_Reserve:	resd	1		; 1Ch: reserved block (NULL=none)

endstruc				; size 20h = 32 bytes

Záhlaví pole bufferů je struktura BUFHEAD o velikosti 32 bajtů s následujícími položkami:

Na začátku struktury je záhlaví seznamu volných alokačních položek. Protože je záhlaví na začátku struktury, může být adresa struktury předána přímo funkci (nebo makru) pro přidání nebo odebrání položky ze seznamu. Po alokaci nového bloku paměti je blok rozdělen na alokační položky a jednotlivé položky jsou začleněny do seznamu volných alokačních položek.

BUFH_Lock je zámek pro uzamknutí přístupu k poli bufferů. To umožňuje alokaci bufferů i v prostředí s více procesory.

BUFH_EntrySize je konstanta inicializovaná během kompilace a udává velikost jedné alokační položky. Minimální velikost jedné alokační položky je 8 bajtů.

BUFH_BlockSize je konstanta inicializovaná během kompilace a udává velikost bloku systémové paměti, který bude alokován při nedostatku alokačních položek. Minimální velikost alokačního bloku je 16 bajtů, maximální velikost je dána nastavením alokátoru systémové paměti během překladu - konstanta MAXMEM, typicky to je 64 KB. Velikost alokačního bloku musí být mocninou 2 a musí pojmout minimálně jednu alokační položku. Při malé velikosti bloku pojme takový blok málo alokačních položek a vzniká neefektivnost ve volném nevyužitém místě za poslední položkou. Při velké velikosti bloku vznikne neefektivnost díky nevyužitým volným alokačním položkám. Velikost bloku je proto potřeba stanovit jako kompromis podle četnosti alokací.

BUFH_BlockMask je konstanta inicializovaná během kompilace a udává masku velikosti bloku, která slouží k odvození adresy záhlaví alokačního bloku z adresy alokační položky. Přitom je využita vlastnost alokátoru systémové paměti, že všechny alokované bloky jsou zarovnány na jejich velikost (tj. např. adresa bloku 16 KB je zarovnána na násobek 16 KB).

BUFH_Entries je konstanta inicializovaná během kompilace a udává počet alokačních položek na jeden alokační blok.

BUFH_Reserve je ukazatel na rezervní alokační blok. Má-li tato proměnná hodnotu NULL, není k dispozici žádný rezervní blok. Rezervní blok je použit z důvodu, aby nedocházelo k časté alokaci a dealokaci alokačního bloku (a tím i opakované začleňování alokačních položek do řetězce) v případě časté alokace a dealokace položky na hranici vyčerpání volných položek.


; ------------- Buffer block

struc		BUFBLOCK

BUFB_Used:	resd	1		; 0: counter of used buffers
		resd	1		; 4: ...padding
BUFB_Data:				; 8: first buffer entry

endstruc				; size of head: 8 bytes

Každý alokační blok obsahuje na začátku záhlaví BUFBLOCK, které popisuje alokační položky obsažené v tomto bloku.

Položka BUFB_Used je čítač použitých (alokovaných) položek v bloku. Po alokaci nového bloku má tento čítač hodnotu 0. Čítač je inkrementován po každé alokaci alokační položky z tohoto bloku a dekrementován po dealokaci položky. Dosáhne-li čítač hodnoty 0, může být alokační blok uvolněn. Pro zvýšení efektivnosti není uvolněn hned (protože by to vyžadovalo časově náročné odpojení alokačních položek z řetězce volných položek), ale je ponechán jako rezervní blok a je zrušen jen když už jeden rezervní alokační blok je k dispozici.

Položka BUFB_Data je ukazatel na první alokační položku v bufferu.


Obsah / Utility / BUFFER / Záhlaví pole bufferů