性能的本质IPC之动手验证

前言 最近在实践学习plantegg大佬的程序员案例,对IPC的实验进行一下记录,以备查验 术语说明 IPC 本文的主角,全名为 Instructions per cycle(clock), 表示每个时钟周期可执行的指令数,常用来做为评判处理器性能的指标 NOP no operation, 在指令集中表示一个指令不改变所执行程序的 register,status flag,也就是不要进行上下文的切换,CPU的上下文切换是有时间开销的 实验代码下载 git clone https://github.com/plantegg/programmer_case 实验机器信息 实验只可在物理机下进行 实验验证 测试nop指令 编译测试代码 gcc ./nop.c -o nop 执行测试 perf stat ./nop 现象 IPC跑到3.79 问题 我记得第一次执行IPC好像跑到了4(未改变代码),当时忘记截图了,后续测试的都到不了4了 IPC与perf执行时间长短有关吗? 好像是无关的,保证cpu 100%后就可以停止进行查看 IPC怎么接近4? 改代码增加nop指令的数量,加到将近700个,IPC达到3.97 测试pause指令 编译测试代码 gcc ./pause.c -o pause 执行测试 perf stat ./pause 现象 IPC只跑到了0.11 测试nop指令跑两份各自绑定到同一物理核 如何判断HT?通过查看/proc/cpuinfo信息, 如果physical id和core id都一样的话,说明这两个core实际是一个物理core,其中一个是HT 执行测试 taskset -c 0 perf stat ./nop taskset -c 24 perf stat ./nop 现象 ...

May 25, 2023 · 1 min · 152 words · tomyli

Linux命令学习之wc

前言 在日常应用中,统计文件内容是一种常见的需求,可以通过 wc 命令来实现 Wc wc file 统计文件,显示行数、单词数、字节数,带文件名 wc -c file 统计文件,只显示字节数 wc -w file 统计文件,只显示单词数 wc -l file 统计文件,只显示文件行数 wc file1 file2 统计多个文件,显示汇总信息 wc < file 统计文件,显示行数、单词数、字节数,不带文件,便于shell脚本后续处理 wc -L file 打印出文件行最长的节数 疑惑 wc -c 与 wc -w 是如何统计的 在统计 hello.txt 时, wc -c 的结果为 55 , wc -m 的结果为 45 ,为什么统计的结果不一样?这个文本中包含了中文内容,猜测和这个有关 验证是否与中文有关 这个好办,建一个不带中文的文件,验证如下 可以看到统计的结果是一样的 中文是如何统计的? 这个就涉及到编码的问题了,先用 hexyl 查看一下,字节的总数为55,但是在进行字符统计时,使用的unicode编码将3个字节计算为1个字符(例如 好 被编码成 E5 A5 BD ),这就对上了,哈哈! 编码是个大话题,后续好好学习一下 REF wc (Unix) - Wikipedia wc - How to display the number of lines, words and characters in separate lines? - Unix & Linux Stack Exchange Captured On: [2023-03-02 Thu 16:28] ...

March 2, 2023 · 1 min · 107 words · tomyli

Linux命令学习-只看文件一部分的head与tail

前言 开发中常常需要查看文件的部分内容,这时可以用 head 命令来查看文件开头部分与 tail 命令来查看文件结尾部分 Head head file 打印文件的前10行内容 head -n file 打印文件前n行的内容 head -c file 打印文件前n个字节(换行符计算在内)的内容,文件小于指定字节则打印全部文件内容 head -v file 打印文件的前10行内容,显示打印的文件标题 head file1 file2 同时查看多个文件的头部内容 head -q file1 file2 同时查看多个文件的头部内容,不打印文件标题,可用于后续文件内容合并处理 Tail tail file 打印文件后10行内容,不足则打印全部内容 tail -n file 指定打印文件后n行的内容 tail -c file 打印文件尾部n个字节(换行符计算在内)的内容,文件小于指定字节则打印全部文件内容 tail -v file 打印文件的尾部10行内容,显示打印的文件标题 tail -q file1 file2 同时查看多个文件的尾部内容,不打印文件标题,可用于后续文件内容合并处理 tail -f file 监控文件后续输出,对监控线上服务日志输出很有用 tail -F file 监控文件后续输出,即使文件重命名也可以正确输出,对监控线上服务日志输出很有用 tail -f –pid=n file 监控文件输出,当监控的进程退出时, tail 程序退出 REF head (Unix) - Wikipedia Using Linux Tail Command with PID Terminate Option - YouTube

