Linux 命令与系统调用实战:内核这家“外包公司“是怎么接单的
Linux 命令与系统调用实战内核这家外包公司是怎么接单的系列导言如果把 Linux 内核想象成一家软件外包公司那么——用户态程序就是甲方爸爸只会提需求自己啥活儿都干不了内核就是外包公司手里掌握着 CPU、内存、磁盘、网卡这些生产资源**系统调用System Call**就是甲方填写的标准工单是唯一被公司认可的合规沟通渠道glibc则是前台小姐姐把甲方的口语C 库函数翻译成标准工单再递交/proc文件系统就是公司大堂里那块实时业务看板谁在干活、用了多少内存全写着呢。本文是《趣谈 Linux 操作系统》风格的实战第一篇。所有输出均来自一台真实的云服务器不是虚拟机里跑的 demo是华为云 FlexusX 上的真机你可以照着命令一模一样复现。0. 实验环境说明项目配置机器华为云 FlexusXecs-44ec-0001系统Ubuntu 24.04.4 LTS内核6.8.0-106-genericx86_64SMP PREEMPT_DYNAMICCPU8 核AuthenticAMD每核 2 线程内存16 GiB工具gcc 13.3.0、strace、sysstatpidstat环境准备命令已在机器上执行apt-getupdate-qqapt-getinstall-y-qqgccmakestracesysstat gcc--version|head-1# gcc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.01. 引子甲方为什么不能直接进门想象你是甲方想往屏幕上打印一句话。你说“喂内核把这段字写到 1 号显示器上”内核冷冷地回你一句“本公司谢绝面访请走工单系统系统调用。”为什么会这样因为内核管理着所有资源如果谁都能直接冲进机房改内存、抢 CPU整个系统早就乱套了。于是 CPU 设计了两种工作模式用户态User Mode甲方活动区权限很低不能直接碰硬件内核态Kernel Mode外包公司机房权限最高。两者之间的唯一门禁就是系统调用。它用一条特殊的 CPU 指令syscall/sysenter让 CPU 从用户态**陷入trap**内核态内核干完活再返回用户态。一次系统调用的完整旅程如下甲方程序(用户态) 内核(内核态) ┌──────────┐ 1.填工单 ┌──────────────┐ │ printf() │ ───────────────► │ syscall 指令 │ │ (glibc) │ CPU 陷入内核态 │ 查表 dispatch│ └──────────┘ └──────┬───────┘ ▲ │ 2.执行系统调用 │ 4.返回结果 ▼ │ ┌──────────────┐ └──────────────────────── │ 真正的硬件操作 │ │ write 到终端 │ └──────────────┘下面我们就一步步偷看这家公司是怎么接单、干活的。2. 实验一先认识这家公司基础命令巡楼甲方第一次来总得先看看公司有多大、几个人、在跑什么业务。下面这组命令就是巡楼。2.1 看看公司的营业执照和组织架构uname-alscpu|head-15cat/etc/os-release|head-3真实输出$ uname -a Linux ecs-44ec-0001 6.8.0-106-generic #106-Ubuntu SMP PREEMPT_DYNAMIC Fri Mar 6 07:58:08 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux $ lscpu | head -15 Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 8 On-line CPU(s) list: 0-7 Vendor ID: AuthenticAMD BIOS Vendor ID: Huawei Cloud Model name: General Purpose Processor BIOS Model name: pc-i440fx-7.1 CPU 2.0GHz BIOS CPU family: 1 CPU family: 25 Model: 17 Thread(s) per core: 2 Core(s) per socket: 4 $ cat /etc/os-release | head -3 PRETTY_NAMEUbuntu 24.04.4 LTS NAMEUbuntu VERSION_ID24.04解读uname -a告诉我们内核版本是6.8.0-106-genericSMP表示支持多 CPU 对称多处理PREEMPT_DYNAMIC是 Ubuntu 内核的抢占模式可在实时/吞吐之间动态切换。lscpu显示 8 个逻辑 CPU4 核 × 2 线程——这就是外包公司的8 个项目经理。2.2 看看都在跑哪些项目进程和负荷psaux|head-8top-bn1|head-15df-hipaddr|head-20真实输出节选$ ps aux | head -8 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.5 0.0 22672 13980 ? Ss 12:49 0:02 /sbin/init noibrs root 2 0.0 0.0 0 0 ? S 12:49 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 12:49 0:00 [pool_workqueue_release] root 4 0.0 0.0 0 0 ? I 12:49 0:00 [kworker/R-rcu_g] root 5 0.0 0.0 0 0 ? I 12:49 0:00 [kworker/R-rcu_p] $ top -bn1 | head -15 top - 12:56:37 up 7 min, 1 user, load average: 0.06, 0.11, 0.09 Tasks: 170 total, 1 running, 169 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 98.9 id, 1.1 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 15131.9 total, 14025.7 free, 603.1 used, 776.6 buff/cache MiB Swap: 0.0 total, 0.0 free, 0.0 used. 14528.8 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND 1 root 20 0 22672 13980 9536 S 0.0 0.1 0:02.29 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd $ df -h Filesystem Size Used Avail Use% Mounted on tmpfs 1.5G 1.1M 1.5G 1% /run /dev/vda1 40G 3.3G 35G 9% / tmpfs 7.4G 0 7.4G 0% /dev/shm $ ip addr | head -20 1: lo: LOOPBACK,UP,LOWER_UP mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo 2: eth0: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc mq state UP group default qlen 1000 link/ether fa:16:3e:bc:14:92 brd ff:ff:ff:ff:ff:ff inet 192.168.0.126/24 brd 192.168.0.255 scope global dynamic noprefixroute eth0解读ps里PID 1是systemd/sbin/init它是所有用户态进程的老祖宗方括号[kthreadd]、[kworker/*]是中括号包起来的内核线程——它们是公司正式员工不是甲方项目。top第一行load average: 0.06, 0.11, 0.09是把门大爷记的排队人数98.9 id表示 CPU 98.9% 在闲着喝茶。df -h看磁盘ip addr看网卡。这些命令底层全都是系统调用statfs查磁盘、getifaddrs/netlink查网卡。3. 实验二用 strace 偷看工单长什么样strace是内核调试的狗仔队它能记录一个进程发出的所有系统调用。有了它我们终于能看见工单的原始模样。3.1 统计一个命令发了多少张工单strace-cls/tmp真实输出节选-c是调用统计% time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 26.92 0.000119 6 18 mmap 10.63 0.000047 9 5 read 9.05 0.000040 4 9 close 8.82 0.000039 5 7 openat 8.37 0.000037 7 5 mprotect 6.79 0.000030 15 2 getdents64 5.88 0.000026 3 8 fstat 3.85 0.000017 8 2 2 statfs 1.81 0.000008 8 1 write 1.36 0.000006 2 2 2 access 1.13 0.000005 5 1 1 ioctl ... ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000442 5 74 5 total解读你以为ls /tmp只是列个目录它其实一口气提交了74 张工单其中openat打开文件/目录7 次、getdents64读取目录项2 次、mmap映射内存18 次、write输出到终端1 次。就连打印一行目录这种小事甲方都得层层报批。3.2 只盯某一种工单openatstrace-etraceopenatcat/etc/hostname真实输出openat(AT_FDCWD, /etc/ld.so.cache, O_RDONLY|O_CLOEXEC) 3 openat(AT_FDCWD, /lib/x86_64-linux-gnu/libc.so.6, O_RDONLY|O_CLOEXEC) 3 openat(AT_FDCWD, /usr/lib/locale/locale-archive, O_RDONLY|O_CLOEXEC) 3 openat(AT_FDCWD, /etc/hostname, O_RDONLY) 3 ecs-44ec-0001 exited with 0 解读cat /etc/hostname在读取目标文件之前先按规矩打开了三样东西/etc/ld.so.cache—— 动态链接器找库的电话簿/lib/x86_64-linux-gnu/libc.so.6—— C 运行库本体因为cat是用 C 写的得先把自己依赖的库加载进来/usr/lib/locale/locale-archive—— 字符集/语言环境。最后才openat(AT_FDCWD, /etc/hostname, O_RDONLY) 3 3表示内核返回的文件描述符fd是 3然后readwrite把内容打印出来。注意AT_FDCWD这个参数——它是相对于当前工作目录的意思相当于工单上写就在这栋楼里找。3.3 再瞥一眼write/readstrace-etracewrite,readechohelloread(3, \177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0\0\1\0\0\0\220\243\2\0\0\0\0\0..., 832) 832 write(1, hello\n, 6hello ) 6 exited with 0 read(3, \177ELF...)就是从刚打开的libc.so.6里读 ELF 头write(1, hello\n, 6)的1就是标准输出 fd6是写出 6 个字节hello 换行。一切皆文件、一切皆工单。4. 实验三自己手写一张工单C syscall()前面都是甲方让前台glibc代填工单。现在我们来越过前台自己用syscall()直接把工单塞进内核。4.1 代码#includeunistd.h#includesys/syscall.h#includesys/types.h#includestdio.hintmain(void){pid_tpid;/* 直接用 syscall() 进入内核绕过 glibc 封装 */pid(pid_t)syscall(SYS_getpid);/* 获取当前进程 PID */charbuf[128];intlensnprintf(buf,sizeof(buf),Hello from syscall! pid%d\n,(int)pid);syscall(SYS_write,1,buf,(long)len);/* 直接写 stdout(fd1) */return0;}编译运行gcc-O2-osyscall_demo syscall_demo.c ./syscall_demo真实输出Hello from syscall! pid72834.2 用 strace 验证它确实走了 syscallstrace-etracewrite,getpid ./syscall_demogetpid() 7287 write(1, Hello from syscall! pid7287\n, 29Hello from syscall! pid7287 ) 29 exited with 0 解读我们在代码里明明写的是syscall(SYS_getpid)和syscall(SYS_write)但strace把它们还原成了人类可读的名字getpid()和write()。这是因为syscall()的第一个参数就是系统调用号SYS_getpid在 x86_64 上等于39、SYS_write等于1。内核和 strace 都靠这个号查表认人。注意两次运行的 PID 不同7283 vs 7287是正常的——每次运行都是内核新孵化的一个进程PID 自然不一样。4.3 系统调用号到底是多少在 x86_64 上可以这样查节选grep-Egetpid|write/usr/include/x86_64-linux-gnu/asm/unistd_64.h# #define __NR_write 1# #define __NR_getpid 39所以syscall(SYS_write, 1, buf, len)等价于syscall(1, 1, buf, len)——第一个1是写这个工单类型第二个1是写给 1 号终端。5. 实验四glibc 封装 vs 直接 syscall前台代填 vs 自己填既然syscall()能直接填工单那我们平时写的getpid()、write()这些函数和syscall()有啥区别答案是getpid()这类 C 库函数是glibc 在前台帮你填好的标准工单。大多数情况下两者殊途同归但有一个重要例外——vDSO虚拟动态共享对象。5.1 两种写法对比#includestdio.h#includeunistd.h#includesys/syscall.hintmain(void){pid_tagetpid();/* 方式Aglibc 前台代填 */pid_tb(pid_t)syscall(SYS_getpid);/* 方式B自己直接填 */printf(glibc getpid() %d\n,(int)a);printf(syscall(SYS_getpid) %d\n,(int)b);return0;}编译运行gcc-O2-oglibc_vs_syscall glibc_vs_syscall.c ./glibc_vs_syscall# glibc getpid() 7763# syscall(SYS_getpid) 7763strace看两者strace-etracegetpid,write ./glibc_vs_syscallgetpid() 7916 getpid() 7916 write(1, glibc getpid() 7916\nsysc..., 56glibc getpid() 7916 syscall(SYS_getpid) 7916 ) 56 exited with 0 解读strace把两种写法都显示为getpid()——因为它们最终都提交了同一张工单调用号 39。strace 在系统调用边界工作它只认调用号分不清你是前台代填还是自己填。5.2 真正的区别vDSO连门都不用进但是getpid是个例外glibc 会缓存它。更能说明问题的是clock_gettime——glibc 版本根本不进门直接在大堂vDSO就把事办了。#includestdio.h#includetime.h#includesys/syscall.hintmain(void){structtimespects;clock_gettime(CLOCK_MONOTONIC,ts);/* 方式Aglibc走 vDSO */printf(glibc clock_gettime: %ld.%09ld\n,(long)ts.tv_sec,ts.tv_nsec);syscall(SYS_clock_gettime,CLOCK_MONOTONIC,ts);/* 方式B强制真正陷入内核 */printf(syscall clock_gettime: %ld.%09ld\n,(long)ts.tv_sec,ts.tv_nsec);return0;}gcc-O2-ovdso_demo vdso_demo.c ./vdso_demo# glibc clock_gettime: 682.901563927# syscall clock_gettime: 682.901589317关键证据在这里strace-etraceclock_gettime ./vdso_democlock_gettime(CLOCK_MONOTONIC, {tv_sec682, tv_nsec904706838}) 0 glibc clock_gettime: 682.904575004 syscall clock_gettime: 682.904706838 exited with 0 重点来了strace只抓到了一次clock_gettime——就是我们用syscall()强制发出的那一次而glibc版本的clock_gettime根本没出现在 strace 里。为什么因为获取时间这种高频操作如果每次都陷入内核开销太大。内核于是把一段读时钟的代码映射到每个进程的地址空间里这就是vDSO / 虚拟动态共享对象glibc 直接调用这段代码连系统调用都不用发起自然 strace 也看不见。一句话总结这个实验写法是否真陷入内核strace 能否看见性能clock_gettime()glibc否走 vDSO看不见最快syscall(SYS_clock_gettime, ...)是真正 syscall看得见较慢有上下文切换getpid()vssyscall(SYS_getpid)都是真 syscall都看见接近外包公司类比vDSO 就像公司给老客户发的自助取号机——取个号而已犯不着每次都敲工单、进机房自己在大堂机器上戳一下就完事。而强硬用syscall()相当于非要填纸质工单、走审批流程慢但动作标准、有据可查。6. 实验五/proc—— 公司大堂的实时业务看板内核这家公司很透明它在/proc这个伪文件系统里实时晒出所有进程的状态。你用cat读一个文件读的其实是内核现场拼出来的数据——这背后又是系统调用openatread。6.1 看看自己的股东信息/proc/self/status/proc/self是个魔法软链接指向当前进程自己。cat/proc/self/status|head-10真实输出Name: cat Umask: 0022 State: R (running) Tgid: 8238 Ngid: 0 Pid: 8238 PPid: 8237 TracerPid: 0 Uid: 0 0 0 0 Gid: 0 0 0 0解读Name: cat说明这份状态是cat命令自己读自己时生成的State: R (running)表示它正在跑Pid/PPid是我的工号和我老板的工号。这就是内核实时吐给你的员工档案。6.2 看看 1 号进程公司创始人 systemd的工位ls/proc/1/|head-40tr\0 /proc/1/cmdline;echohead-8/proc/1/statushead-5/proc/1/maps真实输出$ ls /proc/1/ arch_status attr autogroup auxv cgroup clear_refs cmdline comm coredump_filter cpu_resctrl_groups cpuset cwd environ exe fd fdinfo gid_map io ksm_merging_pages ksm_stat latency limits loginuid map_files maps mem mountinfo mounts mountstats net ns numa_maps oom_adj oom_score oom_score_adj pagemap patch_state personality projid_map root sched schedstat sessionid setgroups smaps smaps_rollup stack stat statm status syscall task timens_offsets uid_map wchan $ tr \0 /proc/1/cmdline; echo /sbin/init noibrs $ head -8 /proc/1/status Name: systemd Umask: 0000 State: S (sleeping) Tgid: 1 Ngid: 0 Pid: 1 PPid: 0 TracerPid: 0 $ head -5 /proc/1/maps 5e6101d35000-5e6101d3b000 r--p 00000000 fd:01 12087 /usr/lib/systemd/systemd 5e6101d3b000-5e6101d46000 r-xp 00006000 fd:01 12087 /usr/lib/systemd/systemd 5e6101d46000-5e6101d4c000 r--p 00011000 fd:01 12087 /usr/lib/systemd/systemd 5e6101d4c000-5e6101d4e000 r--p 00016000 fd:01 12087 /usr/lib/systemd/systemd 5e6101d4e000-5e6101d4f000 rw-p 00018000 fd:01 12087 /usr/lib/systemd/systemd解读/proc/1/cmdline显示创始人的启动命令是/sbin/init noibrs——也就是 systemdState: S (sleeping)表示 1 号进程平时在睡觉等活干而不是忙死/proc/1/maps是它的内存地图每一行是一段虚拟地址区间后面跟着权限r-xp表示可读可执行即代码段和映射的文件。这正是外包公司给每个员工分配的办公区平面图。后面《进程管理实战》那篇我们会大量用到/proc/pid/status、/proc/pid/maps、/proc/pid/task来观察 fork、线程、调度这里先混个脸熟。7. 原理全景图把今天所有实验串起来甲方的一次打印请求完整的链路是┌──────────────────────────────────────────────────────────────┐ │ 用户态甲方活动区 │ │ │ │ printf(hi) │ │ │ (glibc 前台把口语翻译成标准工单) │ │ ▼ │ │ write(1, hi, 2) ── 也可以自己 syscall(SYS_write,...) ──┐ │ │ │ │ │ └──────┼─────────────────────────────────────────────────────────┤ │ syscall 指令 (CPU 从用户态陷入内核态) ◄───────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────┐ │ 内核态外包公司机房 │ │ │ │ 系统调用分发表 (sys_call_table[__NR_write]) │ │ │ │ │ ▼ │ │ sys_write() → VFS → 终端驱动 → 把字节送到屏幕 │ │ │ │ │ ▼ 返回结果返回值/errnoCPU 切回用户态 │ └──────────────────────────────────────────────────────────────┘ │ ▼ /proc 看板被同步更新进程的 sys_write 计数 1mermaid版本便于在支持渲染的平台查看也可绕过clock_gettime 等高频调用甲方程序 printfglibc 封装 writesyscall 指令陷入内核内核 sys_call_table 查表sys_write 实际干活返回用户态vDSO 自助机8. 总结今天我们用外包公司的视角把 Linux 系统调用这条主线摸了一遍系统调用是用户态与内核态之间唯一的合规通道靠syscall/sysenter指令陷入内核strace是偷看工单的神器-c统计、-e trace过滤一眼看清程序到底跟内核要了啥syscall()让你越过 glibc 直接填工单系统调用号如write1, getpid39是内核认人的依据glibc 封装 ≠ 直接 syscall多数情况殊途同归但clock_gettime这类高频调用被 glibc 通过vDSO优化掉了连内核门都不用进/proc是内核的实时看板进程的状态、内存地图、命令行全在里面而且读它本身就是系统调用。理解了工单系统下一篇我们就能顺理成章地深入公司内部的人事管理——进程怎么生fork、怎么死exit、多线程怎么共用一间办公室、调度器CFS怎么分配 CPU 时间片。9. 思考题欢迎在评论区交作业strace -c ls /tmp显示mmap被调用了 18 次为什么列目录需要映射这么多内存vDSO 把代码映射到用户空间那它读的时钟从哪来如果映射的代码有 bug会不会让用户程序提权提示vDSO 由内核维护地址随机化既然syscall()能直接干活为什么我们平时几乎都写glibc函数而不是syscall()提示可移植性、系统调用号随架构变化、glibc 的缓存与错误处理/proc/self/status里PPid是父进程那谁是所有进程的祖宗它又是被谁启动的实验环境华为云 FlexusXecs-44ec-0001Ubuntu 24.04.4 LTS内核6.8.0-106-genericgcc 13.3.0strace 6.8。所有命令与输出均来自该真机可复现。

