说说Linux系统调用那些事儿

利用Matlab实现矩形波导电磁场分布图的绘制 1.利用Matlab实现矩形波导电磁场分布图的绘制;2.学会使用 Matlab 进行数值计算,并绘出相应的图形;通过Matlab 计算并绘出任意时刻金属矩形波导的主模 TE10 模的电磁场分布图。波导尺寸、工作频率及时刻均由外部给定。(1)矩形波导中传输的主模为TE10模。设金属波导尺寸为a*b,TE10模的截止波长为2*a。其电磁场分量可推导表示如下:.......1-1上式中各参量如下:......1-2。 阅读详情

目录

写在前面


欢迎各位网友对本博文提出意见,如需转载请注明出处。

下面我就开门见山的说吧,使用系统调用(例如open()、read()、write()等函数)会影响系统的性能。

与函数调用相比,系统调用的开销要大一些,因为在执行系统调用时,Linux必须从运行用户代码切换到执行内核代码,然后再返回用户代码。

减少这种开销的一个好办法是,在程序中尽量减少系统调用的次数,并且让每次系统调用完成尽可能多的工作。

下面我们通过几个简单的栗子来说明一下为什么会这样。

频繁使用系统调用的例子

这是一个关于文件复制的程序,看起来非常的简单,我们首先使用系统调用来完成文件复制的操作,为了体现频繁的系统调用,程序中将每次读写的数据块大小设为1byte,被复制的文件大小为1M。

/*copy_system1.c*/
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>

