Heim >Backend-Entwicklung >PHP-Tutorial >Nginx erweiterte Datenstruktur-Quellcode-Analyse (3) ----- verknüpfte Liste

Nginx erweiterte Datenstruktur-Quellcode-Analyse (3) ----- verknüpfte Liste

WBOY
WBOYOriginal
2016-07-30 13:30:261004Durchsuche

ngx_list_t ist ein von Nginx gekapselter Container für verknüpfte Listen, der häufig verwendet wird. Es hat zwei Strukturen: ngx_list_t beschreibt die gesamte verknüpfte Liste und ngx_list_part_t beschreibt nur ein Element der verknüpften Liste. Zum besseren Verständnis können wir es eine verknüpfte Liste von Arrays nennen. Mit anderen Worten, ngx_list_t ist ein Container für verknüpfte Listen und die Elemente in der verknüpften Liste sind ein Array. Tatsächlich sind es die Elemente im Array ngx_list_part_t, die der Benutzer speichern muss.

Was sind die Vorteile eines solchen Strukturausdrucks:

(1) Die in der verknüpften Liste gespeicherten Elemente sind flexibel, es kann jede Art von Datenstruktur sein

(2) Der von den verknüpften Listenelementen belegte Speicher wird von ngx_list_t verwaltet, der über das Array zugewiesen wurde; >

(3) Der Zugriff auf kleine Speicherblöcke über verknüpfte Listen ist ineffizient, aber die Verwendung von Arrays für den Zugriff auf den Speicher über Offsets ist viel effizienter.

Definition der ngx_list_t-Struktur:

typedef struct {
    ngx_list_part_t  *last;     //指向链表的最后一个数组元素
Definition der ngx_list_part_t-Struktur:
    ngx_list_part_t   part;     //链表的首个数组元素
    size_t            size;     //每一个用户要存储的一个数据必须小于或等于size
    ngx_uint_t        nalloc;   //表示数组元素的个数还是每个数组元素中的元素个数???问徐
    ngx_pool_t       *pool;     //内存池对象
} ngx_list_t;

Array-verknüpfte Liste initialisieren:

struct ngx_list_part_s {
    void             *elts;     //指向数组的起始地址
    ngx_uint_t        nelts;    //表示数组中已经用了多少个元素
    ngx_list_part_t  *next;     //下一个链表元素的地址
};

static ngx_inline ngx_int_t
ngx_list_init(ngx_list_t *list, ngx_pool_t *pool, ngx_uint_t n, size_t size)//初始化链表
{
    list->part.elts = ngx_palloc(pool, n * size);//申请第一个数组元素的内存???应该是申请整个数组链表的                                                 //内存 问徐,弄清楚了
    if (list->part.elts == NULL) {
        return NGX_ERROR;
    }

    list->part.nelts = 0;    //开始数组元素中只有0个元素
    list->part.next = NULL;
    list->last = &list->part;//指向第一个节点
    list->size = size;
    list->nalloc = n;
    list->pool = pool;//内存池对象

    return NGX_OK;
}
Array-verknüpfte Liste erstellen:

ngx_list_t *
ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size)//创建一个链表
{
    ngx_list_t  *list;

    list = ngx_palloc(pool, sizeof(ngx_list_t));//申请ngx_list_t的内存
    if (list == NULL) {
        return NULL;
    }

    if (ngx_list_init(list, pool, n, size) != NGX_OK) {//调用初始化函数对ngx_list_t初始化
        return NULL;
    }

    return list;
}
Neue Elemente hinzufügen:

void *
ngx_list_push(ngx_list_t *l)
{
    void             *elt;
    ngx_list_part_t  *last;

    last = l->last;

    if (last->nelts == l->nalloc) {//判断最后一个数组节点是否没有空间了

        /* the last part is full, allocate a new list part */

        last = ngx_palloc(l->pool, sizeof(ngx_list_part_t));//再申请一个节点的内存
        if (last == NULL) {
            return NULL;
        }

        last->elts = ngx_palloc(l->pool, l->nalloc * l->size);//申请节点的存储内存
        if (last->elts == NULL) {
            return NULL;
        }

        last->nelts = 0;
        last->next = NULL;

        l->last->next = last;//更新这两个变量
        l->last = last;
    }

    elt = (char *) last->elts + l->size * last->nelts;//返回可以插入元素的内存地址
    last->nelts++;

    return elt;
}

Urheberrechtserklärung: Dieser Artikel ist das Original von Blogger Artikel dürfen nicht ohne Genehmigung des Bloggers reproduziert werden.

Das Obige stellt die erweiterte Datenstruktur-Quellcode-Analyse (3) von Nginx vor, einschließlich Aspekten des Inhalts. Ich hoffe, dass es für Freunde hilfreich sein wird, die an PHP-Tutorials interessiert sind.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn