保障Qos的实时Linux系统设计

  • 格式:pdf
  • 大小:241.38 KB
  • 文档页数:5

保障QoS的实时Linux系统设计王永新1,刘日升11大连理工大学计算机应用技术系(116023)E-mail:wangyx_cti@摘 要:本为了在综合业务网络中保障实时多媒体业务的服务质量(QoS),设计了软实时Linux系统。

系统中将网络接受中断的推后执行工作交由工作队列来执行,而非传统的由网络接受软中断处理。

工作队列是Linux 2.6内核中新增的下半部机制,它与软中断最大的区别在于它可以在进程上下文中处理推后执行的工作。

这样,利用Linux 2.6 内核的进程调度机制,对实时多媒体任务和数据任务实施不同的优先级调度,以保证实时多媒体任务的优先处理而不是尽力而为(Best Effort),保障其服务质量。

通过简单的测试证明本系统运行稳定,能够保障实时多媒体业务的服务质量,尤其对解决延迟抖动问题有明显的效果。

关键词:实时 服务质量 内核 工作队列1.引言下一代IP网络是以软交换为中心的综合业务网络。

随着语音、视频等实时多媒体业务的引入,急切需要网络系统能够提供实时多媒体应用所需的服务质量(QoS)。

由于传统IP 网络基本上是采用点到点尽力而为型(Best Effort)的服务方式,所以很难有效满足实时多媒体业务的服务质量要求。

因此,QoS保障成为下一代IP网络的重要课题。

在不同的领域都有改善QoS的研究,例如传输系统、多媒体网络和操作系统。

本文从操作系统角度对改善实时多媒体业务的服务质量进行了探讨。

Linux 2.6 内核对于2.4内核有了很大的改进,如进程调度部分:实现了O(1)调度和内核可抢占,提高了调度性能。

Linux 2.6不是一个实时内核,而这些改变将使Linux转变为实时操作系统(RTOS)成为可能,尤其是提供实时多媒体应用支持的软实时操作系统。

在Linux 2.6 内核中引入了一种新的下半部机制,工作队列。

它与其他几种下半部机制最大的区别就是它可以把工作推后,交由一个内核线程去执行,这样该工作总是会在进程上下文执行。

这样,通过工作队列执行的代码能占尽进程上下文的所有优势。

本文借助IETF的区分服务(DiffServ)策略提供QoS保障的思想,基于工作队列对不同优先级的网络传输业务,设置不同的CPU调度参数。

为优先级较高的实时多媒体业务提供优先的调度,从而保障实时多媒体业务的服务质量。

2.Linux 2.6 进程调度分析[1]Linux 2.6 内核调度系统有两点新特性对实时应用至关重要:内核抢占和 O(1) 调度,这两点都保证实时进程能在可预计的时间内得到响应。

2.1 关于O(1)调度Linux 2.6 调度程序中最基本的数据结构是可执行队列(runqueue)。

它是给定处理器上的可执行进程的链表,每一个处理器一个,这样大大的减少了竞争。

每个可投入运行的进程都唯一的归属于一个可执行队列。

此外,可执行队列还包含每个处理器的调度信息。

每个 CPU 的可执行队列按时间片是否用完分为两部分,即活跃优先级数组和过期优先级数组。

它们分别通过 runqueue结构中的active 指针和 expired 指针访问,active 指向时间片没用完、当前可被调度的优先级数组,expired 指向时间片已用完的过期的优先级数组。

优先级数组用一个 struct prio_array 的结构表示:struct prio_array {int nr_active; /*优先级数目*/bitmap[BITMAP_SIZE]; /*优先级位图*/longunsigned- 1 -structlist_head queue[MAX_PRIO]; /*优先级队列*/ };优先级数组使可运行处理器的每一种优先级都包含一个相应的队列,而这些队列包含对应优先级上的可执行进程链表。

优先级数组还拥有一个优先级位图,当需要查找当前系统内拥有最高优先级的可执行进程时,它可以帮助提高效率。

许多操作系统在所有时间片都用完时,都采用循环访问每个进程的方法来计算每个进程的时间片。

这样有n个进程的系统复杂度可能达到O(n)。

Linux 2.6 内核的调度程序减少了对循环的依赖。

活跃数组内的可执行队列上的进程都还有时间片剩余;而过期数组内的可执行队列上的进程都耗尽了时间片。

当一个进程的时间片耗尽时,它会被移至过期数组。

重新计算时间片变得非常简单,只要在活动和过期数组之间交换指针就可以了。

这样复杂度就与系统中的进程数无关,因此是复杂度为O(1)的调度。

O(1)调度保证了调度程序采用的每一个算法都能在恒定时间内完成,因此提高了调度效率,有助于提高系统的实时性能。

2.2 内核抢占Linux 2.6内核引入了内核抢占,只要重新调度是安全的,那么内核就可以在任何时间抢占正在执行的内核任务。

在上述提到的thread_info数据结构中引入了preempt_count计数器,该计数器初始值为0,每当使用锁的时候数值加1,释放锁的时候减1。

当数值为0的时候,证明没有持有锁,内核就可以进行抢占了。

内核抢占可能发生在以下几种时刻:1.当从中断处理程序返回内核空间的时候。

此时,内核会检查need_resched和preempt_count的值。

如果need_resched被设置,并且preempt_count为0的话,这说明有一个更重要的任务需要执行并且可以安全的抢占,此时,调度程序会被调用。

2.当内核代码再一次具有可抢占性的时候。

如果当前进程持有的所有的锁都被释放了,那么preempt_count重新为0。

