科技与创新┃Science and Technology&Innovation ·66·2023年第13期
文章编号:2095-6835(2023)13-0066-03
Linux系统进程运行轨迹跟踪与性能统计程序设计
王浩宇
(沈阳航空航天大学,辽宁沈阳110136)
摘要:在Linux内核进程调度中,一般采用基于时间片轮转的调度方式,而每个时间片长度的设定则会影响进程的平均周转时间、平均等待时间和吞吐率,进而影响整个调度的效率。结合Linux0.11操作系统,设计出一种进程跟踪程序。通过实时跟踪分析每个进程在其生命周期中的状态转换过程和调度过程来得出并验证时间片设计的最佳方案。
关键词:操作系统;进程调度;时间片;Linux
中图分类号:TP316文献标志码:A DOI:10.15913/jki.kjycx.2023.13.018
1研究背景
为了实现程序的并发执行以及可以对并发执行的程序加以描述和控制,操作系统引入了进程的概念。由于进程参与并发执行时配置有相应的进程同步机制以及PCB(程序控制块),虽然在执行时有异步性但同时也具有可再现性,因此使并发成为了可能。
在Linux0.11内核中实现了基于优先级的抢先式调度和时间片轮转调度算法作为其进程同步机制,可以让同一优先级中的就绪进程轮转执行。即每隔一定的时间间隔进行中断,激活调度程序,把CPU分配给就绪队列队首进程,令其执行一个时间片。
其中,每个进程每次最多只能执行一个时间片。然而,在时间片的选择上往往会影响整个进程调度的效率。时间片太大则平均周转时间长、响应时间慢,时间片太小则系统开销大(进程切换频繁)。
为验证并解决此问题,应结合Linux操作系统的实际运行情况,分析不同时间片情况下所有进程的平均周转时间与带权周转时间来得出结论。2跟踪程序设计
2.1理论概述
为了分析进程运行的时间和测试时间片大小的影响,应跟踪记录每个进程在生命周期中的转换调度过程,并创建一个应用程序用来测试。因此,针对前一个任务,需要在源程序中到涉及到进程状态变换的代码位置,并在该处调用记录函数语句[1]。将记录函数命名为fprintk,定义其功能包括记录进程的ID
、刚刚进入的状态、发生转换的时刻以及优先级等信息。而关于测试程序,可以建立一个具有创建多进程、模拟占用CPU以及I/O操作功能的应用程序。测试时先运行该程序,记录下生成进程的相关信息,之后再生成并导出,将二者的内容进行比对分析。
2.2日志文件生成
fprintk功能与printk函数类似,因此可以定义在printk.c文件下。记录函数定义完毕后,关键就是在于在何处调用。借助于查功能,以“RECORD_TASK_ STATE”为关键词进行搜索,便可以很轻松地到所有需要调用的位置[2]。函数调用位置如图1所示。
图1fprintk函数调用位置
2.3多进程生成程序
在Linux0.11中创建processApp为测试程序,并在其中定义了函数cpuio_bound(int last,int cpu_time,int io_time)。参数last表示占用CPU以及I/O操作的总时
Copyright©博看网. All Rights Reserved.
Science and Technology &Innovation ┃科技与创新
2023年第13期
·
67·
间,不包括在就绪队列中的时间。参数cpu_time 表示一次连续占用CPU 的时间,必须大于等于0。参数io_time 表示一次I/O 操作占用的时间,必须大于等于0。如果last>cpu_time+io_time ,则往复多次占用CPU 和I/O 操作,且时间单位均为秒[3]。在生成的 文件中,一行信息的格式为进程ID 、进程进入的状态、状态转换的时刻以及进程优先级。其中,状态取值含义如表1所示。
表1状态含义表
状态
含义N 进程刚刚创建J 进程进入就绪态R 进程进入运行态W 进程进入阻塞态
E
进程退出
2.4结果分析程序
在分析程序中,建立了进程结构体用于记录各个
进程的信息,包括进程ID 、周转时间、等待时间、CPU 占用时间、I/O 时间等以及进入各状态的时刻。同时为了方便变量的调用计算,将需要最后运算的数据定义为全局变量,分别是平均带权周转时间、平均周转时间、平均等待时间、吞吐率[4]。
在processApp 程序执行完毕后,会生成名为 的文件记录相关数据。计算了各个进程的周转时间、等待时间、带权周转时间等。同时,计算了平均周转、平均等待、吞吐率等结果,便于后续实验中对时间片更改影响的分析。
3函数细节设计
3.1
fprintk 函数
fprintk 函数的功能是向 文件中写入进程数据,返回值为写入的字符串长度。fprintk 调用的参数包括文件标识符、当前进程的ID 、状态符、滴答数以及进程的优先级,其中,第一个参数fd 是文件描述符,类似于C 语言中printf 的第一个参数,第二个参数fmt 是格式化字符串,后面的是可变参数列表[5]。除此之外,为了能尽早访问process.log 文件而记录下所有数据,需要文件描述符的建立语句尽量提前,即放在start 函数中的move_to_user_mode 之后调用。其中,又定义了调用open 函数打开process.log 的代码,关联到文件描述符3。由此,fprintk 函数便可以向process.log 文件中写数据。3.2
cpuio_bound 函数
cpuio_bound 函数的功能是模拟进程生命周期中占用CPU (运行态)与I/O (阻塞态)的情景,由于是void 型函数,因此没有返回值。其中,参数last 表示
占用CPU 以及I/O 操作的总时间;参数cpu_time 表示一次连续占用CPU 的时间;参数io_time 表示一次I/O 操作占用的时间[6]。后二者必须大于等于0。该函数编写完毕后在main 函数中调用,生成进程的同时输出父进程和子进程的ID 。3.3
DataLoad_Calculate 函数
在分析程序中,DataLoad_Calculate 函数的功能是从 中读取信息并计算相关数据,文件默认的读取与存储路径设置为D 盘,返回值为1(读取成功)或0(读取失败)。函数主体是进行一个循环调用fscanf 的过程,当fscanf 读取的有效参数不足4个时,说明文件信息已全部读取并结束循环。
由于事先定义了进程结构体数组(容量为100),因此只需根据读取到的进程ID 即可快速锁定对应进程的下标(与其ID 相同)[7]。之后即可根据后续信息更新该进程的时间点并计算相关数据。当所有信息读取完毕后,再计算总的平均周转时间、平均带权周转时间、平均等待时间以及吞吐率。
4程序测试与验证
4.1
跟踪进程及创建进程程序调试
首先运行Linux 内核。在内核中调用创建进程程序 生成父进程和4个子进程,进程ID 分别为6—10。Linux 内核自动生成log 日志文件,存储在虚拟磁盘B 中。执行mcopy 操作,将
log 日志文件另存为 文本文档,并将其保存入floppyb 镜像文件中。该步调试结果如图2所示(截图时镜像文件内已保存有 ,故弹出是否覆写已存在的 文档提示)。跟踪进程结果保存在 中。输出结果每行从左到右依次为该进程的进程ID 、进程刚进入的状态、进入该状态时的系统滴答时间数以及进程的优先级。
图2Linux 0.11内核操作
Copyright ©博看网. All Rights Reserved.
科技与创新┃Science and Technology&Innovation ·68·2023年第13期
4.2分析数据程序调试
在visual studio2019下编写程序来分析数据,计算平均周转时间等信息。该程序默认调取 文件位于D:/根目录下。运行Data Analize.cpp程序,未报告错误。程序读取,并将结果在D:/中新建文本文档。中给出了参与运行的所有进程的详细数据信息。
生成文件如图3所示。
图3生成文件4.3在Linux内核中调整初始时间片调试
在Linux内核的sched.h头文件的第187行修改内
核定义的初始优先级来直接性地调整进程0及其所有
子进程的初始时间片,修改时需要改动的参数分别为
进程0的进程ID、时间片大小、进程优先级。将时间
片长度分别修改为10、15以及20,形成3个实验组,
其对比分析结果如表2所示。
表2统计计算结果
时间片大小平均周
转时间
平均等
待时间
平均带权
周转时间
吞吐率/
(进程数·s-1)
103192.89192.5624.120.055
151688.64244.0013.440.103
202151.79242.2916.520.098
由于Linux0.11采用的是抢占式时间片轮转的进程调度算法,时间片大小的选择会对系统性能有很大的影响。由统计结果可以看出,在时间片大小变更后,进程的平均周转时间升高、系统吞吐率降低,时间片较小时其平均等待时间变小。这是由于在时间片较大时,时间片轮转算法将会近似于先来先服务算法,不利于满足短作业和交互式用户的需求;而时间片较小时,虽然有利于短作业,但是会频繁地执行进程调度和上下文的切换,造成额外的系统开销并降低整体效率,这也是为什么在时间片大小为10的情况下,虽然其平均等待时间较小,但吞吐率仍然较低[8]。因此,时间片的选择不是越大越好或越小越好,而是需要根据系统环境选定适合大小的时间片。一个较为可取的时间片大小是略大于一次典型的交互所需要的时间,使大多数交互式进程能在一个时间片内完成。
5结束语
本文主要设计了一种针对Linux0.11系统的进程跟踪及分析程序。通过动态改变时间片大小以及结果分析,得出并验证了如何设置时间片大小的合理结论。参考文献:
[1]北京英真时代科技有限公司.Linux内核实验教程
_2.1[Z].2014.
[2]赵炯.Linux内核完全注释[M].北京:机械工业出版社,
2004.
[3]赵炯.Linux内核完全剖析:基于0.12内核[M].北京:机械
工业出版社,2009.
[4]LOVE R.Linux内核设计与实现[M].陈莉君,康华,译.3
版.北京:机械工业出版社,2011.
[5]张荣亮.Linux操作系统内核分析与研究[D].南昌:江西师
范大学,2007.
[6]邹治锋.基于Linux的进程调度算法的改进与实现[D].无字符串长度统计
锡:江南大学,2006.
[7]汤子瀛,哲凤屏,汤小丹.计算机操作系统[M].西安:西
安电子科技大学出版社,1996.
[8]杜传业.嵌入式Linux内核解析[D].天津:河北工业大学,
2007.
————————
作者简介:王浩宇(2000—),男,本科生,研究方向为计算机科学与技术。
(编辑:张超)
Copyright©博看网. All Rights Reserved.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。