January 30, 2023 · 1 min · 82 words · tomyli

Linux命令学习之cat

功能 Cat命令有两个作用: 输出文件内容到标准输出 合并文件内容 输出文件内容 cat file 查看文件内容 cat -n file 查看文件内容,带行号,统计所有行(包括空行) cat -b file 查看文件内容,带行号,不统计空行 cat -s file 查看文件内容,压缩空行,多个空行只显示一行空行 cat -E file 查看文件内容,显示行结束符号为 $ cat -T file 查看文件内容,显示tab符号为 ^ cat -A file 查看文件内容,显示tab符号为 ^ ,显示行结束符号为 $ cat multiple files 查看多个文件 合并文件内容 cat配合linux的管道命令可以实现更强大的功能 cat file1 file2 > file3 cat >newfile 这是一个很强大的命令,可以直接创建文件并把输入的内容写入到新创建的文件中 cat 只输入cat会发生什么呢,它会把输入的内容再输出出来,没事可以自言自语了 cat -n file1 file2 > file3 统计两个文件的内容带行号写入到file3 cat file1 - file2 > file3 获取file1的内容,用户进行输入,最后加上file2的内容写到file3文件中 cat file1 >> file2 追加file1的内容到file2中 ...

January 13, 2023 · 1 min · 82 words · tomyli

Linux命令学习之touch

前言 今天学习一下Linux的 touch 命令 功能 按man文档的说明,是修改文件的时间戳,目前常用的操作是用来 创建文件 touch file 创建一个空文件,文件的访问时间与修改时间为当前时间 touch -a file 改变文件的访问时间 从上图可以看出来, b.txt 文件只有访问时间被修改了,修改时间没有变 验证时用到 stat 命令, 这个后续具体学习 touch -m file 改变文件的修改时间 从上图可以看出来, cc.txt 文件只有修改时间变了,访问时间没有变 touch -t file 修改文件为指定的时间,格式为 [[CC]YY]MMDDhhmm[.ss] 上图命令将 dd.txt 文件的访问时间与修改时间改成了 2022-01-02 12:22:23 touch -d file 修改文件为指定的日期,支持的时间格式更广泛 touch -r reffile file 修改文件的时间为引用的文件时间 如图, ff.txt 文件与 a.txt 的时间同步了 REF touch (command) - Wikipedia Check file access and modification time in Linux - Linux Tutorials - Learn Linux Configuration stat(1): file/file system status - Linux man page Captured On: [2023-01-06 Fri 18:55]

January 6, 2023 · 1 min · 85 words · tomyli

Linux命令学习之Cp, Mv

