当前位置:首页>Linux>Linux并发控制丨自旋锁与信号量的底层博弈

Linux并发控制丨自旋锁与信号量的底层博弈

  • 2026-02-27 06:48:33
Linux并发控制丨自旋锁与信号量的底层博弈

在操作系统内核的浩瀚宇宙中,并发控制始终是最为核心且棘手的议题之一。对于嵌入式 Linux 开发者而言,理解内核如何管理共享资源的访问,不仅是编写驱动程序的基本功,更是通往系统架构师之路的必修课。Linux 内核提供了丰富多样的同步原语,其中自旋锁(Spinlock)与信号量(Semaphore)是两座最古老也最基础的丰碑。它们代表了两种截然不同的处理竞争的哲学:是耗费 CPU 时间原地等待,还是让出 CPU 进入睡眠?本文将深入剖析这两种机制的底层博弈,并探讨由此衍生出的互斥锁、读写锁以及现代的 RCU 机制。

一、并发的本质与挑战

并发编程的复杂性源于对共享资源的非原子性访问。在早期的单处理器(UP)系统中,并发主要是一种伪并发,即通过时间片轮转让多个进程在宏观上看起来是同时运行的。在严格的单核且不可抢占的内核中,竞态条件(Race Condition)极其有限,主要来源于中断。然而,随着对称多处理器(SMP)架构的普及,真正的硬件级并发成为了常态。多个 CPU 可能在同一时刻尝试修改同一个链表、同一个计数器或同一个设备寄存器。

当两个执行流(可能是两个进程,也可能是一个进程和一个中断处理程序)同时进入临界区(Critical Section)并试图修改共享数据时,如果没有适当的保护,数据的完整性就会被破坏。这种破坏往往是随机的、难以重现的,是内核崩溃和数据损坏的罪魁祸首。锁机制的引入,本质上是为了将对临界区的并行访问序列化,确保在任一时刻,只有一个执行流能持有打开临界区大门的钥匙。

二、自旋锁的设计哲学

自旋锁(Spinlock)的设计哲学非常直接且“霸道”:如果我拿不到锁,我就原地旋转(Spin),哪里也不去,直到我拿到为止。这种机制的核心在于忙等待(Busy Waiting)。

自旋锁主要是为 SMP 系统设计的。在单处理器系统中,如果内核支持抢占,持有自旋锁的线程如果被抢占,那么等待该锁的线程一旦获得 CPU 就会进入死循环(因为它等待的锁持有者没有 CPU 时间来释放锁),导致系统挂起。因此,在单处理器的非抢占内核中,自旋锁通常被优化为空操作,或者仅仅是禁止内核抢占。

自旋锁最大的特点是它不会引起调用者睡眠。这一特性决定了它可以在中断上下文(Interrupt Context)中使用。中断处理程序要求极其迅速,且不能执行任何可能导致睡眠的操作(如调度、IO 等)。如果中断处理程序需要访问共享资源,信号量和互斥锁等睡眠锁是绝对禁止的,因为它们会导致中断处理程序挂起,进而导致系统崩溃。此时,自旋锁成为了唯一的选择。

然而,霸道是有代价的。自旋锁在等待期间会持续占用 CPU 周期,这是一种纯粹的资源浪费。因此,自旋锁只适用于临界区非常短小的场景。如果临界区执行时间过长,或者等待时间超过了两次上下文切换的时间开销,那么使用自旋锁在性能上就是得不偿失的。

三、自旋锁的内核实现演进

Linux 内核中的自旋锁实现并非一成不变,它经历了从简单到复杂、从不公平到公平的演进过程。

最早期的自旋锁是基于简单的测试并设置(Test-and-Set)原子指令实现的。这种实现有一个严重的问题:不公平。当锁被释放时,所有在一个循环中自旋等待的 CPU 都会去竞争这个锁,谁抢到算谁的。在争用激烈的情况下,处于缓存局部性劣势的 CPU 可能很久都抢不到锁,导致“饥饿”现象。

为了解决这个问题,Linux 2.6.25 引入了票据自旋锁(Ticket Spinlock)。它的原理类似于银行排队叫号。锁包含两个字段:owner(当前持有者的排队号)和 next(下一个排队号)。当一个 CPU 试图获取锁时,它会原子地增加 next 字段,拿到的旧值就是自己的号码牌。然后它检查 owner 字段,直到 owner 等于自己的号码牌时,才获得锁。释放锁时,只需将 owner 加一。这种机制保证了先来后到(FIFO),彻底解决了饥饿问题。