int main()
{
    char c;
    int in, out;

    in = open("file.in", O_RDONLY);
    out = open("file.out", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
    while (read(in, &c, 1) == 1)
    {
        write(out, &c, 1);
    }
    return 0;
}

通过这种方式运行这个程序,

TIMEFORMAT"" time ./copy_system

你会得到这样的输出结果:

4.33user 6.08system 0:10.42elapsed 99%CPU (0avgtext+0avgdata 412maxresident)k
0inputs+2048outputs (0major+145minor)pagefaults 0swaps

从这个结果中,我们不难发现程序运行了10s左右,而且CPU占有率高达99%,足见其效率低下。

NOTE:这个程序在运行之前你要准备一个大约1M的文件file.in,你可以用这个程序来生成你想要的这个文件。

减少系统调用的次数的例子


下面我们改变数据块的大小,再来测试一下,这样做可以减少系统调用的次数,下面是这个程序:

/*copy_system2.c*/
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>

int main()
{
    char block[1024];
    int in, out;
    int nread;

    in = open("file.in", O_RDONLY);
    out = open("file.out", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
    while (nread = read(in, block, 1024) > 0)
    {
        write(out, block, nread);
    }
    return 0;
}

同样使用下面的命令来运行:

TIMEFORMAT="" time ./copy_system2

0.01user 0.01system 0:00.02elapsed 92%CPU (0avgtext+0avgdata 408maxresident)k
0inputs+8outputs (0major+145minor)pagefaults 0swaps

结果很明显,这次执行只花费了0.02s,而且CPU占有率也降低到了92%。现在你看到了频繁系统调用的后果了吧。

不使用系统调用的例子

为了体现不使用系统调用的优势,我么再来写一个不使用系统调用的程序。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int c;
    FILE *in, *out;

    in = fopen("file.in", "r");
    out = fopen("file.out", "w");

    while ((c = fgetc(in)) != EOF)
    {
        fputc(c, out);
    }
    return 0;
}

我们依然使用这个命令进行测试:

TIMEFORMAT="" time ./copy_system3

0.05user 0.01system 0:00.12elapsed 55%CPU (0avgtext+0avgdata 500maxresident)k
4128inputs+4096outputs (0major+167minor)pagefaults 0swaps

现在结果很明显,这个程序只花费了0.12s,而且CPU占有率仅为55%,说明不使用系统调用的程序运行起来效率明显高于使用系统调用的程序。

程序是否系统调用数据块大小(byte)所用时间(s)CPU占有率
copy_system1是110.4299%
copy_system2是10240.0295%
copy_system3否10.1255%

NOTE:这三个程序都是对大小为1M的文件进行复制。

通过上面这个表格,我们很容易得出这样的结论:

  • 系统调用会导致程序效率低下(程序1与程序3做对比)
  • 频繁系统调用更会导致程序效率低下(程序1与程序2做对比)

由此,我们可以得出提高程序效率的方法:

  • 尽量避免频繁使用系统调用;
  • 如果不可避免的使用了系统调用,那么就充分利用这次系统调用,让它完成尽可能多的工作。

参考文献

[1] Neil Matthew Richard Stones. Linux 程序设计(第四版). 人民邮电出版社

微信小程序消息推送全攻略:从模板消息到订阅消息的实战避坑指南 本文深入解析微信小程序消息推送机制,对比模板消息、订阅消息与客服消息的核心差异与适用场景。重点提供订阅消息从用户授权设计、前端代码实现到后端稳定发送的完整实战指南,并分享提升消息点击率的文案与运营技巧,帮助开发者构建高效、用户友好的消息推送体系。 阅读详情

相关推荐

OpenWRT系统启动流程全解析:从procd到ubus的完整链路(附源码分析)

本文深入解析了OpenWRT系统从内核移交控制权到用户空间服务就绪的完整启动链路。核心聚焦于进程管理器procd与通信总线ubus的协同工作机制,通过源码分析揭示了状态机转换、服务注册与事件分发的内在逻辑,为系统定制、启动优化与故障调试提供了清晰指南。

weixin_28335283的博客 531

Linux内核:基于int指令的经典系统调用过程分析

众所周知,代码运行可以存在多种不同的特权级别,而针对Linux系统,即为:用户模式(user mode)和内核模式(kernel mode)。在用户模式下,CPU的功能空间受到极大的限制,是没有权利访问多少系统资源的,诸多关键资源的使用无法直接调配,如:硬件设备读取、磁盘文件读取等;诸多情况无法直接处理,如开关中断、页中断、断电等。这些资源的调配和硬件中断的响应处理都是内核态下由系统内核代码进行应对

墨篙和小奶猫 2141

Dify 从入门到熟悉100 天的学习大纲

理解 Dify 的核心概念,熟悉操作界面,并能创建简单的 AI 应用。祝你在这 100 天的旅程中学有所成,成为一名优秀的 AI 应用开发者!掌握生产环境部署、监控、调优,并关注 Dify 生态和前沿动态。探索多模态、Agent、API 集成、性能优化等高级主题。掌握工作流编排、高级提示词技巧、知识库优化等核心功能。

IT深耕十余载,大道之简 1733

linux中的系统调用

前言:本文只讨论linux中的系统调用,不考虑windows等其他操作系统。 两个问题: 1.系统调用时,进程调用的是进程吗? 答:进程调用的是操作系统的内核函数,不是进程。 2.系统调用时,会出现上下文切换吗? 答:会出现上下文切换,但和进程调度时的上下文切换还是有区别的。 早期,内存使用的是哈佛结构,即程序和数据分开存储。到了现代,内存使用的是冯诺依曼结构,即程序和数据存储在一起。 在linux中,内存又被分为两部分:内核部分和进程部分。内核部分归操作系统内核使用,进程部分归进程使用。 出于安全考虑,进

u011159820的博客 5333

第二十三章 Nest集成日志框架Winston

Winston是一个非常流行的Node.js日志框架,而Nest.js是一个基于Node.js的后端框架。修改 winston.module.ts 内容如下 添加 forRoot 方法,接收 winston 的 createLogger 方法的参数,返回动态模块的 providers、exports。这里用到了 printf 的 format 函数,它可以自定义打印的日志格式 且使用了chalk 加上了颜色,并且打印了 dayjs 格式化的时间。可以看到控制台打印了自定义的 logger 的自定义。

枫ゞ的博客 1069

Unity获取透明物体深度数据

Unity获取透明物体深度数据前言透明&景深需求模型透明度部分带透明通道图片/视频部分半透明模型获取深度的具体实现方法带透明度图片/视频获取深度的具体实现方法结束语 前言 最近在做的项目有很多奇怪的需求,甚至之前在unity里用插件写了一个类似于蓝图的行为树插件,之后有时间给大家讲一讲相关的实现方法,今天刚解决了unity里透明物体无法获得深度数据的问题。所以分享给大家。 透明&景...

可以吃的妙脆角的博客 2630

系统调用那些事儿

系统调用总结:WIN32 API对系统调用进行了一个封装;系统调用的过程及分类。

该用户还没想到好的昵称的博客 1963

jane street market prediction 冠军方案 奇巧淫技与topline链接整理(3/3)

目录前言将income 作为loss(优化目标)读取数据,定义优化目标模型训练与微调提交结果多目标学习Topline整理AE+MLP (rank10)Current 17th solution: Ensembles of deep (49 layer) MLPsmixup augmentation: a way to learn from trades with weight=0 (rank4)My (perhaps) over-complicated LSTM solutionCurrent 62nd .

weixin_51484067的博客 2639

linux软中断和系统调用深入研究

arm软中断模式 arm7种模式 有中断模式,但是并没有软中断模式。那么arm的软中断是什么呢? arm的软中断是arm从用户模式切换到特权模式,也就是linux中从用户态切换到内核态的过程。 swi命令触发软中断 linux系统中,swi异常向量代码: linux系统调用 x86 架构是硬中断int 80,中断号为80来实现系统调用的; arm架构是使用swi命令,使arm切换为软中断模式,执行swi异常向量表中的异常向量。 软中断的异常向量 arm中异常象量表: 异常类型 偏移地址(低) 偏移

qq_40036519的博客 2700

人形机器人骨骼材料选型实战:从铝合金到碳纤维的5种方案对比

本文深入探讨人形机器人骨骼材料的选型策略,对比铝合金、镁合金、钛合金、碳纤维复合材料及3D打印材料等5种方案的性能优劣。通过建立强度-重量比、疲劳寿命等核心评价维度,结合具体应用场景,提供科学的材料决策方法论,助力开发者优化机器人结构设计,实现性能与成本的平衡。

weixin_29199873的博客 436

CentOS 7下kkFileView 4.4.0离线部署全攻略(含LibreOffice 7.5配置避坑指南)

本文详细介绍了在CentOS 7环境下离线部署kkFileView 4.4.0的全流程,包括LibreOffice 7.5的配置避坑指南、中文字体解决方案以及企业级运维实践。通过本指南,用户可以在内网环境中快速搭建稳定可靠的文档在线预览服务,提升办公效率。

weixin_28481133的博客 288

linux系统编程(3)--系统调用

系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口——它好比一个中间人,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。

小王的笔记仓库 821

open3d将某一时间序列下的彩色图和深度图批量转换成点云(python)

必备条件需要3D相机生成的彩色图及深度图,注意要将深度图与彩色图对齐(一般3D相机自带对齐算子),以及3D相机的彩色图内参(相机自带内参获取功能)。有了此彩色图、对齐后的深度图以及相机内参就能使用open3d生成彩色点云了.

吾名招财的博客 315

Linux那些事儿之我是Sysfs--12-(opendir,readdir系统调用流程)

上回我们说到,如何创建文件夹和文件。我们发现,在sysfs中,inode并不那么重要。这是因为我们所要读写的信息已经就在内存中,并且已经形成了层次结构。我们只需有dentry,就可以dentry->fsdata,就能找到我们读些信息的来源 ---  sysfs_dirent结构。这也是我觉得有必要研究 sysfs的原因之一,因为它简单,而且不涉及具体的硬件驱动,但是从这个过程中,我们可以把文件系统

张亮校的专栏 1202

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Linux那些事儿(目录)

第1篇 Linux那些事儿之我是USB Core 1.引子 2 2.它从哪里来 2 3.PK 3 4.漫漫辛酸路 3 5.我型我秀 4 6.我是一棵树 5 7.我是谁 9 8.好戏开始了 11 9.不一样的core 13 10.从这里开始 17 11.面纱

为啥而非 145

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

linux添加系统调用【简单易懂】【含32位系统】【含64位系统】

linux添加系统调用【简单易懂】【含32位系统】【含64位系统】

Edogawa_sama的博客 3828

系统调用的那些事儿

转自:http://edsionte.com/techblog/archives/2071  1.系统调用 我们知道,Linux将整个虚拟地址空间划分为两部分:用户空间和内核空间。并且规定,用户空间不能直接访问内核空间,而内核空间则可以访问用户空间。通过这样的级别划分,可以使得内核空间更加的稳定和安全。但是,当用户进程必须访问内核或使用某个内核函数时,就得使用系统调用(Syst

Justin_Ting的专栏 621

Linux那些事儿之我是USB - 完整双版阅读资料

Linux那些事儿之我是USB - 完整双版阅读资料 【下载地址】Linux那些事儿之我是USB-完整双版阅读资料 欢迎来到“Linux那些事儿之我是USB”资源页面,这是一份宝贵的针对Linux内核学习者的文档。此资源包含了两个重要版本,第二版更是深度对接2.6.22内核,为读者展开了一幅详尽的Linux USB子系统...

gitblog_09778的博客 809

《Linux那些事儿之我是USB第二版》资源介绍

《Linux那些事儿之我是USB第二版》资源介绍 去发现同类优质开源项目:https://gitcode.com/ 《Linux那些事儿之我是USB第二版》是一份关于Linux操作系统下USB驱动开发的资源文件。本资源以生动的语言和丰富的实例,深入浅出地讲解了USB的基本概念、Linux系统中USB的架构以及USB驱动的开发流程。 本资源适用于对Linux驱动开发感兴趣的读者,特别是希望专注于US...

gitblog_06700的博客 491

linux 那些事儿系列

fudan_adc的博客主要博文包括: linux那些事儿系列 : http://blog.csdn.net/fudan_abc/article/category/335670 linux内核修炼之道 : http://blog.csdn.net/fudan_abc/article/category/655796 深入前出的讲解以及风趣的风格,值得一读!

蜗牛Running 5899

Linux内核源码分析---epoll 系统调用

学习记录

学习记录 1297

Linux那些事儿

文章目录一、常用操作以及概念快捷键求助1. --help2. man3. info4. doc关机1. who2. sync3. shutdownPATHsudo软件包管理工具Linux DistritionsVIM 三个模式GNU二、磁盘磁盘接口1. IDE2. SATA3. SCSI4. SAS磁盘的文件名三、分区分区表1. MBR2. GPT开机检测程序1. BIOS2. UEFI四、文件系...

蓝田日暖玉生烟 2420

Linux signal那些事儿

事先声明,文章非本人原创引自 http://blog.chinaunix.net/uid-24774106-id-4061386.html Linux编程,信号是一个让人爱恨交加又不得不提的一个领域。最近我集中学习了Linux的signal相关的内容,分享出来,也为防止自己忘记。 信号的本质是异步。异步一这个词,听着高端大气上档次,又让人云山雾绕,其则不然。其实我们...

qq_32783703的博客 245

linux 那些事儿之我是 u 盘,Linux那些事儿之我是USB

第1篇 Linux那些事儿之我是USB Core1.引子 22.它从哪里来 23.PK 34.漫漫辛酸路 35.我型我秀 46.我是一棵树 57.我是谁 98.好戏开始了 119.不一样的core 1310.从这里开始 1711.面纱 2012.模型,又见模型 2213.繁华落尽 2614.接口是设备的接口 2815.设置是接口的设置 3216.端点 3517.设备 3718.配置 4519.向...

weixin_36037417的博客 496

Linux那些事儿之我是Sysfs

Linux那些事儿之我是Sysfs "sysfs is a ram-based filesystem initially based on ramfs. It provides a means to export kernel data structures, their attributes, and the linkages between them to userspace.” --- documentation/filesystems/sysfs.txt 可以先把documentation/f

myspor的专栏 919

学习Linux你必须知道的那些事儿

欢迎加入Linux的大家庭!对你来说,这可能还是一个陌生的领域,不过相信随着逐步深入的了解,你会喜欢上Linux,喜欢上开源的!首先,让我们来看一下,Linux新手应该注意和了解哪些事情吧! 1.认识几个大牛 Linus Torvalds 生于1969年12月28日的芬兰赫尔辛基市,拥有美国国籍。他是Linux内核的最早作者,随后发起了这个开源项目,担任Linux内核的首席架

4660

Linux设备之我是usb,linux那些事儿之我是usb

linux那些事儿之我是usb,复旦大学教授肖林甫先生给学生们解说的linux操作系统的一些硬件驱动开发的事儿。内核说明:我是U盘 说的是2.6.10的内核我是Sysfs 说的是2.6.10的内核戏说USB 说的是2.6.22的内核我是Hub/UHCI/EHCI 说的是2.6.22.1的内核linux那些事儿简要:其中我是U盘属于基础性的.这一阶段会遇到一些问题.比如urb提交之后究竟怎么处理的?...

weixin_42116791的博客 732
上一篇: Linux学习中容易忽略的细节(一)
下一篇: 使用思科Packet tracer软件模拟PPP协议
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值