IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:System Calls

共 5 篇相关文章

IT 累计浏览 2,850

通过call_usermodehelper()在内核态执行用户程序

这篇讲的是如何在 Linux 内核中“跨界”执行用户空间的程序。作者从内核开发者常遇到的需求出发,介绍了 `call_usermodehelper()` 这个内核API。 文章指出了它的核心作用:让运行在内核态的代码(比如模块或驱动)能够主动启动并执行一个用户空间的可执行文件或系统命令,就像在 shell 里敲命令一样。作者还提到了一个关键的实现细节:这个函数最终会调用内核的 `do_execve()`,这和用户态的 `execve()` 系统调用在底层“殊途同归”,但调用路径和上下文完全不同。 为了说明如何使用,文章给出了一个加载函数的代码片段示例,演示了调用该API的基本结构。对于需要在内核逻辑中动态触发外部脚本或工具进行日志收集、环境配置等场景,这个接口提供了一条直接通道,理解它有助于编写更灵活的内核模块。

IT 累计浏览 4,174

Linux下访问文件的基本模式

这篇讲的是Linux内核中几种常见的文件访问方式,作者从底层机制出发,对比了普通模式、同步模式、直接I/O、异步模式以及内存映射这五种模式的运作原理与核心差异。 普通模式依赖页高速缓存,读阻塞、写缓存即返回,是默认的平衡选择。同步模式则通过置位O_SYNC标志,强制写操作直到数据落盘才返回,代价是更高的延迟,但确保了数据持久性。直接I/O(O_DIRECT)完全绕过页高速缓存,在用户空间与磁盘间直接传输,适合数据库等需要自主管理缓存的场景。异步模式通过aio系列系统调用实现非阻塞I/O,进程提交请求后可立即返回处理其他任务,提升了并发处理能力。内存映射则通过mmap将文件映射到进程地址空间,把文件操作转化为内存操作,简化了编程模型并可能提升大文件访问效率。 文章清晰地拆解了每种模式下内核标志位的状态与数据流路径,帮助开发者理解不同I/O策略的适用场景——比如高性能存储系统可能倾向于直接I/O或异步模式,而追求开发简便性的应用则更适合内存映射。通过对比这些模式的适用场景和实现机制,文章为开发者提供了选择I/O策略的清晰指引。

IT 累计浏览 6,335

malloc()之后,内核发生了什么?

作者从一个常见的用户空间操作出发,即进程调用 `malloc()` 后尝试访问内存,一路追踪到内核空间的真实发生过程。文章的核心在于揭示,用户感知到的“内存分配”在内核层面主要通过 `brk` 系统调用来实现,其背后是一套从修改堆描述符到最终响应缺页异常的精密机制。 讲解路径非常清晰:首先,`malloc()` 会触发 `brk` 系统调用,通过 `SYSCALL_DEFINE1(brk,...)` 服务例程来调整进程的堆边界。文中展示了该例程如何检查资源限制、对齐地址,并根据是扩大还是缩小堆,分别调用 `do_brk()` 或 `do_munmap()`。 文章的巧妙之处在于指出,此时内核通常并未立即分配物理内存。`do_brk()` 的核心工作是在进程的虚拟地址空间中分配或合并一个线性区间(VMA),为后续可能的操作“预留地盘”。真正的魔法发生在第二步:当进程首次访问这块新地址时,CPU 会因页表项无效而触发缺页异常。文章接着深入异常处理流程,从 `page_fault` 入口,到 `do_page_fault()` 判断异常类型,最终由 `handle_mm_fault()` 接手。 在 `handle_mm_fault()` 中,内核才开始真正“分配”物理内存——它确保页目录结构完整,然后调用 `handle_pte_fault()` 完成页框的分配与映射。整个过程生动地体现了 Linux 内存管理中“延迟分配”的核心思想:先给予虚拟承诺,待实际使用时再兑现物理资源,从而优化了内存使用效率。这对于理解内存分配的全链路至关重要。

IT 累计浏览 4,231

记一次tps提升,做的配置变更

这篇讲的是作者如何将一个php应用的TPS从120稳定提升至810的实战过程。 文章开篇直面问题:系统TPS低下、响应慢、并发能力差。作者从应用代码入手,借助xhprof定位瓶颈,优化了如避免高频内核调用、用memcached缓存数据等细节。随后,思路扩展到整个服务栈的配置调优。 在php层面,通过禁用不必要的模块、重新编译、配置php-fpm等方式节约资源。Web服务器Nginx侧,则涉及worker进程数、epoll模型、keep-alive、gzip压缩及静态资源处理等关键配置。更深层的,作者对操作系统进行了“瘦身”:精简守护进程、调整文件描述符限制、优化磁盘挂载参数。 整个过程的转折点在于对内核参数的精细调整。通过sysctl优化TCP连接、缓冲区等设置后,系统不仅TPS达标,性能曲线也趋于稳定。作者总结道,提升TPS的核心在于缩短单个请求的响应时间,并可通过strace等工具分析,从减少上下文切换和系统调用入手,最终实现更少资源开销下的更高吞吐。

IT 累计浏览 1,829

获取文件大小之前最好先读一下这个文件

这篇讲的是一个在Windows开发中容易被忽略的陷阱:使用`stat`函数获取的文件大小可能不可靠。 作者从一个具体场景出发,指出了问题所在——有时通过`stat`得到的文件大小,会与资源管理器中显示的大小或实际读取的大小存在差异。这往往会导致后续的文件读取、内存分配或网络传输逻辑出现错误。文章深入分析了根源,通常与文件系统的缓存、写入后未及时同步或某些特定文件系统的特性有关,使得元数据中的大小信息并非实时准确。 针对这个问题,作者没有停留在发现问题,而是给出了经过验证的解决方案:在依赖文件大小信息前,不妨先实际读取一下文件(哪怕只读取一部分)。这种方法虽然增加了一次I/O操作,却能确保你获得的大小信息与后续操作的真实数据完全一致,从而避免因元数据不准而引发的难以排查的bug。文章最后强调,对于需要精确文件信息的场景,这种“以读取为准”的策略是更稳健的做法。