当前位置:首页>Linux>彻底搞懂Linux内核同步神兵:信号量(Semaphore)

彻底搞懂Linux内核同步神兵:信号量(Semaphore)

  • 2026-07-04 02:43:42
彻底搞懂Linux内核同步神兵:信号量(Semaphore)

大家好,我是蟹老板~

在Linux内核开发中,并发控制是一个绕不开的槛。当多个进程或线程同时访问同一块共享资源时,如果没有一套合理的秩序机制,数据乱套、系统崩溃就是分分钟的事。

那么问题来了——Linux内核是如何保证“文明排队”的?

这就是今天我们要聊的并发控制领域重量级选手——信号量(Semaphore) 。

Part1信号量是什么?

想象一个场景:市中心有一个超火的地下停车场,只有 5 个车位。门口有个保安大爷,手里拿着 5 张停车牌。

  • 来一辆车,大爷发一张牌(车位减1)。

  • 牌发完了,第6辆车来了怎么办?大爷会说:“没车位了,你先熄火在旁边睡一觉,等里面有车出来还了牌,我再叫醒你。”

这就是信号量。

在Linux内核中,信号量是由计算机科学家Dijkstra(对,就是那个最短路径算法的大佬)发明的。它本质上是一个包含计数器的睡眠锁与自旋锁“得不到锁就疯狂占用CPU空转”不同,信号量在拿不到资源时,会主动把CPU让出来,让当前进程进入睡眠状态,实现同步与互斥

那么,这位“大爷”在内核里究竟长什么样呢?咱们接着往下看。

信号量分为两种

  • 二进制信号量:值只能是0或1,用于实现互斥锁,确保同一时刻只有一个进程访问共享资源。

  • 计数信号量:值可以大于1,用于控制对多个相同资源(比如3台打印机、5个数据库连接)的并发访问数量。

Part2原理剖析

明白了“是什么”,接下来看“怎么做到的”。

信号量核心构成有三点:

  1. 整数计数器:记录当前可用的共享资源数量,初始值由用户设定;

  2. 等待队列:当计数器为0(无资源可用)时,申请资源的线程会被放入等待队列,进入阻塞状态;

  3. 原子操作:对计数器的增减操作是原子的(不可打断),避免并发修改计数器导致的错乱。

这里必须区分一个常见误区:信号量 vs 互斥锁(mutex)。很多人会混淆两者,其实核心区别很简单:

互斥锁只能实现“一对一”互斥(同一时刻只有一个线程访问资源),计数器只能是0或1(二元信号量);信号量可以实现“多对多”同步(允许N个线程同时访问资源),计数器可以是任意非负整数。

要真正懂一个机制,必须看它的数据结构,在Linux内核源码中,信号量的定义位于include/linux/semaphore.h

struct semaphore {    raw_spinlock_t      lock;       // 保护信号量本身的自旋锁    unsigned int        count;      // 核心资源计数器    struct list_head    wait_list;  // 睡眠等待队列(那些熄火等车位的人)};

解读一下这三个成员:

  1. count(车位):这就是资源的数量。如果 count = 1,它就退化成了二值信号量(类似互斥锁Mutex);如果 count > 1,就是计数信号量。

  2. wait_list(等候区):一个双向链表。当申请不到资源时,内核会把当前进程打包成一个等待节点(waiter),挂到这个链表上,然后让进程休眠。

  3. lock(保安的警棍):为了防止多个进程同时修改 count 或 wait_list 造成数据混乱,内核用了一个极其轻量级的底层的自旋锁来保护这俩兄弟。

结构如此清晰,那么它是如何运转的呢?

这就不得不提到操作系统课本上大名鼎鼎的 P/V 操作了。

Part3工作机制

在Linux内核中,P操作(申请资源)被称为 down(),V操作(释放资源)被称为 up()。这名字非常直观:资源数量下降和上升。

3.1 下降:down() 的底层逻辑

当你调用 down(&sem) 时,内核会发生什么?

  • 首先,获取内部自旋锁 lock

  • 检查 count。如果 count > 0,谢天谢地,直接 count--,释放 lock,拿走资源继续干活。

  • 如果 count == 0 呢? 核心戏码来了。内核会调用 __down() 慢速路径:

    1. 把当前进程的状态设置为 TASK_UNINTERRUPTIBLE(深度睡眠,外界用 kill -9 都杀不掉)。

    2. 把自己加入到 wait_list 中。

    3. 调用 schedule() 触发进程调度,当前进程正式交出CPU使用权

(注:实战中我们更推荐用 down_interruptible(),它允许进程被信号打断,避免变僵尸进程。)

3.2 上升:up() 的唤醒魔法

当某个进程用完资源,调用 up(&sem)

  • 依然先拿 lock

  • 如果 wait_list 为空(没人排队),直接 count++ 走人。

