Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
一次系统调用开销到底有多大?_创想鸟

一次系统调用开销到底有多大?

我们经常听说系统调用的开销比函数调用大得多,因此需要尽量减少系统调用的次数来提高代码性能。那么,系统调用的具体开销是多少呢?它需要消耗多少cpu时间?

1

系统调用概述

系统调用是用户程序与内核进行交互的机制。当代码需要进行I/O操作(如open、read、write)、内存操作(如mmap、sbrk)或获取网络数据时,必须通过系统调用来实现。无论你使用的是什么编程语言,如PHP、C、Java还是Go,只要你的程序运行在Linux内核上,就无法避免系统调用。

一次系统调用开销到底有多大?图1 系统调用在计算机系统中的位置

你可以使用strace命令查看程序正在执行的系统调用。例如,查看一个在生产环境中运行的nginx的系统调用情况如下(可能需要左右滑动查看完整内容):

# strace -p 28927Process 28927 attachedepoll_wait(6, {{EPOLLIN, {u32=96829456, u64=140312383422480}}}, 512, -1) = 1accept4(8, {sa_family=AF_INET, sin_port=htons(55465), sin_addr=inet_addr("10.143.52.149")}, [16], SOCK_NONBLOCK) = 13epoll_ctl(6, EPOLL_CTL_ADD, 13, {EPOLLIN|EPOLLRDHUP|EPOLLET, {u32=96841984, u64=140312383435008}}) = 0epoll_wait(6, {{EPOLLIN, {u32=96841984, u64=140312383435008}}}, 512, 60000) = 1

2

使用strace命令进行实验

通过对线上运行的nginx进行strace统计,我们可以看到系统调用的耗时大约在1-15微秒(μs)之间。因此,可以得出系统调用的耗时通常在微秒级别。当然,由于不同系统调用执行的操作和环境不同,耗时会有所波动(可能需要左右滑动查看完整内容)。

# strace -cp 8527strace: Process 8527 attached% time     seconds  usecs/call     calls    errors syscall------ ----------- ----------- --------- --------- ---------------- 44.44    0.000727          12        63           epoll_wait 27.63    0.000452          13        34           sendto 10.39    0.000170           7        25        21 accept4  5.68    0.000093           8        12           write  5.20    0.000085           2        38           recvfrom  4.10    0.000067          17         4           writev  2.26    0.000037           9         4           close  0.31    0.000005           1         4           epoll_ctl

3

使用time命令进行实验

我们手动编写一段代码来测试read系统调用,代码如下:

#include #include #include 

int main() {char c;int in;int i;

in = open("in.txt", O_RDONLY);for(i=0; i<1000000; i++) {    read(in, &c, 1);}close(in);return 0;

}

注意,只能使用read库函数进行测试,不要使用fread,因为fread是用户态库函数,带有缓存,而read每次调用都会触发一次系统调用。

首先,创建一个大小为1MB的文件:

dd if=/dev/zero of=in.txt bs=1M count=1

然后编译并运行代码进行测试:

# gcc main.c -o main

time ./main

real 0m0.258suser 0m0.030ssys 0m0.227s

由于上述实验循环了100万次,因此平均每次系统调用的耗时大约为200纳秒(ns)左右。

4

使用Perf命令查看系统调用消耗的CPU指令数

x86-64 CPU具有特权级别的概念。内核运行在最高级别(Ring0),用户程序运行在Ring3。当用户态程序需要访问磁盘等外设时,必须通过系统调用进行特权级别的切换。

普通函数调用通常只需要几次寄存器操作和用户栈操作,而系统调用则需要从用户态切换到内核态,涉及到内核栈和寄存器的切换,如SS、ESP、EFLAGS、CS和EIP寄存器。此外,系统调用还可能导致缓存和TLB页表缓存的命中率下降,并需要进行权限校验和有效性检查。因此,系统调用的开销远大于函数调用。

我们使用perf命令计算每个系统调用需要执行的CPU指令数(可能需要左右滑动查看完整内容):

