一种Linux操作系统进程调度信息的监测方法

文档序号:6614481阅读:190来源:国知局
专利名称:一种Linux操作系统进程调度信息的监测方法
技术领域
本发明涉及Linux操作系统,具体涉及在Linux操作系统进程调度信息 的监测方法。
背景技术
Linux凭借着源码开放的自由精神,在操作系统市场中的份额不断增加。 事实上,对其源码的自由修改和重发布,已经成为大多数嵌入式产品中操作 系统开发和移植的首选途径。因此,研究Linux内核对嵌入式系统尤其是嵌 入式操作系统的开发和移植有着重要的意义。而其中的调度系统对于操作系 统的整体性能有着非常重要的影响,因而研究内核调度器(即调度程序)及 其调度性能就是一项重要内容。
然而,当前有关Linux调度系统的研究大多停留在理论层面,如分析其 调度策略和算法实现的时间复杂度,等等;而对Linux内核所支持的任务抢 占,其调度性能即抢占是否实时、是否满足用户体验;CPU时间片分配是 否公平、合理、有效等方面没有给出直观、准确的测试验证。
另外,在现有的一些技术和解决方案当中, 一般提取内核信息时,都是 通过新创建和运行一个用户进程,独自来读取和处理数据,也即先通过系统 调用,陷入内核,拷贝内核緩冲中的信息至用户緩冲区中,然后返回该用户 进程空间,再^f故相应的处理。
但是当我们要提取的是内核调度本身相关的信息时,这种方案显然是行 不通的。因为新增的用户进程本身就要参与进程调度,也即会增加冗余的调 度信息,并且系统调用时的陷入、返回机制,也会改变调度系统的调度策略 和顺序,以致会造成分析结杲的不准确;另外,当提取大量的信息时,过多 的内核至用户緩沖区的数据拷贝也会加重系统负担,造成分析结果实时性不
强。
还有,现有技术在通过网络输出信息时,最常见的是采用TCP/IP协议
栈,即自网络层以下,采用以太网和IP协议,而传输层则采用简单快速的
UDP协议,这就减去了 TCP协议三次握手过程所造成的系统负担和资源浪 费,保证了数据传输的实时性。由于考虑到通讯协议的层次抽象性和通用性, Linux内核网络子系统在实现时,采用的是通用多层协议处理机制(如图1 所示)。如果大量的内核调度信息通过这种复杂的流程机制向网络发送的话, 势必加重系统负担,影响系统性能。

发明内容
本发明要解决的技术问题是提供一种Li皿x操作系统进程调度信息的监 测方法,以解决现有技术无法从实践角度监测及考察Linux的进程调度信息 的缺陷。
为了解决上述问题,本发明提供了一种Linux操作系统进程调度信息的 监测方法,包括
a目标机在调用用户进程时记录进程调度信息,并将其写入内核緩沖
区;
b读取所述内核緩冲区中的所述进程调度信息,并将其发送给测试主
机;
c所述测试主机对收到的所述进程调度信息进行相应处理。
进一步地,所述步骤a具体是指在进程选择及切换时增加记录进程调 度信息的记录步骤,执行所述记录步骤的同时将记录的所述进程调度信息写 入内核緩冲区。
进一步地,所述步骤b中,读取所述进程调度信息的方法为创建一内 核线程,读取所述内核緩冲区中的所述进程调度信息,并将所述进程调度信 息封装成驱动程序所用的数据链路层帧,然后交由网卡驱动程序发送至测试 主机。
进一步地,所述步骤c中,测试主机对收到的进程调度信息进行相应处
理是指测试主机收到所述数据链路层帧后,启动用户数据报协议数据包的 接收和处理程序,解析所述数据链路层帧中的信息,并显示解析结果。
进一步地,所述数据链路层帧依次包含以下信息以太网数据包头、网 间协议数据包头、用户数据报协议数据包头及进程调度信息。
综上所述,本发明提供了 一种Linux操作系统进程调度信息的监测方法, 该方法中自定义的进程调度信息的记录语句,既不会生成冗余的内核调度信 息,又方便将来扩展,具有可移植性、灵活性,可扩展性等特点;创建的内 核线程直接从内核緩冲区中读取数据并封装成数据链路帧,绕过了内核中 TCP/IP协议栈的重复处理流程;从而不会造成因监测程序的引入,而增加 内核的调度负载,监测结果更准确;另外,通过数据链路层帧的传输,省去 了在被测主机和测试主机之间建立通信连接所需的时间和资源,实现了监测 的实时性。


