使用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:
child.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;
}
#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

consume_rusage();
print_rusage("child process, before execve");
printf("excl child program now

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;
}
#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;
}
好久沒寫博客了,密碼都快忘記了。寫給自己的記憶。