相关新闻

破局 AI 应用黑盒:LangSmith 全链路调试+评估实战,从入门到企业级项目落地

破局 AI 应用黑盒:LangSmith 全链路调试+评估实战,从入门到企业级项目落地

一、引言:告别 AI 应用"盲盒式"开发,LangSmith 破局核心痛点在 LangChain 应用开发中,你是否经常遇到这样的情况:RAG 问答输出了错误答案却不知道是检索环节出了问题还是模型生成环节出了偏差?Agent 明明配置…

2026/7/31 4:32:19 阅读更多 →
7.1、传输层的可靠数据传输

7.1、传输层的可靠数据传输

7.1、传输层的可靠数据传输 在计算机网络中,传输层(Transport Layer)位于应用层和网络层之间,其主要职责之一是为上层应用提供可靠的数据传输服务。无论是浏览网页、发送邮件,还是在线视频通话,用户都期望…

2026/7/31 4:32:19 阅读更多 →
电子产品开发服务商选择指南与技术评估要点

电子产品开发服务商选择指南与技术评估要点

1. 电子产品开发服务商选择的核心考量作为一家专注电子产品研发的企业,实邦电子在寻找开发服务商时积累了不少实战经验。选择合作伙伴绝非简单的比价过程,而是需要从技术实力、行业经验、项目管理等多维度综合评估的复杂决策。我曾见证过不少企业因选错开…

