当前位置:首页 > 计算机 > 计算机应用 >

上下文切换延迟测量的一种改进方法

分享到:
作者:管理员。 TAGS:改进,方法,测量,切换,延迟,
   引言 上下文切换在操作系统中是一项关键的性能参数。一直以来,精确地测量上下文切换延迟都是一项不容易的工作。传统的上下文切换延迟测量的是最小上下文切换时间——在两个进程间相互切换而不做其他事情。 很多测试程序通常使用一些系统调用来强制进行上下文切换,例如Ousterhout的上下文切换测试程序,所得的测
试结果是上下文切换延迟与管道延迟的和。本文使用一种可行的方法来极大地降低Unix管道延迟对测试结果的影响,是结果的准确性有所提高。
1. 两种上下文切换的令牌机制
1.1使用Unix管道作为令牌进行传递
  lmbench是当前被广泛使用的基准测试程序。lmbench将2-20个进程用Unix管道连接成一个环,用一个令牌在进程之间传递,强制进程之间进行上下文切换。在诸多经过lmbench测试的程序中,我们发现Unix管道所耗费的时间是上下文切换时间的30%-300%,所以测试程序事先要测量Unix管道的延迟:通过令牌将一个进程与自己连接成一个环,此时的测量结果不包含上下文切换的时间,仅仅是Unix管道的延迟。之后从测量时间中减去Unix管道的延迟,就是上下文切换的延迟。
表1  总延迟和单独的管道延迟

  lmbench的测试方法从理论上达到了一个较高的准确程度。然而由于Unix管道的延迟本身能够达到上下文切换延迟的数倍(如表1 所示),所以我们可以找寻一种更精确的方式来代替Unix管道来充当令牌。
1.2 使用pthread互斥锁作为令牌进行传递
 当内核控制路径必须访问共享数据结构或进入临界区时,就需要为自己获取一把“锁”。pthread互斥锁就是这样一种用来对共享资源提供访问保护的锁机制。对共享资源的访问,要对互斥量进行加锁。如果互斥量已经上了锁,调用线程会阻塞,直到互斥量被解锁。在完成了对共享资源的访问后,要对互斥量进行解锁。
 在这种上下文切换的令牌设计上,起初我们除了为每个线程创建了一个锁外,还创建了一个额外的锁。每个线程开始时都拥有一个“锁”,并锁定自己的锁,然后试图获取邻近线程的锁。当它获得了临近线程的锁时,就会释放当前持有的锁,然后接着试图获取与它当前占有的锁顺序相连的下一个锁。这种按顺序使用锁的方式与通过管道进行上下文切换的情况非常相似。
2. 使用pthread互斥锁令牌实现上下文切换延迟测量
2.1 方法的理论介绍
 为了方便说明问题,我们选用两个进程的简单情况进行测量和验证,每个进程中就只包含一

[论文网 lunwen.nangxue.com]个工作的线程。起初所有线程在等待使用邻近线程的锁时都被阻塞(与最后一个锁相邻的是第零个锁)。被插入到拥挤的锁行列的是最初解开的那个额外的锁。线程要承担的工作是; 锁定最初解锁的线程,并对自己的线程解锁,然后试图锁定邻近的线程。
 如图1 所示:


a. 初始状态,T1、T2两个线程分别锁住临界区C1、C2,T1、T2继续执行的条件分别是获取临界区C2、C3的锁。而此时临界区C2被线程T2锁住,而临界区C3空闲;
b. T2发现C3未加锁,如I所示,先将C3锁住,然后将C2解锁;T2欲继续执行,而此时它所需要的临界资源变成了C1,此时C1还处于被T1锁住的状态,所以T2被阻塞;
c. T1发现C2未加锁,如II所示,先将C2锁住,然后将C1解锁;T1与继续执行,而此时它需要的临界资源变成了C3,此时C3还处于被T2锁住的状态,所以T1被阻塞;
d. T2发现C1未加锁,如III所示,T2将会锁住,然后将C3解锁。
e. T1、T2两个线程如上所述,交替执行,直到达到测试程序的停止条件。
-
   这样,通过锁完成了类似Unix管道的功能。两个线程在互相切换的过程中,只包含“加锁”与“解锁”的延迟,类似于Unix的管道延迟。
2.2 关键代码
 程序的关键代码如图2 所示,程序开始时将先后启动两个线程,分别执行如下程序。

2.3 测试结果及分析
  在Linux 2.6.32下连续5次运行测试程序的结果如表2 所示。从表2 可以看出,使用了锁机制对线程进行操作,使得上下文切换中的令牌时间开销变得非常小。通过互斥锁令牌与lmbench两种方法测试得出的结果相差不大,在1%左右。此处所列出的使用互斥锁令牌测得的上下文切换的延迟结果中仍然包含了互斥锁令牌的延迟。
  
  
表3 展示了Linux 2.4.2内核同步原语的延迟,我们选用的Linux 2.6.2的延迟也在这个数量级上。从表中可以看出我们选作令牌的pthread_mutex同步原语的延迟非常小,只有0.262微秒,大约是上下文切换延迟5%,在对结果要求精度不高的情况下可以忽略。如果进一步追求结果的精度,可以编写程序

  • 共2页:
  • 上一页
  • 1
  • 2
  • 下一页