前言 今天学习一下Linux中的复制移动相关命令,主要学习 cp 与 mv CP 功能 复制文件或文件夹 cp file target 复制文件到target目录 cp -i 复制前进行询问(如果存在同名文件) cp -n 复制,但不覆盖已经存在的文件 cp -b 复制,复制前备份目标同名文件(如果存在) cp -f 强制删除(目录文件不能打开)并覆盖 cp -p 复制文件到目标文件夹,保留原文件的修改时间、访问时间与归属相关信息 cp -u 复制文件到目标文件夹,仅当源文件的修改时间晚于目标同名文件时进行复制 cp -r 递归复制文件夹内容到目标文件夹 组合杀 对文件进行备份,按数字方式 cp -f --backup=numbered aa.txt aa.txt 如图所示,每执行一次命令,就顺序产生一个同名文件+编号的备份,有点类似于一个版本管理系统 更新文件夹 cp -ruv e ../target 如图所示,只有e/ee.txt有更新,执行命令时只做了增量更新文件 MV 功能 移动(重命名)文件或文件夹 mv 移动文件 移动并重命名 mv -i 移动前询问(目标有同名文件) mv -n 移动文件,但不覆盖存在的文件 mv -u 移动文件,只在源文件比目标文件新时才执行 mv -f 执行覆盖,不提示 REF cp (Unix) - Wikipedia mv (Unix) - Wikipedia Two great uses for the cp command | Opensource.com

January 4, 2023 · 1 min · 83 words · tomyli

Linux命令学习之删除rm, rmdir

前言 今天学习一下Linux命令中的删除命令,主要学习 rm 与 rmdir rm 功能 删除文件或目录 删除谁 rm file 删除指定文件,只能删除文件,不能删除目录 rm -r file 递归删除目录及目录下的文件 rm -d file 删除空文件夹,文件夹不空则报错 删除方式 rm -f file 强制删除文件,忽略文件不存在的错误信息 rm -i file 删除文件前进行确认提示,每删除一个文件提示一次 rm -I file 删除文件前进行有条件的确认提示,触发条件为: 删除文件大于3个,只提示一次,小于等于3个不提示,直接删除 递归删除时提示一次 删除记录 rm -v file 显示删除的文件明细,有日志作用,有写脚本时很有用 组合杀 递归删除目录的文件(不带确认) rm -rf file 常用的删除命令(在受限用户上使用比较稳妥) 递归删除目录的文件(带确认一次) rm -rfI file 比较稳妥的删除目录方式,有一步确认提示(又防止了文件多提示多的烦恼),防止手快 rmdir 功能 删除空的文件夹(支持多个) 为什么有这个命令 删除空文件夹的功能 rm -d 也可以实现,为什么还要有这个命令? rmdir存在的原因 它只能删除文件夹,功能更具体 它可以删除目录及其父目录,这个 rm -d 是做不到的, rm -d 只能删除一层 rm -d ...

December 21, 2022 · 1 min · 102 words · tomyli

Linux-ls命令学习

功能 ls 的功能为显示目录下的内容,默认情况下显示当前所在目录下的内容。用 man ls 查看帮助,发现 ls 支持了非常多的参数,后续学习以实际应用为主,只展示常用的内容 ls 命令帮助归属于man文件第一章节 显示哪些内容 ls 不带任何参数,显示当前目录下的文件内容,结果按字母自然排序 ls -a 显示当前目录下所有的内容,包含隐藏(以.开头的文件)的内容,如上显示 .emacs 和 .hide 文件显示了出来 ls -A 显示当前目录下所有的内容,包含隐藏(以.开头的文件)的内容,但不包含 . 和 .. . 代表当前目录 .. 代表上一级目录 ls /tmp 显示/tmp目录下的文件内容 显示方式 ls -l 默认情况 ls 只显示内容的名称, ls -l 表示以长列表方式显示目录内容 增加了 -l 选项后,显示结果中包含的文件内容更详细(包括权限、所属用户组、大小、修改时间等信息) ls -lh ls 中有很多与 -l 选项配合使用的其它选项,如 -h 选项,可以显示文件大小为可读的形式(以M、G为单位) ls -l 中文件大小默认是按byte为单位显示的 ls -x 按列显示 ls -X 按文件类型字母排序显示 ls -1 一行显示一个 ls -R 递归显示所有内容 格式化显示 ls -Q 显示结果加 引号 ...

December 15, 2022 · 1 min · 123 words · tomyli

Linux-man学习