随着 CPU 核心数的进一步增加(如 64 核甚至更多),Ticket Spinlock 暴露出了新的性能瓶颈:缓存颠簸(Cache Line Bouncing)。当锁被释放修改 owner 值时,所有自旋等待该锁的 CPU 的本地缓存都会失效,它们都需要从内存或持有锁的 CPU 缓存中重新读取最新的 owner 值,尽管只有一个 CPU 能真正获得锁。为了解决这个问题,现代 Linux 内核(特别是 x86 和 ARM64 架构)引入了队列自旋锁(Queue Spinlock 或 qspinlock)。

Qspinlock 采用了 MCS 锁(Mellor-Crummey and Scott)的思想,让等待者在各自的局部变量上自旋,而不是都在同一个全局变量上自旋。每个等待者只关注它前一个等待者的状态,从而极大地减少了缓存一致性流量,提升了大规模 SMP 系统下的扩展性。

四、自旋锁API详解

Linux 内核提供了一套宏大的自旋锁 API,以应对不同的上下文需求。

最基础的一对是 spin_lock 和 spin_unlock。它们只负责获取和释放锁,不涉及中断状态的改变。

spinlock_t my_lock;

spin_lock_init(&my_lock);

spin_lock(&my_lock);

/* 临界区 */

spin_unlock(&my_lock);

然而,在中断处理程序和进程上下文共享数据时,仅使用 spin_lock 是不安全的。假设进程 A 持有了锁,此时发生中断,中断处理程序打断了进程 A,并试图获取同一把锁。中断会一直在那里自旋等待进程 A 释放锁,但进程 A 被中断打断了,无法继续执行来释放锁。这就形成了死锁。为了避免这种情况,必须在进程上下文中获取锁的同时禁止本地中断。这就是 spin_lock_irq 和 spin_unlock_irq 的作用。

更稳健的做法是使用 spin_lock_irqsave 和 spin_unlock_irqrestore。前者在禁止中断前会保存当前的中断状态标志(Flags),后者在解锁时恢复之前的状态。这是因为我们不能假设进入临界区前中断一定是开启的,盲目地使用 spin_unlock_irq 可能会错误地在不该开启中断的时候开启了中断。

此外,还有 spin_lock_bh,它用于涉及软中断(Softirq)的场景,获取锁时会禁止下半部(Bottom Halves),但允许硬中断。

值得注意的是 raw_spinlock_t。在标准的 Linux 内核中,spinlock_t 通常就是 raw_spinlock_t。但在打上了 PREEMPT_RT 补丁的实时内核中,spinlock_t 会被转换为一种可抢占的互斥锁(睡眠锁),而 raw_spinlock_t 则保留了真正的自旋行为。

五、信号量的设计哲学

与自旋锁的“急躁”不同,信号量(Semaphore)体现了一种“随遇而安”的哲学。如果无法获取资源,当前进程会主动让出 CPU,进入睡眠状态(Blocked),直到资源可用时被唤醒。

信号量的核心思想是睡眠锁。它适用于那些可能会长时间持有的锁,或者临界区代码本身就包含可能引起睡眠的操作(如用户空间内存拷贝、内存分配、IO 操作等)。在这些场景下,让等待者睡眠可以极大地提高 CPU 的利用率,因为 CPU 可以切换去执行其他有意义的任务,而不是在空转中浪费电能。

信号量分为计数信号量和二值信号量。计数信号量允许同时有多个持有者,通常用于限制某种资源的并发访问数量(如限制同时发起的 SCSI 命令数)。当计数初始化为 1 时,它就退化为互斥的二值信号量。

信号量与 Linux 的进程调度器紧密协作。当获取失败时,当前进程会被放入该信号量的等待队列中,并将状态设置为非运行状态(TASK_INTERRUPTIBLE 或 TASK_UNINTERRUPTIBLE),然后调用调度器。

六、信号量的内核实现

在 Linux 内核中,信号量由 struct semaphore 结构体表示:

struct semaphore {

    raw_spinlock_t      lock;

    unsigned int        count;

    struct list_head    wait_list;

};

这里可以看到一个有趣的现象:信号量的底层实现依赖于自旋锁。raw_spinlock_t lock 用于保护信号量自身的 count 计数和 wait_list 等待队列的原子性操作。

信号量的操作主要由 P 操作(down)和 V 操作(up)组成。

down 操作尝试减少 count 值。如果 count 大于 0,则减一并返回,进程继续执行。如果 count 等于 0,表明资源耗尽,当前进程会被封装成一个等待节点加入 wait_list,然后进入睡眠。

