zoukankan      html  css  js  c++  java
  • 内存管理相关数据结构之pg_data_t

    承接内存管理相关概念讲解相关数据结构。主要有

    • pg_data_t: 表示节点;
    • zone: 内存域;
    • page: 页帧;

    pglist_data定义如下:

    typedef struct pglist_data {
        struct zone node_zones[MAX_NR_ZONES];
        struct zonelist node_zonelists[MAX_ZONELISTS];
        int nr_zones;
    #ifdef CONFIG_FLAT_NODE_MEM_MAP /* means !SPARSEMEM */
        struct page *node_mem_map;
    #ifdef CONFIG_PAGE_EXTENSION
        struct page_ext *node_page_ext;
    #endif
    #endif
    #ifndef CONFIG_NO_BOOTMEM
        struct bootmem_data *bdata;
    #endif
    #ifdef CONFIG_MEMORY_HOTPLUG
        /*
         * Must be held any time you expect node_start_pfn, node_present_pages
         * or node_spanned_pages stay constant.  Holding this will also
         * guarantee that any pfn_valid() stays that way.
         *
         * pgdat_resize_lock() and pgdat_resize_unlock() are provided to
         * manipulate node_size_lock without checking for CONFIG_MEMORY_HOTPLUG.
         *
         * Nests above zone->lock and zone->span_seqlock
         */
        spinlock_t node_size_lock;
    #endif
        unsigned long node_start_pfn;
        unsigned long node_present_pages; /* total number of physical pages */
        unsigned long node_spanned_pages; /* total size of physical page
                             range, including holes */
        int node_id;
        wait_queue_head_t kswapd_wait;
        wait_queue_head_t pfmemalloc_wait;
        struct task_struct *kswapd; /* Protected by
                           mem_hotplug_begin/end() */
        int kswapd_max_order;
        enum zone_type classzone_idx;
    #ifdef CONFIG_NUMA_BALANCING
        /* Lock serializing the migrate rate limiting window */
        spinlock_t numabalancing_migrate_lock;
    
        /* Rate limiting time interval */
        unsigned long numabalancing_migrate_next_window;
    
        /* Number of pages migrated during the rate limiting time interval */
        unsigned long numabalancing_migrate_nr_pages;
    #endif
    
    #ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT
        /*
         * If memory initialisation on large machines is deferred then this
         * is the first PFN that needs to be initialised.
         */
        unsigned long first_deferred_pfn;
        /* Number of non-deferred pages */
        unsigned long static_init_pgcnt;
    #endif /* CONFIG_DEFERRED_STRUCT_PAGE_INIT */
    } pg_data_t;
    
    • node_zones是一个数组,包含节点中各内存域(ZONE_DMA, ZONE_DMA32, ZONE_NORMAL...)的数据结构;
    • node_zonelists指定了节点的备用列表;
    • nr_zones 指示了节点中不同内存域数目;
    • node_mem_map描述节点的所有物理内存页面。包含节点的所有内存域;
    • bdata 系统启动自举内存分配器数据结构实例;
    • node_start_pfn 当前NUMA节点第一页帧逻辑编号。在UMA总是0.
    • node_present_pages节点中页帧的数目;
    • node_spanned_pages节点以页帧为单位计算的数目。由于空洞的存在可能不等于node_present_pages,应该是大于等于node_present_pages;
    • node_id是全局节点ID;
    • kswapd_wait:node的等待队列,交换守护列队进程的等待列表
    • kswapd_max_order:需要释放的区域的长度,以页阶为单位

    若系统节点多余一个,则内核会维护一个位图用于提供每个节点的状态信息,状态信息为一个enum。定义如下:

    enum node_states {
        N_POSSIBLE,     /* The node could become online at some point */
        N_ONLINE,       /* The node is online */
        N_NORMAL_MEMORY,    /* The node has regular memory */
    #ifdef CONFIG_HIGHMEM
        N_HIGH_MEMORY,      /* The node has regular or high memory */
    #else
        N_HIGH_MEMORY = N_NORMAL_MEMORY,
    #endif
    #ifdef CONFIG_MOVABLE_NODE
        N_MEMORY,       /* The node has memory(regular, high, movable) */
    #else
        N_MEMORY = N_HIGH_MEMORY,
    #endif
        N_CPU,      /* The node has one or more cpus */
        NR_NODE_STATES
    };
    
  • 相关阅读:
    SQLMAP注入教程-11种常见SQLMAP使用方法详解
    VS2012/2013/2015/Visual Studio 2017 关闭单击文件进行预览的功能
    解决 IIS 反向代理ARR URLREWRITE 设置后,不能跨域跳转 return Redirect 问题
    Spring Data JPA one to one 共享主键关联
    JHipster 问题集中
    Spring Data JPA 定义超类
    Spring Data JPA查询关联数据
    maven命名
    maven仓库
    Jackson读取列表
  • 原文地址:https://www.cnblogs.com/linhaostudy/p/12679441.html
Copyright © 2011-2022 走看看