  • 如果 wait_list 里有人排队,内核不会增加 count,而是直接从队列头部取出一个休眠的进程,把它唤醒(调用 wake_up_process()),让它继承这个刚释放的资源。

关键点:当一个进程拿不到信号量时,它会“睡觉”——即被移出运行队列,CPU可以去执行别的任务。等到信号量被释放时,再被唤醒。这就是信号量区别于自旋锁的核心特征。

Part4实操:信号量使用

聊完原理,该上手实操了。Linux内核提供了丰富的信号量API,我们先看初始化

4.1 初始化信号量

信号量的初始化分为两种方式:静态初始化和动态初始化,根据信号量的定义位置(全局/局部)选择。

(1)静态初始化(推荐全局信号量)

使用宏DEFINE_SEMAPHORE(),直接定义并初始化信号量,计数器初始值为1(默认互斥模式)。

#include<linux/semaphore.h>// 静态初始化信号量,name为信号量名称,计数器初始值=1DEFINE_SEMAPHORE(my_sem);

适用于信号量定义在全局,无需手动释放,内核会自动管理其生命周期的场景。

(2)动态初始化(推荐局部信号量)

使用sema_init()函数,手动初始化信号量,可自定义计数器初始值。

#include<linux/semaphore.h>// 定义信号量(局部变量)struct semaphore my_sem;// 动态初始化:第一个参数是信号量指针,第二个参数是计数器初始值sema_init(&my_sem, 5); // 计数器初始值=5,允许5个线程同时访问

注意事项:动态初始化的信号量,若定义在栈上,需确保其生命周期覆盖使用场景,避免野指针。

4.2 核心操作函数

信号量的核心操作只有两个:获取信号量(P操作,计数器减1)释放信号量(V操作,计数器加1),内核提供了不同函数适配不同场景。

(1)获取信号量(P操作)

常用三个函数,重点区分阻塞/非阻塞、可中断/不可中断:

// 1. 不可中断阻塞(不推荐使用)// 计数器减1,若为0则一直阻塞,直到有信号量释放,无法被信号中断down(&my_sem);// 2. 可中断阻塞(推荐使用)// 计数器减1,若为0则阻塞,可被信号(如Ctrl+C)中断,返回非0值int ret = down_interruptible(&my_sem);// 3. 非阻塞(尝试获取,不阻塞)// 计数器减1,若为0则直接返回非0值(获取失败),不阻塞线程int ret = down_trylock(&my_sem);

(2)释放信号量(V操作)

只有一个常用函数up(),无论哪种获取方式,释放时统一调用:

// 计数器加1,若有线程在等待队列中,唤醒其中一个线程up(&my_sem);

注意:释放信号量的线程,必须是之前获取过该信号量的线程,否则会导致计数器错乱,引发系统异常。

4.3 函数返回值详解(避坑关键)

down()函数无返回值(一直阻塞),而down_interruptible()和down_trylock()有返回值,必须根据返回值判断操作结果,否则会踩坑。

// 示例:正确使用down_interruptible()int ret = down_interruptible(&my_sem);if (ret != 0) {    // 被信号中断,获取失败,需释放已占资源,返回错误码    printk("获取信号量被中断\n");    return -ERESTARTSYS; // 内核推荐的中断返回码}// 临界区:访问共享资源(如设备寄存器、全局变量)// ...// 释放信号量up(&my_sem);

返回值说明:

  • 返回0:获取信号量成功,可进入临界区;