# perf stat ./mainPerformance counter stats for './main':251.508810 task-clock                #    0.997 CPUs utilized1 context-switches          #    0.000 M/sec1 CPU-migrations            #    0.000 M/sec97 page-faults               #    0.000 M/sec600,644,444 cycles                    #    2.388 GHz                     [83.38%]122,000,095 stalled-cycles-frontend   #   20.31% frontend cycles idle    [83.33%]45,707,976 stalled-cycles-backend    #    7.61% backend  cycles idle    [66.66%]1,008,492,870 instructions              #    1.68  insns per cycle         #    0.12  stalled cycles per insn [83.33%]177,244,889 branches                  #  704.726 M/sec                   [83.32%]7,583 branch-misses             #    0.00% of all branches         [83.33%]

将for循环中的read调用注释掉后,再次编译并运行:

# gcc main.c -o main

perf stat ./main

Performance counter stats for './main':3.196978 task-clock # 0.893 CPUs utilized0 context-switches # 0.000 M/sec0 CPU-migrations # 0.000 M/sec98 page-faults # 0.031 M/sec7,616,703 cycles # 2.382 GHz [68.92%]5,397,528 stalled-cycles-frontend # 70.86% frontend cycles idle [68.85%]1,574,438 stalled-cycles-backend # 20.67% backend cycles idle3,359,090 instructions # 0.44 insns per cycle # 1.61 stalled cycles per insn1,066,900 branches # 333.721 M/sec799 branch-misses # 0.07% of all branches [80.14%]0.003578966 seconds time elapsed

平均每次系统调用需要执行的CPU指令数为(1,008,492,870 - 3,359,090)/1000000 ≈ 1005条指令。

5

深挖系统调用实现

如果你想了解系统调用的具体实现,可以参考《深入理解LINUX内核-第十章系统调用》。最初,系统调用通过汇编指令int(中断)实现,当用户态进程发出int $0x80指令时,CPU切换到内核态并执行system_call函数。后来,Intel提供了“快速系统调用”指令sysenter以提高效率。我们通过实验验证如下(可能需要左右滑动查看完整内容):

# perf stat -e syscalls:sys_enter_read ./mainPerformance counter stats for './main':1,000,001 syscalls:sys_enter_read0.006269041 seconds time elapsed

上述实验证明,系统调用确实是通过sys_enter指令进行的。

6

结论

与函数调用不到1纳秒的耗时相比,系统调用的开销确实较大。尽管使用了“快速系统调用”指令,但耗时仍在200纳秒以上,某些情况下可能达到十几微秒。每次系统调用需要执行约1000条CPU指令,因此确实应该尽量减少系统调用次数。然而,即使是10微秒,也仅是1毫秒的百分之一,所以不必过分担心系统调用的开销。

系统调用之间耗时差异较大的原因在于,虽然内核态与用户态的切换时间基本相同,但不同的系统调用在内核态的处理工作不同,导致在内核态停留的时间差异较大。

以上就是一次系统调用开销到底有多大?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/12925.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何打开dll文件?
上一篇 2025年11月21日 06:09:14
PHP递增操作符能否直接用于字符串拼接_PHP字符串递增与连接行为
下一篇 2025年11月21日 06:11:16

