测量系统调用的和上下文切换的时间

  • 测量系统调用时间

1亿次空读操作,测量平均的系统调用时间

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>

#define ITERATIONS 1e8

int main(void)
{
    struct timeval start, end;

    gettimeofday(&start, NULL);
    for (int i = 0; i < ITERATIONS; i++)
        read(0, NULL, 0);
    gettimeofday(&end, NULL);

    double elapsed_time = (end.tv_sec - start.tv_sec) * 1e6 + end.tv_usec - start.tv_usec;
    printf("System call cost: %f\n", elapsed_time / ITERATIONS);

    return 0;
}

1

系统调用的时间大概为 0.45 微秒

  • 测量上下文切换的时间

创建两个管道,两个进程分别从不同的管道读写,当一个进程被阻塞的时候,就会进行进程切换

#define _GNU_SOURCE

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

#define ITERATIONS 1e6

static void set_cpu_affinity(int pid, int cpu_id)
{
    cpu_set_t cpuset;
    CPU_ZERO(&cpuset);
    CPU_SET(cpu_id, &cpuset);

    if (sched_setaffinity(pid, sizeof(cpu_set_t), &cpuset) == -1) {
        perror("sched_setaffinity failed");
    }
}

int main(void)
{
    int fd1[2], fd2[2];
    pipe(fd1); /* Parent read, child write */
    pipe(fd2); /* Parent write, child read */

    set_cpu_affinity(0, 0);

    pid_t pid = fork();
    if (pid < 0) {
        exit(1);
    } else if (pid == 0) {
        set_cpu_affinity(0, 0);
        close(fd1[0]);
        close(fd2[1]);
        char buffer;
        for (int i = 0; i < ITERATIONS; i++) {
            write(fd1[1], &buffer, 1);
            read(fd2[0], &buffer, 1);
        }
        close(fd1[1]);
        close(fd2[0]);
        exit(0);
    } else {
        struct timeval start, end;
        gettimeofday(&start, NULL);

        close(fd1[1]);
        close(fd2[0]);
        char buffer;
        for (int i = 0; i < ITERATIONS; i++) {
            read(fd1[0], &buffer, 1);
            write(fd2[1], &buffer, 1);
        }
        close(fd1[0]);
        close(fd1[1]);

        gettimeofday(&end, NULL);
        double elapsed_time = (end.tv_sec - start.tv_sec) * 1e6 + end.tv_usec - start.tv_usec;
        printf("Context switch cost: %f\n", elapsed_time / ITERATIONS);

        wait(NULL);
    }

    return 0;
}

2

上下文切换的时间大概是 3 微秒,扣除掉两次系统调用

 posted on 2025-04-12 23:38  Dylaris  阅读(9)  评论(0)    收藏  举报