功能 显示命令行命令的帮助手册 排版 Man页面是按章节(section)进行分配的,在Man中包含9个特定章节 特定章节 可执行程序或者Shell命令(1) man 1 ls man 默认查询第1章节,也可以直接忽略写章节进行查询 man ls 此命令与上边命令效果相同 系统调用(2) 系统调用(内核的功能)相关的帮助在第2章节,例如下面查询系统调用 read 的帮助手册 man 2 read 库调用(3) 库调用相关帮助在第3章节,例如下面查询 ziplib 库中read 的帮助信息 man 3 zip_fread 特定设备文件(4) 查询/dev(保存的设备文件)下的待定文件相关帮助在第4章节, 查一下 null 设备的帮助信息 man 4 null 配置文件书写规则与约定(5) 配置文件的帮助信息放在了第5章,查询一下 /etc/passwd 的帮助 man 5 passwod 游戏相关(6) 略 杂项(7) 一些杂项帮助信息放在第7章,查一下 groff 文件的帮助 man 7 groff 系统管理员命令(8) 略 内核相关(9) 略 章节组织形式 以下只列出比较常用的信息 名称 总览 配置 描述 命令选项 退出码 返回值 环境变量 例子 作者 延伸阅读(see also) 常用命令 man man -f 显示命令的简介, 同 whatis 命令 man -k 搜索命令描述,当只记得一些关键词时很有用。同 apropos 命令 ...

December 8, 2022 · 1 min · 115 words · tomyli

Linux代码结构学习

Linux代码结构 准备学习Linux,看源码是少不了的,先对Linux源码有个大体认识(基于linux4.13) 代码主要文件解析 Makefile 这是整个源码的Makefile,里面定义了一系列的变量和规则,比如默认的gcc编译flag。 Documentation/ 项目文档,里面包含了很多关于配置内核、与ramdisk运行等有用的信息。这里面没有不同配置项的帮助信息,这些信息可以在相关子目录的 Kconfig 文件中查看。 arch/ 体系结构相关代码都在这里,还有一部分在include/arch-generic中。每个体系结构在这个目录下都有一个子目录。比如基于x86体系的代码都在 arch/x86 下。另外,这个目录下还包含低级别的内存管理,中断处理,早期初始化,汇编例程等信息。 crypto/ 内核使用的加密API代码。 drivers/ 所有设备相关的信息都在这个目录下。包括视频设备,网卡设备,低级别的SCSI设备。比如网络设备一般是在 drivers/net 目录下。 fs/ 通用的文件系统与其它类型的文件系统代码都在这里。现在的操作系统的根文件系统一般为ext4格式,它的代码在 fs/ext4 下 include/ 所有.c文件中包含的头文件都定义在这个目录下。 init/ 这个目录包含了内核启动的入口文件 main.c ,版本信息文件 version.c 和早期用户空间相关的代码,早期空间代码提供内核出现时的功能,它不需要在内核中进行运行。 ipc/ 进程间通信相关代码,包含共享内存,信号量等信息。 kernel/ 内核级别代码,上层的系统调用代码在这里,还有关于 printk() 代码,调度,信号量处理的代码。 lib/ 内核所有使用的库都在这里。常见的字符串运算,调试库,命令行解析代码等。 mm/ 高级别的内存管理代码。虚拟内存是通过这些库与低级别的体系结构代码(在 arch//mm )一同实现的。这里完成了早期引导内存管理,涉及文件的内存映射,页缓存的管理,内存分配和RAM中页面的交换。 net/ 高级别的网络代码。与低级别的网络进行发包与收包交互。*net/core* 中包含其它网络协议使用的核心代码。net子目录就是特定的网络协议实现。 scripts/ 这里面包含构建内核的脚本文件。 security/ 不同Linux的安全模型代码。 sound/ 声卡及相关代码在这里。 usr/ 该目录包含构建根文件系统映射的cpio格式的文档代码,该文档用于早期的用户空间。

April 6, 2022 · 1 min · 54 words · tomyli