2026/7/31 4:31:19 阅读更多 →

最新新闻

快速上手:logging 基础用法

快速上手:logging 基础用法

1、logging 基础语法意思 日志级别:level DEBUG 调试 INFO 普通信息 WARN、WARNING 警告 ERROR 错误 FATAL、CRITICAL 致命 日志格式:format %(name)s 日志实例名 默认是root %(levelname)s 日志级别英文名 %(me…

2026/7/31 5:09:34 阅读更多 →
OpenUtau:开启你的虚拟歌手创作之旅,从零到一的音乐魔法

OpenUtau:开启你的虚拟歌手创作之旅,从零到一的音乐魔法

OpenUtau:开启你的虚拟歌手创作之旅,从零到一的音乐魔法 【免费下载链接】OpenUtau Open singing synthesis platform / Open source UTAU successor 项目地址: https://gitcode.com/gh_mirrors/op/OpenUtau 想象一下,你坐在电脑前&am…

2026/7/31 5:09:34 阅读更多 →
想在北京办理宽带的话都需要提前了解哪些相关的注意事项?

想在北京办理宽带的话都需要提前了解哪些相关的注意事项?

家人们谁懂啊,前前后后在北京换了三次房办了三次宽带,踩过的坑能绕我出租屋三圈,最近新换的沃方宽宽带用着太顺了,特意整理了普通人办宽带前一定要摸清楚的几个点,真的能省超多麻烦,完全避开大家都怕的“被…

2026/7/31 5:09:34 阅读更多 →
Rust开发实战:从桌面应用到系统编程的双线探索

Rust开发实战:从桌面应用到系统编程的双线探索

1. 从“挖掘机”到“播放器”:一个Rust开发者的双线实战最近在社区里看到不少朋友在讨论Rust,话题从“巨型挖掘机”到“音乐播放器”,跨度不小,乍一看有点摸不着头脑。其实,这恰恰反映了Rust语言当前的两个典型应用场景…

2026/7/31 5:09:34 阅读更多 →
AI+Three.js飞行模拟器开发:从3D模型生成到Web交互实现

AI+Three.js飞行模拟器开发:从3D模型生成到Web交互实现

如果你正在寻找一个能快速验证 Three.js 能力的实战项目,或者想了解 AI 如何改变 3D 内容创作流程,那么 Opus 5 结合 Three.js 生成飞行模拟器的案例,绝对值得你花 10 分钟读完。过去,开发一个基础的飞行模拟器,需要处…

2026/7/31 5:09:33 阅读更多 →
从 curl 到工程封装:实时公交到站接口集成实践

从 curl 到工程封装:实时公交到站接口集成实践

适用场景 实时公交到站数据是出行场景的基础组件,常见于以下应用: 公交电子站牌:动态显示下趟车到站时间,替代传统静态时刻表;出行助手 App:在路线规划中嵌入具体车次到达预估,让用户掌握候车时…

2026/7/31 5:08:33 阅读更多 →

日新闻

物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:34 阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:34 阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:34 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