`
猫太的鱼
  • 浏览: 243778 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

测试进程上下文切换时间

阅读更多
测试Context Switch time(进程上下文切换时间)
--------------------------------------------------
    创建两个进程(实时进程)并在它们之间传送一个令牌,如此往返传送一定的次数。其中一个进程在读取令牌时就会引起阻塞。另一个进程发送令牌后等待其返回时也处于阻塞状态。发送令牌带来的开销与上下文切换带来的开销相比,可以忽略不计。 (利用管道传递令牌)


测试程序(1) 使用gettimeofday()获取当前时间
--------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
#include <sched.h>
#include <sys/types.h>
#include <unistd.h>      //pipe()

int main()
{
    int x, i, fd[2], p[2];
    char send    = 's';
    char receive;
    pipe(fd);
    pipe(p);
    struct timeval tv;
    struct sched_param param;
    param.sched_priority = 0;

    while ((x = fork()) == -1);
    if (x==0) {
        sched_setscheduler(getpid(), SCHED_FIFO, &param);
        gettimeofday(&tv, NULL);
        printf("Before Context Switch Time %u us\n", tv.tv_usec);
        for (i = 0; i < 10000; i++) {
            read(fd[0], &receive, 1);
            write(p[1], &send, 1);
        }
        exit(0);
    }
    else {
        sched_setscheduler(getpid(), SCHED_FIFO, &param);
        for (i = 0; i < 10000; i++) {
            write(fd[1], &send, 1);
            read(p[0], &receive, 1);
        }
        gettimeofday(&tv, NULL);
        printf("After Context SWitch Time %u us\n", tv.tv_usec);
    }
    return 0;
}



测试结果(进程切换时间不超过5us)
--------------------------------------------------
Before Context Switch Time 617087 us
After Context SWitch Time 702420 us

702420us - 617087us = 85333 us
85333us / 20000    = 4.26665 us

进程切换时间为4.26665 us

注: cpu MHz         : 2801.042






测试程序(2) 使用rdtsc()获取当前时间
--------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <sys/types.h>
#include <unistd.h>

long long rdtsc()
{
    __asm("rdtsc");
}

int main()
{
    int x, i, fd[2], p[2];
    char send    = 's';
    char receive;
    pipe(fd);
    pipe(p);
    struct sched_param param;
    param.sched_priority = 0;

    while ((x = fork()) == -1);
    if (x==0) {
        sched_setscheduler(getpid(), SCHED_FIFO, &param);
        printf("Before Context Switch Time %lld\n", rdtsc());
        for (i = 0; i < 10000; i++) {
            read(fd[0], &receive, 1);
            write(p[1], &send, 1);
        }
        exit(0);
    }
    else {
        sched_setscheduler(getpid(), SCHED_FIFO, &param);
        for (i = 0; i < 10000; i++) {
            write(fd[1], &send, 1);
            read(p[0], &receive, 1);
        }
        printf("After Context Switch Time %lld\n", rdtsc());
    }
    return 0;
}


测试结果(进程切换时间不超过5us)
--------------------------------------------------
Before Context Switch Time 16208184381648
After Context Switch Time 16208424333213

16208424333213 - 16208184381648 = 239951565(clock cycle)
239951565      * 0.357009998 ns = 85665107.74074687 ns
85665107.74074687 ns / 20000    = 4283.255387037 ns = 4.283255387037 us






注: cpu MHz         : 2801.042
---------------------------------------------
2 801 042 000Hz
clock cycle = 1 000 000 000 ns / 2 801 042 000 = 0.357009998ns

查看CPU性能参数
cat /proc/cpuinfo









测试程序(3) 可直接获得进程上下文切换时间
--------------------------------------------------

#include <stdio.h>
#include <stdlib.h>        //drand48()
#include <sched.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/time.h>      //gettimeofday()
#include <time.h>


typedef unsigned long long u64;
double clockCycleTimeS,clockRateHZ;

/* 获取当前时间,返回秒 */
double second() {
    struct timeval tv;
    gettimeofday(&tv,0);
    return tv.tv_sec + 1e-6 * tv.tv_usec;
}

/* 获取当前时间,返回clock cycle */
u64 rdtsc() {
    u64 tsc;
    __asm__ __volatile__("rdtsc" : "=A" (tsc));
    return tsc;
}

/* 睡眠us微秒 */
void selectsleep(unsigned us) {
    struct timeval tv;
    tv.tv_sec = 0;
    tv.tv_usec = us;
    select(0, 0, 0, 0, &tv);
}

/* 计算当前CPU的工作频率 */
void calibrate() {
    double sumx = 0;
    double sumy = 0;
    double sumxx = 0;
    double sumxy = 0;
    double slope;
    const unsigned n = 30;
    unsigned i;

    for (i=0; i<n; i++) {
        double breal,real,ticks;
        u64 bticks;

        breal = second();
        bticks = rdtsc();
        selectsleep((unsigned)(10000 + drand48() * 200000));
        ticks = rdtsc() - bticks;
        real = second() - breal;

        sumx += real;
        sumxx += real * real;
        sumxy += real * ticks;
        sumy += ticks;
    }
    slope = ( (sumxy - (sumx*sumy) / n) /
              (sumxx - (sumx*sumx) / n) );
    clockRateHZ = slope;
    clockCycleTimeS = 1.0 / slope;
    printf("%3.3f MHz\n", clockRateHZ*1e-6);
}

int main()
{
    calibrate();

    int x, i, p1[2], p2[2], time[2];
    char send    = 's';
    char receive;
    u64 old_time;
    pipe(p1);
    pipe(p2);
    pipe(time);
    struct sched_param param;   
    param.sched_priority = 0;   

    while ((x = fork()) == -1);
    if (x==0)
    {
        sched_setscheduler(getpid(), SCHED_FIFO, &param);
        old_time = rdtsc();
        write(time[1], &old_time, sizeof(old_time));
        for (i = 0; i < 10000; i++) {
            read(p1[0], &receive, 1);
            write(p2[1], &send, 1);
        }
        exit(0);
    }
    else
    {
        u64 new_time;
        sched_setscheduler(getpid(), SCHED_FIFO, &param);
        for (i = 0; i < 10000; i++) {
            write(p1[1], &send, 1);
            read(p2[0], &receive, 1);
        }
        new_time = rdtsc();
        read(time[0], &old_time, sizeof(old_time));
        printf("Latency time = %3.3f us\n",
                1e6 * (new_time - old_time) * clockCycleTimeS / 20000);
    }
    return 0;
}




测试结果(Linux-2.6.21 + RealTime Patch)
--------------------------------------------------
2801.226 MHz
Latency time = 8.129 us
分享到:
评论

相关推荐

    一种任意时间片长度对CPU上下文切换代价影响消除的新方法.pdf

    上下文切换是指当一个进程或线程被暂停执行,而另一个进程或线程获得CPU执行权时,处理器保存当前进程的状态(上下文),加载新进程的状态,这一过程就是上下文切换。上下文切换代价主要包括时间开销、内存消耗和I/O...

    测试Context Switch time()

    从文件的标题、描述、标签以及部分内容来看,该程序旨在测量进程上下文切换的时间消耗。以下将详细阐述涉及的相关概念和技术细节。 ### 一、上下文切换(Context Switch)简介 在操作系统中,上下文切换是指操作系统...

    操作系统进程切换实验代码

    3. **上下文切换**:这是实际进行进程切换的过程,包括保存当前进程的上下文(CPU寄存器、程序计数器等),加载新进程的上下文,并更新进程状态。 4. **同步与通信**:在多进程环境中,进程间可能需要同步(避免...

    minix环境下实现操作系统基本的进程调度进程切换

    2. **上下文切换**:上下文切换是进程切换的核心,包括保存当前进程的上下文(如寄存器状态)、加载新进程的上下文以及更新调度数据结构。在Minix中,这通常涉及中断处理和内核级的函数调用。 3. **调度器接口**:...

    [试读]服务器并发处理能力+-+进程切换

    - **负载情况**:当对Apache服务器进行压力测试时,上下文切换次数显著增加,例如每秒平均18166.5次。这表明在高并发场景下,进程间的切换频率大大增加。 #### 五、结论 通过以上分析,我们可以看出服务器并发处理...

    进程调度 时间片轮转算法 操作系统

    代码可能包括了进程创建、时间片分配、调度循环、上下文切换等核心逻辑。而“pro4.exe”可能是实验运行的可执行文件,用于模拟和测试RR算法的效果。 时间片轮转算法的优势在于它能提供较好的响应时间,适合于需要...

    进程调度模拟设计——时间片轮转、优先级法

    在设计中,我们首先对进程调度的功能进行了分析,包括记录系统中所有进程的执行情况、选择占有处理机的进程和进程上下文切换。然后,我们选择了时间片轮转和优先级法两种算法来模拟进程调度。时间片轮转法中,我们...

    进程管理实验(测试进程创建的有关内容)

    1. **时间开销**:通过实验可以测量从发起进程创建请求到进程真正开始执行的时间,这涉及到系统调用的处理时间、上下文切换等。 2. **资源利用率**:分析系统在创建进程时的CPU、内存利用率,以及对其他进程的影响,...

    进程调度模拟设计--时间片轮转、最高响应比优先调度算法

    3. **上下文切换**:模拟进程在时间片结束或优先级改变时的上下文切换过程,更新进程状态和资源分配。 4. **时间模拟**:设置一个虚拟时钟来模拟实际时间的流逝,以便在时间片结束时触发调度。 5. **性能评估**:...

    嵌入式Linux内核实时性测试研究.pdf

    在测试实验中,设计了三种测试方案:第一种是测量父子进程切换时间,第二种是测量进程上下文切换时间,第三种是测量中断延迟时间。每种测试方案都包括方案设计、方案实现和测试结果与分析。 测试结果表明,Linux...

    机载嵌入式实时操作系统时间性能测试.doc

    文章首先介绍了几个关键时间参数,包括错误响应时间、区间数据交换时间和进程上下文切换时间,并阐述了它们如何影响操作系统的实时性能。接着,文章详细描述了测试方法,包括测试用例的设计、测试工具的选择以及排除...

    并发的进程调度模拟程序

    当进程调度器决定切换到另一个进程时,需要保存当前进程的上下文(CPU寄存器、内存映射等)并恢复新进程的上下文,这个过程称为上下文切换,其开销是调度的一个重要考虑因素。 6. **同步与互斥** 并发进程中可能...

    测试系统创建进程的极限

    此外,操作系统还需要管理每个进程的上下文切换,过多的进程可能会导致性能下降。 测试进程创建极限的过程需要谨慎进行,以免对系统稳定性造成影响。我们可以通过编写一个简单的程序,循环调用`CreateProcess`,并...

    操作系统课程设计进程调度

    这种方法适用于交互式系统,保证了响应时间,但可能导致CPU上下文切换开销增大。 4. 高响应比优先(HRRN,High Response Ratio Next):结合等待时间和执行时间,以响应比最高的进程优先执行,既考虑了短进程又避免...

    操作系统大作业进程调度

    同时,理解操作系统中的一些基本概念,如上下文切换、进程通信和信号量等,也将有助于你更好地完成这个大作业。 总的来说,这个操作系统大作业将涵盖操作系统设计的核心部分,提供实践和深入理解进程调度的机会。...

    操作系统之进程调度设计 C语言版

    4. **进程切换**:模拟进程上下文切换,更新进程状态并保存/恢复上下文信息。 5. **模拟环境**:创建并初始化一组进程,模拟它们的运行,以便测试调度算法的效果。 为了测试和验证你的实现,你可以设计一些测试用例...

    JinChengDiaodu.rar_jinchengdiao_算法_进程调度 时间片轮转

    3. 上下文切换机制:保存和恢复进程状态,以便在时间片结束时快速切换到下一个进程。 4. 时间片管理:维护当前时间片计数,并在达到预设值时触发调度。 通过分析和优化这些组件,作者可能已经构建了一个能够适应...

    Linux操作系统实时性测试及分析.pdf

    Lmbench是一个轻量级的基准测试套件,可以测量中断响应时间、上下文切换速度等关键指标,为嵌入式Linux的实时应用提供数据支持。 5. 嵌入式应用的影响 在嵌入式系统中,由于硬件资源有限且性能要求严格,Linux的...

    操作系统 时间片轮转算法

    4. **上下文切换**:如果当前进程的时间片用完,将该进程移出运行状态,保存其上下文信息,以便下次继续执行。同时,将该进程放回就绪队列的末尾。 5. **选择新进程**:选择就绪队列中的下一个进程执行,重复以上...

    模拟CUP进程调度

    此外,模拟CPU执行过程时,要考虑到上下文切换的开销,即保存和恢复进程状态的过程。 在"ProcessManage"这个文件中,可能包含了实现这些功能的代码文件、测试用例和可能的数据结构定义。通过阅读和理解这段代码,你...

Global site tag (gtag.js) - Google Analytics