图1是现有技术通用的TCP/IP协议栈处理流程图2是本发明方法的操作流程图3是本发明方法产生的数据链路层帧的结构示意图4是测试主机解析程序的一个示例界面,即调度信息的用法示例。
具体实施例方式
本发明提供一种Linux操作系统进程调度信息的监测方法,通过在目标 机的Linux内核源代码中插入记录进程调度信息的语句记录用户进程的调度 情况,并通过创建一内核线程读取记录的进程调度信息,将其发送给测试主 机。
本实施例涉及一种Linux操作系统进程调度信息的监测方法,如图2所 示,具体操作流程如下
步骤101:目标机在进程选择及切换时增加记录进程调度信息的记录步 骤,执行所述记录步骤的同时将记录的进程调度信息写入内核緩沖区。
具体实现方法为修改目标机的Linux内核源代码,通过打补丁(patch)
的方式,在内核源代码中的进程选择及切换点处增加标志记录语句,记录测
试主机分析程序所必需的进程调度信息,然后重新编译和运行新的内核系
统,并当运行该记录语句时将进程调度信息写入内核緩沖区。此处进程调度
信息指与进程调度相关的信息,编写的记录语句可根据系统需要来设定,如
记录所调用进程的进程号,内存状态,也可以是其它测试主机希望获得的信 自
在Linux内核中,调度子系统在进行上下文切换(即选定一个进程并切
换CPU到它去执行)时,是通过schedule()函数实现的,也即该函数是每次
进程调度的必经之处。因此可在该函数内部加入一些记录语句,记录所有测
试主机程序所需要的进程调度信息,运行该记录语句时即可将进程调度信息
写入内核緩冲区中。如下所示,是如何修改schedule()函数源代码的一个范
例,*号之间的部分是加入的记录语句,此处记录的是调用进程的进程号。
在具体的实现过程中,可以对要记录的内核信息做相应的增加或减少,也可
对记录的内容作变化。
asmlinkage void 一sched schedule(void)
{
switch—tasks:
if (next == rq->idle)
schedstat—inc(rq, sched—goidle); prefetch(next); prefetch一stack(next); clear—tsk—need—resched(prev) ^ rcu_qsctr_inc(task—cpu(prev)); update—cpu_clock(prev, rq, now); prev->sleep—avg -二 run—time; if ((long)prev->sleep—avg <= 0)
prev->sleep—avg — 0; prev->timestamp = prev->last—ran = now; sched—info—switch(prev, next); if (likely(prev != next)) {
next->timestamp = now;
rq->nr—switches+十;
rq->curr — next;
++* switch count; prepare—task—switch(rq, next);
sjc sfc y
〃add the record statements for the watch program.
myRecord.prevPid=prev->pid;
myRecord.nextPid=next->pid;
printk(KERN—INFO "kernel's context info:\n"); for(i=0;i<sizeof(myRecord);i++)
printk(KERN—INFO "0x%x ",((char*)&myRecord))[i]); printk(KERN—INF5 "\n");
prev = context—switch(rq, prev, next); barrier();
finish—task—switch(this—rq(), prev); } else
spin_unlock—irq(&rq->lock); prev = current;
步骤102:创建一内核线程(即工作队列),以模块的形式动态加载在内 核中运行,该内核线程负责从内核緩沖区中读取在进程调度过程中所产生的 进程调度信息,并封装成网络数据链路层帧,如图3所示,该数据链路层帧 依次包含以下信息ethemet header(以太网数据包头)/IP header(网间协议数 据包头)/UDP header(用户数据报协议数据包头)/进程调度信息,并将该数据 帧经由网卡设备驱动程序输出到网络上,进而发送至测试主机。
相对于用户进程,该工作队列的执行是作为内核线程参与内核的CPU 调度的,所以它的运行条件和现有技术中内核中其它的调度任务一样;而一 旦它被调度,就读取进程调度信息。这样的内核线程不参与普通用户进程的 调度竟争,保证了结果的客观准确性;而工作队列只是提取和输出数据,不 会造成过多的影响系统性能的数据拷贝。
步骤103:网络另一侧的测试主机收到数据链路层帧后,启动单独的 UDP数据包的接收和处理程序,专门负责接收被监测主机发送过来的UDP 数据包,并且实时、图形化地显示、分析和处理各种进程调度信息。此处启 动的接收及处理程序应根据收到的调度信息的内容而确定,即接收及处理程
序与接收的调度信息相对应。如当接收的调度信息是关于调度进程的进程 号时,则启动用于处理解析进程号的程序;当接收的调度信息是关于内存状 态时,则启动用于处理解析内存占用情况的程序。
该接收和处理程序的设计实现方法可多样,不必拘泥一格。可以由图形 化的多个窗口界面组成,分别显示"时间-进程号"走势,和"时间-内存占用" 走势,等等。如图4所示,是测试主机的一个示例显示界面,显示在不同的 时刻,内核调度系统所选择执行进程的进程号。
权利要求
1、一种Linux操作系统进程调度信息的监测方法,包括a目标机在调用用户进程时记录进程调度信息,并将其写入内核缓冲区;b读取所述内核缓冲区中的所述进程调度信息,并将其发送给测试主机;c所述测试主机对收到的所述进程调度信息进行相应处理。
2、 如权利要求l所述的方法,其特征在于所述步骤a具体是指在进程选择及切换时增加记录进程调度信息的记 录步骤,执行所述记录步骤的同时将记录的所述进程调度信息写入内核緩冲 区。
3、 如权利要求l所述的方法,其特征在于所述步骤b中,读取所述进程调度信息的方法为创建一内核线程,读 取所述内核緩沖区中的所述进程调度信息,并将所述进程调度信息封装成驱 动程序所用的数据链路层帧,然后交由网卡驱动程序发送至测试主机。
4、 如权利要求3所述的方法,其特征在于所述步骤c中,测试主机对收到的进程调度信息进行相应处理是指测 试主机收到所述数据链路层帧后,启动用户数据报协议数据包的接收和处理 程序,解析所述数据链路层帧中的信息,并显示解析结果。
5、 如权利要求3所述的方法,其特征在于所述数据链路层帧依次包含以下信息以太网数据包头、网间协议数据 包头、用户数据报协议数据包头及进程调度信息。
全文摘要
本发明提供了一种Linux操作系统进程调度信息的监测方法,包括目标机在调用用户进程时记录进程调度信息,并将其写入内核缓冲区;目标机读取内核缓冲区中的所述进程调度信息,并将其发送给测试主机;测试主机对收到的所述进程调度信息进行相应处理。采用本发明的技术方案,既不会生成冗余的内核调度信息,又方便将来扩展,具有可移植性、灵活性,可扩展性等特点;而且内核线程不会造成因监测程序的引入,而增加内核的调度负载,监测结果更准确;另外,通过数据链路层帧的传输,省去了在被测主机和测试主机之间建立通信连接所需的时间和资源,实现了监测的实时性。
文档编号G06F11/36GK101169758SQ200710188340
公开日2008年4月30日 申请日期2007年11月19日 优先权日2007年11月19日
发明者彭明星 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1