ZONE(9)

명칭
zbootinit, zinitna, zinit, zalloc, zfree, zalloci, zfreei, - 존 allocater

서식
<sys/param.h> <sys/queue.h> <vm/vm_zone.h> void zbootinit(vm_zone_t z, char *name, int size, void *item, int nitems) int zinitna(vm_zone_t z, struct vm_object *obj, char *name, int size, int nentries, int flags, int zalloc) vm_zone_t zinit(char *name, int size, int nentries, int flags, int zalloc) void * zalloc(vm_zone_t z) void zfree(vm_zone_t z, void *item) void * zalloci(vm_zone_t z) void zfreei(vm_zone_t z, void *item)

해설
존 allocater는 동적으로 크기를 결정할 수 있는 유사한 크기의 항목의 집합을 관리하기 위한 효율적인 인터페이스를 제공합니다. 존 allocater는 실행시에 할당할 수 있었던 존은 물론, 미리 할당할 수 있고 있는 존에 대해서도 사용할 수가 있어 또 그 때문에, 다른 메모리 메니지먼트 routine보다 부트 프로세스의 것보다 빠른 단계에서 이용 가능합니다.

존은 신장성이 있는 동일한 크기의 항목의 집합입니다. 존 allocater는 어느 항목이 사용중인가 그렇지 않은 것인지를 잃지 않게 해, 존으로부터 항목을 할당하기 위한 함수 및 해방해 되돌린다 (다음에의 사용을 위해서(때문에) 항목을 이용 가능하게 한다) 유익의 함수를 제공합니다.

구조체를 존 allocater로 관리해, 할당의 사이에 묻어 끝난 필드를 남기는 것으로 형태가 고정이 되는 존의 특성을 사용하고 싶은 경우, 존 allocater가 내부에서 사용하는 선두 2 개의 포인터를 이 구조체가 예약해 둘 필요가 있습니다.

    struct my_item {
            struct my_item  *z_rsvd1;
            struct my_item  *z_rsvd2;
            /* 구조체의 나머지의 부분 */
    };

그렇게 하지 않는 경우, 각각의 할당의 다음에 이러한 엔트리가 망가졌다고 간주해야 합니다. 항목의 최초의 할당의 다음에는, 0 에 클리어 되고 있습니다. 그러나 거기에 계속되는 할당에서는, 최근 해방된 것이 내용으로서 남아 있겠지만, 전술의 필드는 예외입니다.

존은 부트 프로세스가 얼마나 진척 하고 있을까에 의존해, 2 개의 유파의 의식 중 한편으로 작성됩니다.

VM 시스템이 완전하게 초기화되고 있는 경우에는, zinit() (을)를 사용해 동적으로 할당존을 작성할 수 있습니다. name 인수는 존을 위한 짧은 기술적인 이름에의 포인터여야 합니다. 이것은 통계와 데밧깅 목적을 위해서(때문에) 사용됩니다. size 및 nentries (은)는 각각, 존에 의해 보관 유지되는 항목의 크기 및 그 존의 초기의 크기 (항목수로)입니다. 세치기 문맥 중(안)에서 존으로부터 항목이 할당기회가 있다 경우에는, flags 인수는 ZONE_INTERRUPT (으)로 설정되어야 합니다. 이 경우, 존은 결코 nentries 항목보다 커지지 않는 것에 주의해 주세요. 다른 모든 경우에는 flags (은)는 0 으로 설정되어야 합니다. 마지막 인수 zalloc (은)는 존이 가득하게 될 때에 그 존이 커져야 할 VM 페이지의 수를 나타냅니다.

VM 시스템이 아직도 완전하게 초기화되어 있지 않은 경우에는, 존 allocater는 항목으로 나누고 주기 위한 VM 페이지를 동적으로 할당일을 할 수 없습니다. 그 때문에, 호출측이 정적인 항목의 풀을 공급할 필요가 있습니다. 이 경우, 2 개의 단계에서 초기화가 완료합니다. 최초로, 존의 최초의 사용 전에 zbootinit() 하지만 불려 가 다음에 VM 시스템이 기동했을 때에, zinitna() 의 호출에 의해 그 존의 초기화가 완료됩니다.

zbootinit() 에의 최초의 인수는 초기화되어야 한다 정적인 struct vm_zone 에의 포인터입니다. 2 번째와 3 번째는 존의 이름과 보관 유지되는 항목의 크기입니다. 4 번째의 인수는 존이 완전하게 초기화될 때까지 에 존 allocater가 거기로부터 꺼낼 것이다 정적인 항목의 배열에의 포인터입니다. nitems 인수는 배열중의 항목수입니다.

zinitna 에의 인수는 zinit 에의 물건과 같습니다만, 초기화되어야 할 존에의 포인터, 및 ZONE_INTERRUPT 의 경우에 거기로부터 페이지를 할당유익의 struct vm_object 에의 포인터가 더해지고 있습니다.

존으로부터 항목을 할당위해(때문에)는, 단순하게 그 존의 포인터를 따라 zalloc() (을)를 호출합니다. 이것은 항목에의 포인터를, 또는, 존안의 모든 항목이 사용중으로 한편 allocater가 존을 크게 할 수 없는 보기 드문 경우에는, NULL (을)를, 돌려줍니다. zalloc() (은)는 세치기 세이프는 아닌 것에 주의해 주세요. 세치기 세이프인 할당을 위해서(때문에)는 zalloc() (와)과 같은 시멘틱스를 가진다 zalloci() (을)를 사용합니다.

항목은 그 존에의 포인터 및 그 항목에의 포인터를 따랐다 zfree() (을)를 호출에 의해, 할당라고 있던 존에 해방해 되돌려집니다. zalloci() 하지만 사용되어 행해진 할당의 경우에는 대응한다 zfreei() 함수를 사용합니다.

반환값
zinitna() 함수는 성공시에는 1 을 그리고 실패시에는 0 을 돌려줍니다. 유일한 실패의 경우는 끼어들어 세이프인 존을 위한 address 공간을 미리 할당없는 것입니다.

zinit() 함수는 완전하게 초기화되었다 struct vm_zone 에의 포인터를, 또는 struct vm_zone (을)를 malloc() 할 수 없었던 경우인가 ZONE_INTERRUPT 플래그가 설정되어 있어 zinitna() 하지만 address 공간의 전 할당에 실패했을 경우에 NULL (을)를, 돌려줍니다.

zalloc() 함수는 항목에의 포인터를, 또는 존의 미사용 항목이 부족해 allocater가 존을 확장할 수 없는 경우에 NULL (을)를, 돌려줍니다.

관련 항목
malloc(9)

역사
존 allocater는 FreeBSD 3.0 그리고 처음 등장했습니다.

저자
-nosplit 존 allocater는 John S. Dyson 하지만 썼습니다.

이 메뉴얼 페이지는 Dag-Erling Coïdan Smørgrav <des@FreeBSD.org> 하지만 썼습니다.