  • 返回非0:获取失败(down_interruptible()被信号中断,down_trylock()无资源可用),需做错误处理。

Part5实战案例

理论讲再多,不如实战练一遍。下面两个案例,都是驱动开发中高频用到的信号量场景。

案例1:简单的字符设备互斥访问

需求:实现一个字符设备,多个线程同时读写设备时,保证同一时刻只有一个线程访问(互斥),用信号量实现。

#include<linux/module.h>#include<linux/fs.h>#include<linux/semaphore.h>// 定义设备号、文件操作结构体、信号量dev_t dev_num;struct file_operations fops;DEFINE_SEMAPHORE(dev_sem); // 静态初始化,计数器=1(互斥)// 读设备函数ssize_tdev_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos){    int ret;    // 获取信号量(可中断)    ret = down_interruptible(&dev_sem);    if (ret != 0) {        return -ERESTARTSYS;    }    // 临界区:模拟读设备操作(实际开发中替换为真实读写逻辑)    printk("设备读操作:正在读取数据\n");    msleep(1000); // 模拟耗时操作    // 释放信号量    up(&dev_sem);    return count;}// 写设备函数ssize_tdev_write(struct file *filp, constchar __user *buf, size_t count, loff_t *f_pos){    int ret;    // 获取信号量(可中断)    ret = down_interruptible(&dev_sem);    if (ret != 0) {        return -ERESTARTSYS;    }    // 临界区:模拟写设备操作    printk("设备写操作:正在写入数据\n");    msleep(1000);    // 释放信号量    up(&dev_sem);    return count;}// 初始化文件操作结构体struct file_operations fops = {    .read = dev_read,    .write = dev_write,    .owner = THIS_MODULE,};// 模块初始化staticint __init dev_init(void){    // 申请设备号    alloc_chrdev_region(&dev_num, 01"my_dev");    // 注册字符设备    cdev_init(&cdev, &fops);    cdev_add(&cdev, dev_num, 1);    printk("字符设备初始化成功,信号量生效\n");    return 0;}// 模块卸载staticvoid __exit dev_exit(void){    cdev_del(&cdev);    unregister_chrdev_region(dev_num, 1);    printk("字符设备卸载成功\n");}module_init(dev_init);module_exit(dev_exit);MODULE_LICENSE("GPL");

信号量dev_sem计数器初始值为1,确保read和write函数同一时刻只有一个被执行,避免多线程读写冲突。

案例2:限制并发连接数的网络驱动

需求:实现一个网络驱动,限制最大并发连接数为3,超过3个连接时,新连接阻塞等待,用信号量实现。

#include<linux/module.h>#include<linux/netdevice.h>#include<linux/semaphore.h>// 定义信号量,计数器=3(限制3个并发连接)struct semaphore conn_sem;#define MAX_CONN 3// 模拟网络连接函数intnet_connect(void){    int ret;    // 尝试获取信号量(非阻塞,避免长期阻塞)    ret = down_trylock(&conn_sem);    if (ret != 0) {        printk("并发连接数已达上限,等待空闲连接\n");        // 非阻塞失败,转为可中断阻塞等待        ret = down_interruptible(&conn_sem);        if (ret != 0) {            return -ERESTARTSYS;        }    }    // 临界区:建立网络连接    printk("建立网络连接,当前并发数:%d\n", MAX_CONN - conn_sem.count);    return 0;}// 模拟网络断开函数voidnet_disconnect(void){    // 释放信号量,增加并发名额    up(&conn_sem);    printk("断开网络连接,当前并发数:%d\n", MAX_CONN - conn_sem.count);}// 模块初始化staticint __init net_dev_init(void){    // 动态初始化信号量,计数器=MAX_CONN    sema_init(&conn_sem, MAX_CONN);    printk("网络驱动初始化成功,最大并发连接数:%d\n", MAX_CONN);    return 0;}module_init(net_dev_init);MODULE_LICENSE("GPL");

信号量conn_sem计数器初始值为3,每建立一个连接获取信号量(计数器减1),断开连接释放信号量(计数器加1),从而限制最大并发连接数。

Part6经验分享

6.1 信号量使用的黄金法则

  • 优先使用down_interruptible():避免使用down()(不可中断),否则线程会一直阻塞,即使收到中断信号也无法退出,容易导致系统死锁;

  • 保持临界区最小化:获取信号量后,只执行必要的共享资源操作,尽快释放信号量,减少其他线程的等待时间;

  • 信号量与资源一一对应:一个信号量控制一个共享资源,避免多个资源共用一个信号量,导致逻辑混乱;

  • 避免嵌套获取信号量:不要在一个信号量的临界区中,再获取另一个信号量,容易引发死锁(比如线程A持有信号量1,等待信号量2;线程B持有信号量2,等待信号量1)。

6.2 常见错误及解决方法

错误1:忘记释放信号量,导致死锁

场景:获取信号量后,临界区中出现错误,直接return,未释放信号量,导致其他线程一直等待。

解决方法:使用goto语句,错误时跳转到释放信号量的位置,确保无论是否出错,都能释放信号量。

int ret = down_interruptible(&my_sem);if (ret != 0) {    return -ERESTARTSYS;}// 临界区操作ret = do_something();if (ret != 0) {    goto out// 出错时跳转到释放信号量的位置}out:up(&my_sem); // 确保释放信号量return ret;

错误2:信号中断处理不当

场景:down_interruptible()被信号中断后,未做错误处理,直接继续执行临界区操作。

解决方法:判断返回值,若为非0,立即退出,不执行临界区操作,避免非法访问共享资源。

错误3:计数器初始值设置错误

场景:需要互斥访问时,计数器初始值设为大于1,导致多个线程同时进入临界区。

解决方法:互斥场景用静态初始化(默认计数器=1),或动态初始化时设为1;同步场景根据实际并发数设置计数器。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-04 12:30:50 HTTP/2.0 GET : https://f.mffb.com.cn/a/488466.html
  2. 运行时间 : 0.326807s [ 吞吐率:3.06req/s ] 内存消耗:4,656.13kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=606e71b01a70b4d2f1459ecfce0c138f
  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.000651s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000839s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000328s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000248s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000475s ]
  6. SELECT * FROM `set` [ RunTime:0.000196s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000545s ]
  8. SELECT * FROM `article` WHERE `id` = 488466 LIMIT 1 [ RunTime:0.016163s ]
  9. UPDATE `article` SET `lasttime` = 1783139450 WHERE `id` = 488466 [ RunTime:0.014096s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000342s ]
  11. SELECT * FROM `article` WHERE `id` < 488466 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.006012s ]
  12. SELECT * FROM `article` WHERE `id` > 488466 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.027084s ]
  13. SELECT * FROM `article` WHERE `id` < 488466 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.047490s ]
  14. SELECT * FROM `article` WHERE `id` < 488466 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.038253s ]
  15. SELECT * FROM `article` WHERE `id` < 488466 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.103593s ]
0.329283s