0

使用ubuntu16.4 内核版本4.10.1

内核sys.c中编译了一段代码:

long oper(int* result, int num1, int num2, char* op)
{
    if(op)
    {
        if(*op == '+')
            *result = num1 + num2;
        else if(*op == '-')
            *result = num1 - num2;
        else if(*op == '*')
            *result = num1 * num2;
        else if(*op == '\\')
        {
            if(num2 != 0)
                *result = num1 / num2;
            else
                printk("divided number can not be zero.\n");
        }
    }
    else
    {
        printk("operator is empty. \n");
    }
    return 0;
}
SYSCALL_DEFINE1(oper_func, int, count)
{
    printk("count is: %d\n", count);
    struct timeval tstart,tend;
    do_gettimeofday(&tstart);
    int result;
    for(i=0;i<count;i++) // +
    {
        char op_add = '+';
        oper(&result, 10, 10, &op_add);
    }
    printk("oper op_add is done. times of op_add is %d \n", i);

    for(i=0;i<count;i++) // -
    {
        char op_sub = '-';
        oper(&result, 20, 10, &op_sub);
    }
    printk("oper op_sub is done. times of op_sub is %d \n", i);

    for(i=0;i<count;i++) // *
    {
        char op_mul = '*';
        oper(&result, 10, 10, &op_mul);
    }
    printk("oper op_mul is done. times of op_mul is %d \n", i);

    for(i=0;i<count;i++) // '//'
    {
        char op_div = '+';
        oper(&result, 20, 10, &op_div);
    }
    printk("oper op_div is done. times of op_div is %d \n", i);

    do_gettimeofday(&tend);
    printk("oper_func running time is %ld usec\n", 1000000*(tend.tv_sec-tstart.tv_sec) + (tend.tv_usec-tstart.tv_usec));
    return 0;
}

系统调用代码(syscall.c):

#include <sys/syscall.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
    int count = 100000*10000;
    // 系统调用号333指向了内核函数oper_func
    long ret = syscall(333,count);
    printf("result is %ld\n",ret);
    return 0;
}

用户态调用户态函数代码(usercall.cpp):

#include <stdio.h>
#include <ctime>
#include <sys/timeb.h>

using namespace std;

long operation(int* result,int num1,int num2,char* op)
{
    if(op)
    {
        if(*op == '+')
        {
            *result = num1 + num2;
        }
        else if(*op == '-')
        {
            *result = num1 - num2;
        }
        else if(*op == '*')
        {
            *result = num1*num2;
        }
        else if(*op == '\\')
        {
            if(num2!=0)
                *result = num1/num2;
            else
                printf("dived number can't be zero!\n");
        }else
            printf("unrecongized operator %c\n", *op);
    }else
    {
        printf("operation is empty.\n");
    }
    return 0;
}
int main()
{
    struct timeb starttime,endtime;
    ftime(&starttime);
    int i;
    const int count = 100000*10000;
    for(i=0;i<count;i++) // +
    {
        int result;
        char op_add = '+';
        operation(&result, 10, 10, &op_add);
    }
    for(i=0;i<count;i++) // -
    {
        int result;
        char op_sub = '-';
        operation(&result, 20, 10, &op_sub);
    }
    for(i=0;i<count;i++) // *
    {
        int result;
        char op_mul = '*';
        operation(&result, 10, 10, &op_mul);
    }
    for(i=0;i<count;i++) // '//'
    {
        int result;
        char op_div = '+';
        operation(&result, 20, 10, &op_div);
    }
    ftime(&endtime);
    printf("usrcall count: %d time use: %ld usec\n", count, 1000*1000*(endtime.time - starttime.time) + (endtime.millitm - starttime.millitm));
    return 0;
}

运行结果:

xkl@xkl:~/Desktop/代码/实验2$ sudo ./usercall
usrcall count: 1000000000 time use: 13921 msec
xkl@xkl:~/Desktop/代码/实验2$ sudo ./syscall
result is 0
xkl@xkl:~/Desktop/代码/实验2$ dmesg
[   83.813329] count is: 1000000000
[   83.813330] xuchufeng_oper op_add is done. times of op_add is 1000000000 
[   83.813331] xuchufeng_oper op_sub is done. times of op_sub is 1000000000 
[   83.813331] xuchufeng_oper op_mul is done. times of op_mul is 1000000000 
[   83.813331] xuchufeng_oper op_div is done. times of op_div is 1000000000 
[   83.813332] xuchufeng_oper_func running time is 2 usec

请问,为什么内核的速度会快这么多?

6月13日提问
0 个回答

撰写答案

推广链接