#include #include #include #include #include #include #include #include #define MAX_INTERVAL 5000 #define MIN_INTERVAL 500 #define SLEEP_TIME 0 #define IO_SIZE 1024 #define MTOUS(x) ((x)*1000) #define msleep(x) usleep(MTOUS(x)); volatile enum {CPU_STATE, IO_STATE, SLEEP_STATE} state; void sig_handler(int signum) { state++; if(state > 2) state = 0; } int do_cpuhog(int msec) { unsigned long long v1,v2,v3; int i; v1 = 42; v2 = v3 = -1; while(state == CPU_STATE) { i++; v1 += i; v2 = v1*i + v3; v3 = v1 ^ v2; } if (msec) msleep(msec); return 0; } int do_syshog(int size, int msec) { static void *buffer = NULL; int fd; if (!buffer) buffer = realloc(buffer, size); fd = open("/dev/zero", O_RDWR); if (fd>=0) { while(state == IO_STATE) { read(fd, buffer, size); write(fd, buffer, size); } close(fd); } if (msec) msleep(msec); return 0; } int main(int argc, char **argv) { struct sigaction action; struct itimerval period; action.sa_handler = &sig_handler; action.sa_flags = 0; if(sigaction(SIGALRM, &action, NULL)) perror("siga"); for(;;) { int interval = random() % MAX_INTERVAL; if(interval < MIN_INTERVAL) interval = MIN_INTERVAL; period.it_value.tv_sec = period.it_interval.tv_sec = interval / 1000; period.it_value.tv_usec = period.it_interval.tv_usec = interval * 1000; if(setitimer(ITIMER_REAL, &period, NULL)) perror("seti"); switch(state) { case CPU_STATE: do_cpuhog(SLEEP_TIME); break; case IO_STATE: do_syshog(IO_SIZE, SLEEP_TIME); break; case SLEEP_STATE: pause(); break; } } return 0; }