Onway

我是一只菜菜菜菜鸟...
posts - 61, comments - 56, trackbacks - 0, articles - 34

Linux进程资源在fork和execve前后的变化

Posted on 2013-05-10 20:21 Onway 阅读(2517) 评论(2)  编辑 收藏 引用 所属分类: 码儿快跑
使用getrusage得到的资源统计的类型较多,测试代码是仅针对ru_utime, ru_stime, ru_minflt三种类型的资源。
测试环境:Linux kubuntu 3.2.0-38-generic-pae #61-Ubuntu SMP Tue Feb 19 12:39:51 UTC 2013 i686 i686 i386 GNU/Linux
结论:父进程fork得到的子进程的资源使用被重置,子进程使用execve之后的资源使用不变。
parent.c:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/resource.h>

void
print_rusage(const char * where)
{
    struct rusage used;
    getrusage(RUSAGE_SELF, &used);

    printf("In %s:\n", where);
    printf("user cpu time: %ld(ms)\n",
            used.ru_utime.tv_sec * 1000 + used.ru_utime.tv_usec / 1000);
    printf("sys cpu time: %ld(ms)\n",
            used.ru_stime.tv_sec * 1000 + used.ru_stime.tv_usec / 1000);
    printf("soft page faults: %ld\n", used.ru_minflt);
    printf("\n");
}

void
consume_rusage()
{
    int i, j, k;
    char * s = NULL;

    /* about 3 seconds user cpu time */
    for (i = 0; i < 1000; ++i)
        for (j = 0; j < 1000; ++j)
            for (k = 0; k < 1000; ++k)
                i / (j + 1) * k;
    
    /* 1000 soft page faults */
    k = 4096 * 1000;
    s = (char *)malloc(k);
    for (i = 0; i < k; ++i)
        s[i] = 'a';
}

int
main(int argc, char *argv[])
{
    consume_rusage();
    print_rusage("parent process");

    if (fork() == 0) {
        print_rusage("child process, after fork");
        printf("consuming resource \n\n");
        consume_rusage();
        print_rusage("child process, before execve");
        printf("excl child program now \n\n");
        execl("./child", "./child", (void *)0);
    }

    wait(NULL);
    return 0;
}

child.c:
#include <stdio.h>
#include <sys/time.h>
#include <sys/resource.h>

void
print_rusage(const char * where)
{
    struct rusage used;
    getrusage(RUSAGE_SELF, &used);

    printf("In %s:\n", where);
    printf("user cpu time: %ld(ms)\n",
            used.ru_utime.tv_sec * 1000 + used.ru_utime.tv_usec / 1000);
    printf("sys cpu time: %ld(ms)\n",
            used.ru_stime.tv_sec * 1000 + used.ru_stime.tv_usec / 1000);
    printf("soft page faults: %ld\n", used.ru_minflt);
    printf("\n");
}

int
main(int argc, char *argv[])
{
    print_rusage("child program");
    return 0;
}   

好久没写博客了,密码都快忘记了。写给自己的记忆。

Feedback

# re: Linux进程资源在fork和execve前后的变化  回复  更多评论   

2013-05-23 16:15 by lugesot
您好,能否简单解释下soft page faults?
child.c 运行本身不耗什么资源,所有,它还有说服力吗?谢谢

# re: Linux进程资源在fork和execve前后的变化  回复  更多评论   

2013-06-05 12:10 by Onway
@lugesot
soft page faults,我的理解是内存缺页次数,即需要从虚拟内存载入到实际内存的页数。
正是由于child.c本身不耗费什么资源,而其资源使用输出却很大,这说明了子进程在fork之后的资源使用会被execve继承。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理