up 操作增加 count 值。如果有进程在 wait_list 中等待,它会唤醒队列中的第一个进程,让其获得资源并继续执行。

down 操作有几个变种,最常用的是 down_interruptible。使用它进入睡眠的进程可以被信号(Signal)打断唤醒,通常用于响应用户的 Ctrl+C 操作。而 down 函数会导致不可中断的睡眠,这在某些对 IO 完整性要求极高的设备驱动中是必要的,但如果硬件卡死,进程将无法被杀掉(著名的 D 状态进程)。

七、互斥锁(Mutex)

虽然二值信号量可以实现互斥功能,但 Linux 内核社区认为“互斥”是一个如此通用且特殊的场景,值得拥有专门的数据结构。于是,互斥锁(Mutex)应运而生。

从实现上看,Mutex 比信号量更轻量且语义更严格。Mutex 在设计上做了一个重要的优化:乐观自旋(Optimistic Spinning)。当一个线程尝试获取 Mutex 失败时,如果它发现当前持有锁的线程正在另一个 CPU 上运行(Running 状态),那么它不会立即睡眠,而是会选择自旋一小会儿。逻辑是:既然持有者正在运行,那么它很可能马上就会释放锁,与其承担昂贵的睡眠/唤醒上下文切换开销,不如赌一把自旋等待。这种机制使得 Mutex 在某些场景下兼具了自旋锁的高性能和信号量的灵活性。

Mutex 与二值信号量在语义上也有本质区别:Mutex 有明确的“所有者”概念。谁加锁,就必须由谁解锁。这使得内核可以开启死锁检测(Lockdep)等调试功能。而信号量没有所有者限制,可以在一个进程 down,在另一个进程 up,这在同步生产者-消费者模型时非常有用。

八、读写锁(rwlock)

在很多场景下,共享数据是“读多写少”的。例如,系统配置信息或路由表,大部分时间是被读取查询,很少被修改。如果使用普通的自旋锁或互斥锁,任何时刻只允许一个执行流访问,这对于并发读取来说是一种极大的浪费。

读写锁(rwlock)解决了这个问题。它允许同时有多个读者进入临界区,但写者必须独占。

  • 当有读者持有锁时,其他读者可以继续进入,但写者必须等待。

  • 当有写者持有锁时,所有读者和其他写者都必须等待。

Linux 内核提供了自旋锁版本的读写锁(rwlock_t)和信号量版本的读写信号量(rw_semaphore)。

读写锁的一个潜在问题是“写者饥饿”。如果读者源源不断地到来,锁一直被读者轮流持有,写者可能永远没有机会获得锁。Linux 内核在某些实现中对写者赋予了更高的优先级,或者通过排队机制来缓解这个问题。

九、RCU(Read-Copy-Update)

RCU 是 Linux 内核并发控制皇冠上的明珠,由 Paul McKenney 大神引入。它是一种极其高效的、针对“读多写少”场景的无锁同步机制。

RCU 的核心思想是:读者不需要获取任何锁,直接读取数据。这听起来很疯狂,数据的一致性如何保证?答案在于“Copy-Update”。当写者需要修改数据时,它不直接修改原数据,而是分配一块新内存,将旧数据复制过去并修改,然后用原子指令将指向数据的指针更新为指向新数据。

此时,旧数据仍然可能被某些旧的读者访问。写者不能立即释放旧数据的内存。写者必须等待,直到所有在旧数据更新前就开始的读者都结束了它们的读取操作。这段等待时间被称为宽限期(Grace Period)。只有过了宽限期,旧数据才是安全的,可以被释放。

RCU 的最大优势是读者的开销几乎为零(仅需禁止内核抢占或简单的内存屏障),且不需要原子操作指令,这对 CPU 缓存极其友好。它被广泛应用于网络路由表、文件描述符表等高频读取的场景。但 RCU 的写操作开销较大,且编程模型比锁复杂,不适合写操作频繁的场景。

十、如何选择合适的锁

面对如此多的同步原语,开发者该如何选择?以下是一套通用的决策逻辑:

  1. 上下文环境:如果在中断上下文(硬中断、软中断、Timer)中,或者持有锁期间不能睡眠,必须使用自旋锁(spinlock)或其 RCU 变体。绝不能使用信号量或互斥锁。

  2. 临界区长度:如果临界区非常短(简单的变量修改、链表操作),自旋锁通常是更好的选择,因为上下文切换的开销远大于自旋几十个周期的开销。如果临界区很长,包含复杂逻辑或 IO 操作,应选择互斥锁(mutex)。

  3. 并发模式:如果是严格的互斥,首选 Mutex。如果是资源计数,使用信号量。如果是读多写少,考虑读写锁。如果是读极其频繁且对旧数据有一定的容忍度,RCU 是性能王者。