此时,释放的代码会检查need_resched是否被设置。

如果是的话,就会调用调度程序。

3.如果内核中的任务阻塞或显式的调用schedule()。

内核任务可抢占也就是增加了调度器运行的时机,从而增强了系统的实时性能。

3.Linux网络数据包接收过程分析[3]内核对网络数据包的接收过程如图1所示,大概是按如下过程进行的: Linux1.网络设备接收到数据包,将其保存在设备内存的一个缓冲区中。

之后,向主机发送硬件中断,通知数据包已到达。

2.中断处理程序为包分配和初始化一个新的套接字缓冲区。

中断处理程序通过DMA 方式将设备内存的包拷贝到套接字缓冲区中。

并调用一个函数(如用于以太网的eth_type_trans())以确定封装在数据链路帧中的包协议。

3.中断处理程序调用netif_rx()函数通知Linux网络代码新的套接字已经到达,并把新到的包追加到CPU接受队列。

而后调用cpu_raise_softirq()激活NET_RX_SOFTIRQ 网络接收软中断。

4.执行软中断处理函数net_rx_action(),从队列中提取第一个包,确定在数据链路层中的数据包的网络层协议的编号。

之后调用网络层协议的适当函数,对数据包按协议分发。

5.完成协议处理之后,用户程序通过系统调用将数据包拷贝到用户空间,用户程序进行分析处理。

- 2 -图1 Linux 网络数据包接收过程4.工作队列[1]工作队列是Linux 2.6内核中新增加的一种下半部机制。

工作队列可以把工作推后,交由一个内核线程去执行——该工作总是会在进程上下文执行。

这样,通过工作队列执行的代码能占尽进程上下文的所有优势。

最重要的就是工作队列允许重新调度甚至是睡眠。

工作队列子系统是一个用于创建内核线程的接口,通过它创建的进程负责执行由内核其它部分排到队列里的任务。

它创建的这些内核线程被称作工作者线程(worker threads)。

工作队列可以让驱动程序创建一个专门的工作者线程来处理需要推后的工作。

不过,工作队列子系统提供了一个缺省的工作者线程来处理这些工作。

如果要在工作者线程中执行大量的处理操作(如本文中),可以创建属于自己的工作者线程。

下面给出了工作队列涉及的关键数据结构:每个工作者线程对应一个cpu_workqueue_struct结构体:表示工作队列中的工作的数据结构如下:struct work_struct{unsigned long pending; /* 这个工作正在等待处理吗?*/struct list_head entry ; /* 连接所有工作的链表*/ void (*func) (void *); /* 处理函数*/void * data; /* 传递给处理函数的参数*/void * wq_data; /* 内部使用*/struct timer_list timer; /* 定时器 */};这些结构体被连接成链表,每种类型的链表,在每个处理器上都有一个。

当一个工作者线程被唤醒时,它会执行它的链表上的所有工作。

工作被执行完毕,它就将相应的work_struct 对象从链表上移去。

当链表上不再有对象的时候,它就会继续去休眠。

5. 系统设计与架构[2]通过对Linux 网络数据包接受过程的分析,可以得知如下:在网卡硬件中断处理程序结束之后,其推后工作交由NET_RX_SOFTIRQ软中断执行。

由于软中断处理程序运行于中断上下文,因此其处理过程是串行化的,这样就不利于实时多媒体任务的优先处理。

在我们的系统中采用了新的工作队列机制取代软中断机制来完成网络接受中断的推后- 3 -处理工作。

通过由具有最高实时优先级的工作者线程来处理实时多媒体任务,而由优先级次高的工作者线程来处理其他的非实时数据业务。

由于Linux 2.6 内核的调度系统能够满足软实时的要求,因此几乎总能保证处理实时多媒体业务的工作者线程优先执行。

这样,就保证了多媒体实时任务得到优先的处理,而非尽力而为(Best effort),保障了其服务质量。

6.结束语依照系统的框架在Linux2.6内核源代码的基础上实现了本系统,将其运行在实验室的网络环境中。

作为对系统的测试,我们采用实时多媒体数据和大量FTP数据同时流经网络节点的方式。

发现采用本系统保证了实时多媒体业务的服务质量,尤其是对解决延迟抖动问题有明显的效果。

参考文献[1]Robert Love .Linux kernel development.北京:机械工业出版社,2004.[2] Linux 2.6 内核源代码. /pub/linux/kernel/v2.6/.[3] Richard Stevens,等 .TCP/IP详解卷二:实现.北京:机械工业出版社,2000.- 4 -The design of real-time Linux for guaranteeing QoSYongXin WANG RiSheng LIUDepartment of Computer Application Technology,Dalian University of Technology, Dalian, PRC, 116023AbstractFor guaranteeing Quality of Service of real-time multimedia task in the integrative business network, a soft real-time Linux system was designed. In this system, the deferring work of receiving interrupt in network shall be executed by work queue, but not the receiving soft-interrupt in network, which is traditional. Work queue is a new kind of bottom halves in Linux 2.6 kernel. It is the most difference from soft-interrupt that deferring work shall be executed in process context. Thus, under the mechanism of process scheduling in Linux 2.6 kernel, the real-time multimedia task and data task shall be scheduled with different priority. This will guarantee the prior handling for real-time multimedia task but not Best Effort and QoS of it. A simple test has been done to certify that the system is stable, and it can guarantee the QoS of real-time multimedia task, especially the delay jitter.Keywords:Real-Time QoS Kernel Work Queue作者简介:王永新:男。