相关推荐

  • win11 PIN码不可用怎么办 win11 PIN码无法使用重置方法

    win11 PIN码不可用怎么办 win11 PIN码无法使用重置方法win11 PIN码不可用怎么办 win11 PIN码无法使用重置方法win11 PIN码不可用怎么办 win11 PIN码无法使用重置方法win11 PIN码不可用怎么办 win11 PIN码无法使用重置方法

    首先检查账户是否为Microsoft账户,若为本地账户需切换;接着确保凭据管理器和Windows生物特征服务已启动;运行sfc /scannow修复系统文件;删除NGC文件夹重置PIN环境;最后通过注册表启用域PIN登录,重启后即可恢复PIN功能。 如果您在登录Windows 11时遇到PIN码不可…

    2026年10月3日 • 用户投稿
    500
  • 豆包API好用吗 怎么设置豆包AI

    豆包API好用吗 怎么设置豆包AI豆包API好用吗 怎么设置豆包AI豆包API好用吗 怎么设置豆包AI豆包API好用吗 怎么设置豆包AI

    豆包 AI 是字节跳动旗下火山引擎推出的大型中文语言模型和人工智能服务平台。集成了文本生成、图像合成、视频制作、数据分析等多种 AI 能力,支持多模态交互。具备超大上下文窗口(最高支持 256k tokens),适合处理长文本、复杂对话和知识推理。通过 API 和 SDK 形式,方便开发者和企业集成…

    2026年10月3日 • 用户投稿
    100
  • 传言称Switch 2游戏卡性能表现或不及内部存储游戏

    传言称Switch 2游戏卡性能表现或不及内部存储游戏传言称Switch 2游戏卡性能表现或不及内部存储游戏传言称Switch 2游戏卡性能表现或不及内部存储游戏传言称Switch 2游戏卡性能表现或不及内部存储游戏

    任天堂专利观察站(nintendo patents watch)在社交平台披露了关于switch 2游戏卡的最新技术细节: “我最初在Switch 2游戏卡的专利文件中发现了一些线索,但希望进一步核实。在与相关领域专家确认后,可以明确以下信息: · 第二代游戏卡(Game Card 2)采用eMMC…

    2026年10月3日 • 用户投稿
    200
  • 蚂蚁数科外滩大会与14家单位达成AI合作

    蚂蚁数科外滩大会与14家单位达成AI合作蚂蚁数科外滩大会与14家单位达成AI合作蚂蚁数科外滩大会与14家单位达成AI合作蚂蚁数科外滩大会与14家单位达成AI合作

    在近日举行的2025外滩大会上,蚂蚁数科与14家机构达成合作,共同推动人工智能技术在能源、数据、医疗、出行等关键领域规模化落地,展现出ai技术驱动实体经济发展的巨大潜力。 在数据产业方面,蚂蚁数科与武汉硚口区人民政府共同打造“数据产业基地”,共同打造多元一体的AI数据产业发展体系;与上海数据发展科技…

    2026年10月3日 • 用户投稿
    100
  • linux中的aegis是什么

    linux中的aegis是什么linux中的aegis是什么linux中的aegis是什么linux中的aegis是什么

    linux中的aegis是一种安全防护系统,提供对电脑系统的保护。aegis系统是一个开源项目,它的目标是通过层层防护来保护Linux系统。它具有多种安全功能,包括入侵检测系统,杀毒软件,网络入侵防御系统,基于主机的入侵防御系统, 以及日志分析和管理等。 本文操作环境:linux 6.4.3系统、D…

    2026年10月3日 • 用户投稿
    000
  • 怎么用豆包AI帮我写分布式系统代码 分布式系统代码的AI编写指南

    怎么用豆包AI帮我写分布式系统代码 分布式系统代码的AI编写指南怎么用豆包AI帮我写分布式系统代码 分布式系统代码的AI编写指南怎么用豆包AI帮我写分布式系统代码 分布式系统代码的AI编写指南怎么用豆包AI帮我写分布式系统代码 分布式系统代码的AI编写指南

    豆包ai虽非专业代码生成工具,但在编写分布式系统方面可提供有效辅助。1. 可生成基础结构代码,如服务注册、配置中心等模块,需明确技术栈并提出具体问题;2. 可分析已有代码逻辑,指出潜在问题,但需分段提问并标明重点;3. 可解释分布式相关概念和设计模式,帮助理解后再实践;4. 使用时应多轮对话、结合文…

    2026年10月3日 • 用户投稿
    100
  • PHP日期时间处理:解析与格式化ISO8601日期字符串

    本文旨在深入探讨ISO8601日期时间格式,并详细阐述在PHP中如何高效、准确地解析此类字符串。我们将重点介绍PHP内置的DateTime类,演示如何将ISO8601格式的日期时间字符串转换为如’d.m.Y H:i:s’等自定义格式,并提供实用的代码示例及注意事项,帮助开发者…

    2026年10月3日
    300
  • linux服务器集群系统是什么

    linux服务器集群系统是什么linux服务器集群系统是什么linux服务器集群系统是什么linux服务器集群系统是什么

    linux服务器集群系统是一种使用Linux操作系统的分布式计算环境,由多个独立的服务器节点组成,这些节点可以通过高速网络相互连接,共同完成计算任务,它们能够协同工作,提供高可靠性、高性能和可扩展性的服务。 本文操作环境:linux 5.18.14系统、DELL G3电脑。 Linux服务器集群系统…

    2026年10月3日 • 用户投稿
    100
  • 性能更优秀!独游开发商称NS2可支持DLSS 3.1!

    性能更优秀!独游开发商称NS2可支持DLSS 3.1!性能更优秀!独游开发商称NS2可支持DLSS 3.1!性能更优秀!独游开发商称NS2可支持DLSS 3.1!性能更优秀!独游开发商称NS2可支持DLSS 3.1!

    根据外媒Twisted Voxel的最新消息,任天堂即将推出的下一代主机Nintendo Switch 2或将支持DLSS 3.1技术。 该情报源自独立游戏开发与移植团队Lynx Byte Games在其官网公布的一份技术规格文档。文档中详细描述了Switch 2的硬件配置及其特色功能,其中多数信息…

    2026年10月3日 • 用户投稿
    100
  • Java CompletableFuture:高效串行处理异步任务流并汇总结果

    Java CompletableFuture:高效串行处理异步任务流并汇总结果Java CompletableFuture:高效串行处理异步任务流并汇总结果Java CompletableFuture:高效串行处理异步任务流并汇总结果Java CompletableFuture:高效串行处理异步任务流并汇总结果

    本文深入探讨了如何使用Java CompletableFuture 串行执行一系列异步任务,并将其结果收集到一个列表中。针对常见的挑战,如确保任务按序执行、避免不必要的线程开销,文章分析了 thenApplyAsync 和 thenCombineAsync 的局限性,并详细介绍了两种基于 thenC…

    2026年10月3日 • 用户投稿
    100
  • 怎么让豆包AI生成Python图形界面程序

    怎么让豆包AI生成Python图形界面程序怎么让豆包AI生成Python图形界面程序怎么让豆包AI生成Python图形界面程序怎么让豆包AI生成Python图形界面程序

    用豆包ai生成python图形界面程序的关键在于明确需求并清晰描述。首先确定程序功能,如计算器或数据输入表单;其次指定使用tkinter库以确保代码易运行;接着详细说明界面元素如按钮、输入框及其交互逻辑;最后检查生成的代码是否完整,注意模块导入和事件绑定等问题,确保程序能正常运行。 ☞☞☞AI 智能…

    2026年10月3日 • 用户投稿
    100
  • linux中的nfc是什么

    linux中的nfc是什么linux中的nfc是什么linux中的nfc是什么linux中的nfc是什么

    linux中的nfc是指“Near Field Communication”技术。nfc是一种短距离高频无线通信技术,可以实现设备之间的数据交换、信息传输和支付等功能,在Linux系统中,nfc被广泛应用于智能手机、平板电脑、电子门禁系统、智能卡、支付终端等设备中。 本文操作环境:linux 6.4…

    2026年10月3日 • 用户投稿
    000
  • 怎么用豆包AI帮我解释这段代码 一键解析代码功能的豆包AI操作技巧

    怎么用豆包AI帮我解释这段代码 一键解析代码功能的豆包AI操作技巧怎么用豆包AI帮我解释这段代码 一键解析代码功能的豆包AI操作技巧怎么用豆包AI帮我解释这段代码 一键解析代码功能的豆包AI操作技巧怎么用豆包AI帮我解释这段代码 一键解析代码功能的豆包AI操作技巧

    豆包ai的“一键解析代码”功能确实能帮助用户快速理解陌生代码,尤其适合初学者或调试他人代码时使用。一、先准备好要解析的代码,包括完整函数、类定义或逻辑片段,并确保包含变量定义和依赖库导入,如 python 中的 pandas 或 numpy 导入语句。二、在豆包ai聊天界面粘贴代码后,点击“解析代码…

    2026年10月3日 • 用户投稿
    000
  • Java CompletableFuture 链式顺序执行与结果列表收集教程

    Java CompletableFuture 链式顺序执行与结果列表收集教程Java CompletableFuture 链式顺序执行与结果列表收集教程Java CompletableFuture 链式顺序执行与结果列表收集教程Java CompletableFuture 链式顺序执行与结果列表收集教程

    本教程详细探讨了如何在Java中使用CompletableFuture实现一系列异步任务的顺序执行,并将每个任务的结果收集到一个列表中。文章介绍了两种主要策略:一种是利用外部列表累积结果,另一种是采用更函数式的方式在CompletionStage链中传递并更新结果列表。通过深入解析thenCompo…

    2026年10月3日 • 用户投稿
    000
  • linux中的guest是什么

    linux中的guest是什么linux中的guest是什么linux中的guest是什么linux中的guest是什么

    在Linux中,”guest” 通常指的是虚拟化环境中运行的客户操作系统,虚拟化是一种将物理计算资源抽象为多个虚拟环境的技术,允许在同一物理主机上同时运行多个独立的操作系统实例,在虚拟化环境中,主机操作系统被称为”宿主”,而在宿主操作系统上运行的其他操…

    2026年10月3日 • 用户投稿
    000
  • 苹果用户如何快速安装DeepSeek实用攻略

    苹果用户如何快速安装DeepSeek实用攻略苹果用户如何快速安装DeepSeek实用攻略苹果用户如何快速安装DeepSeek实用攻略苹果用户如何快速安装DeepSeek实用攻略

    苹果用户可在iphone上通过两种方法快速安装deepseek。①使用safari浏览器访问网页版:打开safari搜索官网,点击“立即体验”进入界面,可选择添加到主屏幕以便快速启动;②在app store下载官方app:搜索“deepseek”,确认开发者后下载安装并登录账号使用。此外建议设置si…

    2026年10月3日 • 用户投稿
    600
  • linux中的sid是什么意思

    linux中的sid是什么意思linux中的sid是什么意思linux中的sid是什么意思linux中的sid是什么意思

    在Linux中,”SID”通常指的是安全标识符,其作用和用途是:1、用于唯一标识和识别用户和组;2、确保在不同系统上,即使用户名或组名不同,利用SID进行标识仍然能够正确地设置和管理权限;3、能够确保用户和组在不同系统之间的一致性,方便用户在不同系统中进行登录、文件访问和权限…

    2026年10月3日 • 用户投稿
    000
  • iPhone 17全系安兔兔跑分成绩曝光:A19 Pro不如A19?

    iPhone 17全系安兔兔跑分成绩曝光:A19 Pro不如A19?iPhone 17全系安兔兔跑分成绩曝光:A19 Pro不如A19?iPhone 17全系安兔兔跑分成绩曝光:A19 Pro不如A19?iPhone 17全系安兔兔跑分成绩曝光:A19 Pro不如A19?

    9月15日,安兔兔公布了一张关于iphone 17系列新机型的性能测试截图。图中显示,搭载a19 pro芯片的iphone air综合跑分竟比配备a19芯片的iphone 17标准版低了超过15万 分。 iPhone Air 从曝光的跑分数据来看,iPhone 17 Pro Max以高达271775…

    2026年10月3日 • 用户投稿
    000
  • 如何让豆包AI处理Python中的日期时间

    如何让豆包AI处理Python中的日期时间如何让豆包AI处理Python中的日期时间如何让豆包AI处理Python中的日期时间如何让豆包AI处理Python中的日期时间

    要让豆包ai准确帮助处理python中的日期时间问题,需明确提问场景、指定使用的库、补充细节。1. 提问时具体说明操作,如解析、格式化或时区转换;2. 指定使用标准库如datetime或第三方库如dateutil;3. 当回答不准确时,补充如是否使用时区、时间格式等细节以引导修正。 ☞☞☞AI 智能…

    2026年10月3日 • 用户投稿
    600
  • 1-7月小米SU7城市销量TOP20出炉:北京未进前十

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 小米su7 %ign%ignore_a_1%re_a_1%1-7月小米SU7城市销量TOP20榜单正式发布。数据显示,杭州市以12451辆的销量遥遥领先,位居榜首。上海市以9085辆、深圳市以8…

    2026年10月3日
    1300

发表回复

登录后才能评论
关注微信