Linux 之父 Linus Torvalds 曾对 Spinlock vs Mutex 有过经典论述。他倾向于在核心内核代码中尽可能使用 Mutex,因为 Mutex 的乐观自旋机制已经能处理很多短临界区的情况,而且 Mutex 对调度器更友好。滥用自旋锁如果不当,容易造成 CPU 资源的极大浪费,甚至导致系统卡顿。

十一、死锁与优先级反转

锁是双刃剑,使用不当会伤及自身。最常见的问题是死锁(Deadlock)。

最典型的死锁是 ABBA 死锁:线程 1 拿了锁 A 等锁 B,线程 2 拿了锁 B 等锁 A。解决这个问题的铁律是:所有代码必须以相同的顺序获取锁。内核提供了 lockdep 工具来动态检测这种潜在的死锁风险。

另一个棘手的问题是优先级反转(Priority Inversion)。假设有三个进程:高优先级 H,中优先级 M,低优先级 L。L 持有一个互斥锁。H 试图获取该锁并睡眠等待。此时 M 开始运行,因为 M 优先级高于 L,它抢占了 L 的 CPU。结果是:H 在等 L 释放锁,但 L 被 M 抢占了无法运行。最终导致高优先级的 H 被中优先级的 M 阻塞了,这在实时系统中是灾难性的。

解决方案是优先级继承(Priority Inheritance)。当 H 等待 L 持有的锁时,内核临时将 L 的优先级提升到 H 的水平,让 L 尽快执行完临界区并释放锁,之后再恢复原来的优先级。Linux 的 Mutex 实现支持优先级继承(RT Mutex)。

十二、PREEMPT_RT与锁机制的变化

随着实时 Linux(Real-Time Linux)项目逐渐并入主线,锁机制也发生了微妙的变化。在开启了 CONFIG_PREEMPT_RT 的内核中,为了降低系统的调度延迟,绝大多数传统的 spinlock_t 被强制转换为可睡眠的 rt_mutex

这意味着在 RT 内核中,即使在持有 spinlock 的临界区内,进程也是可以被高优先级任务抢占的。这打破了传统内核“持有自旋锁不可抢占”的铁律。为了保留底层硬件操作所需的真正自旋行为(例如在调度器本身的代码中),内核引入了 raw_spinlock_t。对于驱动开发者来说,除非你在编写极底层的系统核心代码,否则应继续使用标准的 spinlock_t,内核会自动处理这层映射。

自旋锁与信号量,一个是寸步不让的坚守,一个是退一步海阔天空的智慧。它们构成了 Linux 内核并发控制的基石,支撑起这庞大系统的高效运转。理解它们的底层博弈,就是理解 Linux 内核的灵魂。

还不知道如何下手学习单片机开发?信盈达精心整理《单片机全能学习包》,学习书籍、软件工具包、课件教案、项目原理图、芯片手册、例程代码、视频教程等一次性全部送上!助你快速升级打BOSS。大家可以添加下方小助手领取~

 添加小助手   领取学习包  

添加后回复 “单片机” 更快领取哦

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-28 21:28:48 HTTP/2.0 GET : https://f.mffb.com.cn/a/476100.html
  2. 运行时间 : 0.077361s [ 吞吐率:12.93req/s ] 内存消耗:4,532.37kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=5c191104e324889c564b0bad5dc74ed8
  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.000400s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000522s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000242s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000277s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000469s ]
  6. SELECT * FROM `set` [ RunTime:0.000184s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000494s ]
  8. SELECT * FROM `article` WHERE `id` = 476100 LIMIT 1 [ RunTime:0.000413s ]
  9. UPDATE `article` SET `lasttime` = 1772285328 WHERE `id` = 476100 [ RunTime:0.000498s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000204s ]
  11. SELECT * FROM `article` WHERE `id` < 476100 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000346s ]
  12. SELECT * FROM `article` WHERE `id` > 476100 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000360s ]
  13. SELECT * FROM `article` WHERE `id` < 476100 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001086s ]
  14. SELECT * FROM `article` WHERE `id` < 476100 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000906s ]
  15. SELECT * FROM `article` WHERE `id` < 476100 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000633s ]
0.079956s