当前位置:首页>Linux>Linux内存管理:page引用计数

Linux内存管理:page引用计数

  • 2026-03-14 02:14:07
Linux内存管理:page引用计数
Linux的内存管理是以页(Page)为核心单位展开的,物理内存被划分为一个个固定大小的页框(Page Frame),而struct page正是内核用于描述和管理每个物理页框的核心数据结构。由于系统中每个物理页都需要一个对应的struct page实例(例如,在4KB页大小的系统中,16GB内存就需要400万个struct page),其内存占用总量非常可观,维护成本也非常高。因此内核通过大量联合体(Union)来优化其结构大小,同时保证其功能的完整性。

这里主要介绍struct page中count/mapcount和flags参数。

 flags是页面标志位集合,是内存管理非常重要的部分。

count表示内核中引用该页面的次数;mapcount表示页面被进程映射的个数,对反向映射非常重要。

一、struct page数据结构

struct page的设计精髓在于联合体(Union)的大量使用——通过让不同场景下的字段共享内存空间,极大地压缩了单个struct page的大小。这是因为每个物理页都必须对应一个struct page,若结构过大,会导致“管理内存的内存”本身成为不可接受的开销。

/* * Each physical page in the system has a struct page associated with * it to keep track of whatever it is we are using the page for at the * moment. Note that we have no way to track which tasks are using * a page, though if it is a pagecache page, rmap structures can tell us * who is mapping it.--------------------------------------------------------------我们无法知道那个进程在使用一个页面,但是可以通过RMAP相关结构体知道谁映射到了此页面。 * * The objects in struct page are organized in double word blocks in * order to allows us to use atomic double word operations on portions * of struct page. That is currently only used by slub but the arrangement * allows the use of atomic double word operations on the flags/mapping * and lru list pointers also. */struct page {    /* First double word block */    unsigned long flags;        /* Atomic flags, some possibly                     * updated asynchronously */    union {        struct address_space *mapping;    /* If low bit clear, points to----------表示页面所指向的地址空间,低两位用于判断是匿名映射还是KSM页面。位1表示匿名页面,位2表示KSM页面。                         * inode address_space, or NULL.                         * If page mapped as anonymous                         * memory, low bit is set, and                         * it points to anon_vma object:                         * see PAGE_MAPPING_ANON below.                         */        void *s_mem;            /* slab first object */---------------------------用于slab分配器,slab中第一个对象的开始地址,和mapping共同占用一个字的存储空间。    };    /* Second double word */    struct {        union {            pgoff_t index;        /* Our offset within mapping. */            void *freelist;        /* sl[aou]b first free object */            bool pfmemalloc;    /* If set by the page allocator,                         * ALLOC_NO_WATERMARKS was set                         * and the low watermark was not                         * met implying that the system                         * is under some pressure. The                         * caller should try ensure                         * this page is only used to                         * free other pages.                         */        };        union {#if defined(CONFIG_HAVE_CMPXCHG_DOUBLE) && \    defined(CONFIG_HAVE_ALIGNED_STRUCT_PAGE)            /* Used for cmpxchg_double in slub */            unsigned long counters;#else            /*             * Keep _count separate from slub cmpxchg_double data.             * As the rest of the double word is protected by             * slab_lock but _count is not.             */            unsigned counters;#endif            struct {                union {                    /*                     * Count of ptes mapped in                     * mms, to show when page is                     * mapped & limit reverse map                     * searches.                     *                     * Used also for tail pages                     * refcounting instead of                     * _count. Tail pages cannot                     * be mapped and keeping the                     * tail page _count zero at                     * all times guarantees                     * get_page_unless_zero() will                     * never succeed on tail                     * pages.                     */                    atomic_t _mapcount;                    struct { /* SLUB */                        unsigned inuse:16;                        unsigned objects:15;                        unsigned frozen:1;                    };                    int units;    /* SLOB */                };                atomic_t _count;        /* Usage count, see below. */            };            unsigned int active;    /* SLAB */        };    };...}

flags是一个unsigned long类型的原子变量,每一位代表页面的一个状态标志,是内存管理各模块之间协作的核心,下面是详细解释:

enum pageflags {    PG_locked,        /* Page is locked. Don't touch. */---表示页面已经上锁了。如果该比特位置位,说明页面已经被锁定;内存管理其他模块不能访问这个页面,以防发生竞争。    PG_error,----------------------------------------------页面操作过程中发生错误会设置该位。    PG_referenced,-----------------------------------------控制页面活跃程度,在kswapd页面回收中使用。    PG_uptodate,-------------------------------------------表示页面的数据已经从块设备成功读取。    PG_dirty,----------------------------------------------表示页面内容发生改变,页面为脏,页面内容被改写后还没有和外部存储器进行同步操作。    PG_lru,------------------------------------------------表示页面加入了LRU链表,内核使用LRU链表管理活跃和不活跃页面。    PG_active,---------------------------------------------控制页面活跃成都,在kswapd页面回收中使用。    PG_slab,-----------------------------------------------用于slab分配器    PG_owner_priv_1,    /* Owner use. If pagecache, fs may use*/--页面的所有者使用,如果是page cache页面,文件系统可能使用。    PG_arch_1,---------------------------------------------与体系结构相关的页面状态位。    PG_reserved,-------------------------------------------表示该页不可被换出。    PG_private,        /* If pagecache, has fs-private data */--表示该页是有效的,。如果页面是page cache,那么包含一些文件系统相关的数据信息。    PG_private_2,        /* If pagecache, has fs aux data */----如果是page cache,可能包含fs aux data。    PG_writeback,        /* Page is under writeback */----表示页面的内容正在向块设备进行回写。#ifdef CONFIG_PAGEFLAGS_EXTENDED    PG_head,        /* A head page */    PG_tail,        /* A tail page */#else    PG_compound,        /* A compound page */-------------一个混合页面#endif    PG_swapcache,        /* Swap page: swp_entry_t in private */---表示页面处于交换缓存。    PG_mappedtodisk,    /* Has blocks allocated on-disk */    PG_reclaim,        /* To be reclaimed asap */----------表示该页马上要被回收。    PG_swapbacked,        /* Page is backed by RAM/swap */---------页面具有swap缓存功能,通常匿名页面才可以写回swap分区。    PG_unevictable,        /* Page is "unevictable"  */----表示页面不可回收。#ifdef CONFIG_MMU    PG_mlocked,        /* Page is vma mlocked */-----------表示页面对应的VMA处于locked状态。#endif#ifdef CONFIG_ARCH_USES_PG_UNCACHED    PG_uncached,        /* Page has been mapped as uncached */#endif#ifdef CONFIG_MEMORY_FAILURE    PG_hwpoison,        /* hardware poisoned page. Don't touch */#endif#ifdef CONFIG_TRANSPARENT_HUGEPAGE    PG_compound_lock,#endif    __NR_PAGEFLAGS,    /* Filesystems */    PG_checked = PG_owner_priv_1,    /* Two page bits are conscripted by FS-Cache to maintain local caching     * state.  These bits are set on pages belonging to the netfs's inodes     * when those inodes are being locally cached.     */    PG_fscache = PG_private_2,    /* page backed by cache */    /* XEN */    /* Pinned in Xen as a read-only pagetable page. */    PG_pinned = PG_owner_priv_1,    /* Pinned as part of domain save (see xen_mm_pin_all()). */    PG_savepinned = PG_dirty,    /* Has a grant mapping of another (foreign) domain's page. */    PG_foreign = PG_owner_priv_1,    /* SLOB */    PG_slob_free = PG_private,}

内核定义了一些宏,用于检查页面是否设置了某个特定标志位,或者设置、清空某个标志位。

这些宏的定义在page-flags.h中:

#define PAGEFLAG(uname, lname) TESTPAGEFLAG(uname, lname)        \    SETPAGEFLAG(uname, lname) CLEARPAGEFLAG(uname, lname)#define TESTPAGEFLAG(uname, lname)                    \static inline int Page##uname(const struct page *page)            \            { return test_bit(PG_##lname, &page->flags); }#define SETPAGEFLAG(uname, lname)                    \static inline void SetPage##uname(struct page *page)            \            { set_bit(PG_##lname, &page->flags); }#define CLEARPAGEFLAG(uname, lname)                    \static inline void ClearPage##uname(struct page *page)            \            { clear_bit(PG_##lname, &page->flags); }

以PG_lru为例:

PageLRU:检查页面是否设置了PG_lru表志位。

SetPageLRU:设置页中的PG_lru标志位。

ClearPageLRU:清除液中的PG_lry标志位。

flags处理存放上述标志位之外,还存放了page对应的zone信息。通过set_page_zone讲zone信息设置到page->flags中。

二、count和mapcount的区别

2.1 _count解释

 _count表示内核中引用该页面的次数。

_count == 0:表示该页面位空闲或即将要被释放。

_count > 0:表示该页面已经被分配切内核正在使用,暂不会被释放。

内核中操作_count的引用技术API有get_page()和put_page()。

```staticinlinevoidget_page(struct page *page){    if (unlikely(PageTail(page)))        if (likely(__get_page_tail(page)))            return;    /*     * Getting a normal page or the head of a compound page     * requires to already have an elevated page->_count.     */    VM_BUG_ON_PAGE(atomic_read(&page->_count) <= 0, page);-------判断页面_count值不能小于等于0,因为伙伴系统分配好的页面初始值位1    atomic_inc(&page->_count);-----------------------------------原子增加引用计数。}``` staticinlineintput_page_testzero(struct page *page) {   VM_BUG_ON_PAGE(atomic_read(&page->_count) == 0, page);-----_count不能为0,如果为0,说明这页面已经被释放了。   return atomic_dec_and_test(&page->_count); }

 内核还有一对常用的变种宏:

#define page_cache_get(page)        get_page(page)#define page_cache_release(page)    put_page(page)

 _count常用于内核中跟踪page页面的使用情况,常见的用法有:

(1)分配页面时_count引用计数会变成1。

分配页面函数alloc_pages()在成功分配页面后,_count引用计数应该为0,由set_page_refcounter()设置。

/* * Turn a non-refcounted page (->_count == 0) into refcounted with * a count of one. */static inline void set_page_refcounted(struct page *page){    VM_BUG_ON_PAGE(PageTail(page), page);    VM_BUG_ON_PAGE(atomic_read(&page->_count), page);    set_page_count(page1);}

(2)加入LRU链表时,page会被kswapd内核线程使用,因此_count引用计数会加1。

以malloc()为用户程序分配内存为例,发生缺页中断后do_anonymous_page()函数成功分配出来一个页面,在设置硬件PTE之前,调用lru_cache_add()函数把这个匿名页面添加到LRU链表中,在这个过程中,使用page_cache_get()宏来增加_count引用计数。

static void __lru_cache_add(struct page *page){    struct pagevec *pvec = &get_cpu_var(lru_add_pvec);    page_cache_get(page);---------------------增加计数    if (!pagevec_space(pvec))        __pagevec_lru_add(pvec);    pagevec_add(pvec, page);    put_cpu_var(lru_add_pvec);}

(3)被映射到其他用户进程pte时,_count引用计数会加1。

子进程在被创建时共享父进程地址空间,设置父进程的pte页表项内容到子进程中并增加该页面的_count计数。

(4)页面的private中私有数据。

对于PG_swapable页面,_add_to_swap_cache函数会增加count引用计数。

对于PG_private页面,主要在block模块的buffer_head中引用。

(5)内核对页面进行操作等关键路径上也会使_count引用计数加1。

2.2 _mapcount解释

 _mapcount引用计数表示这个页面被进程映射的个数,即已经映射了多少个用户pte也表。

每个用户进程地址空间都有一份独立的页表,有可能出现多个用户进程地址空间同时映射到一个物理页面的情况,RMAP反向映射系统就是利用这个特性来实现的。

_mapcount引用计数主要用于RMAP反响映射系统中。

_mapcount == -1:表示没有pte映射到页面中。

_mapcount == 0:表示只有父进程映射了页面。

匿名页面刚分配时,_mapcount引用计数初始化为0.

voidpage_add_new_anon_rmap(struct page *page,    struct vm_area_struct *vma, unsigned long address){    VM_BUG_ON_VMA(address < vma->vm_start || address >= vma->vm_end, vma);    SetPageSwapBacked(page);    atomic_set(&page->_mapcount, 0); /* increment count (starts at -1) */---------------------设为0    if (PageTransHuge(page))        __inc_zone_page_state(page, NR_ANON_TRANSPARENT_HUGEPAGES);    __mod_zone_page_state(page_zone(page), NR_ANON_PAGES,            hpage_nr_pages(page));    __page_set_anon_rmap(page, vma, address, 1);}

_mapcount > 0:表示除了父进程外还有其他进程映射了这个页面。

 设置父进程pte页表项内容到子进程中并增加该页面的_mapcount计数。

staticinlineunsignedlongcopy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm,        pte_t *dst_pte, pte_t *src_pte, struct vm_area_struct *vma,        unsigned long addr, int *rss){...    page = vm_normal_page(vma, addr, pte);    if (page) {        get_page(page);--------------------------增加_count计数        page_dup_rmap(page);---------------------增加_mapcount计数        if (PageAnon(page))            rss[MM_ANONPAGES]++;        else            rss[MM_FILEPAGES]++;    }...}

三、页面所PG_locked

PG_locked用于设置页面锁,有两个函数用于申请页面锁:lock_page()和trylock_page()。

lock_page()用于申请页面锁,如果页面锁被其他进程占用,那么睡眠等待。

trylock_page()也同样检查PG_locked位,但是不等待。如果页面的PG_locked置位,则返回false,表明有其他进程已经锁住了页面;返回true表示获取锁成功。

int __sched__wait_on_bit_lock(wait_queue_head_t *wq, struct wait_bit_queue *q,wait_on_bit_lock()------使用原子位操作,试着去置位,若已经置位,则任务被挂起,直到调用wake_up_bit()唤醒,等待的线程。可以被wake_up_bit唤醒。            wait_bit_action_f *action, unsigned mode){    do {        int ret;        prepare_to_wait_exclusive(wq, &q->wait, mode);        if (!test_bit(q->key.bit_nr, q->key.flags))            continue;        ret = action(&q->key);        if (!ret)            continue;        abort_exclusive_wait(wq, &q->wait, mode, &q->key);        return ret;    } while (test_and_set_bit(q->key.bit_nr, q->key.flags));    finish_wait(wq, &q->wait);    return 0;}void __lock_page(struct page *page){    DEFINE_WAIT_BIT(wait, &page->flags, PG_locked);-----------------------------定义在哪位上等待。    __wait_on_bit_lock(page_waitqueue(page), &wait, bit_wait_io,                            TASK_UNINTERRUPTIBLE);}/* * lock_page may only be called if we have the page's inode pinned. */staticinlinevoidlock_page(struct page *page){    might_sleep();    if (!trylock_page(page))---------------------------------------------------如果原page->flags已经被置PG_locked,则调用__lock_page进行等待使用者释放。        __lock_page(page);}#define test_and_set_bit_lock(nr, addr)    test_and_set_bit(nr, addr)staticinlineinttrylock_page(struct page *page){    return (likely(!test_and_set_bit_lock(PG_locked, &page->flags)));-----------尝试为page->flags设置PG_locked标志位,并且返回原来标志位的值。所以并不会等待。}

Linux内存管理系列文章:

Linux内存管理:物理内存初始化
Linux内存管理:页表的映射过程
Linux内存管理:内核内存的布局图
Linux内存管理:分配物理页面
Linux内存管理:slab分配器
Linux内存管理:vmalloc内存分配函数
Linux内存管理:VMA 虚拟内存空间
Linux内存管理:malloc 动态内存分配
Linux内存管理:mmap内存映射

Linux内存管理:缺页中断处理

原作者:ArnoldLu

原文地址:

https://www.cnblogs.com/arnoldlu/p/8335481.html

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-03-27 15:11:03 HTTP/2.0 GET : https://f.mffb.com.cn/a/479873.html
  2. 运行时间 : 0.126956s [ 吞吐率:7.88req/s ] 内存消耗:4,494.63kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=807c0bd431a3e1c6099bb853cdce748c
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000471s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000880s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.003091s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000400s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000793s ]
  6. SELECT * FROM `set` [ RunTime:0.000322s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000859s ]
  8. SELECT * FROM `article` WHERE `id` = 479873 LIMIT 1 [ RunTime:0.000559s ]
  9. UPDATE `article` SET `lasttime` = 1774595463 WHERE `id` = 479873 [ RunTime:0.002152s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000351s ]
  11. SELECT * FROM `article` WHERE `id` < 479873 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000587s ]
  12. SELECT * FROM `article` WHERE `id` > 479873 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001024s ]
  13. SELECT * FROM `article` WHERE `id` < 479873 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002748s ]
  14. SELECT * FROM `article` WHERE `id` < 479873 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001960s ]
  15. SELECT * FROM `article` WHERE `id` < 479873 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001435s ]
0.129134s