本次作業主要為練習 argument passing 和 timing control
假設我們有隨機份工作,而每份工作的執行時間不得而知,只知道會少於100ms
作業目標希望我們的程式可以接受參數,表示要執行的工作數量,且從第一份工作開始執行算起,每份工作都在100ms的區間間隔內執行,並越接近那100ms的預期行時間越佳
主程式,作業可以以此為基礎做任意修改
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <time.h> #include <sys/time.h> extern void random_length_task(); int main() { int n = 10; srand(time(0) ^ getpid()); while(n-- > 0) { random_length_task(); } return 0; }
隨機產生工作所需時間,作業中這份code不能變動
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/time.h> void random_length_task() { int i; int s = 20 + rand() % 31; int n = 1 + rand() % 3; struct timeval tv; gettimeofday(&tv, NULL); s = s - (s % n); printf("%ld.%06ld working for %d ms\n", tv.tv_sec, tv.tv_usec, s); for(i = 0; i < n; i++) { usleep(s / n * 1000); } return; }
用來給我們評估預測的工具程式,評估出來avg和var越小越好
#!/usr/bin/awk -f BEGIN { init = 0; count = 0; sum = 0; sum2 = 0; } /^[0-9]+\.[0-9]+/ { if(init != 0) { count = count + 1; target = init + count * 0.1; delta = $1 - target; if(delta < 0) delta = -delta; sum = sum + delta; sum2 = sum2 + delta * delta; } else { init = $1; } } END { avg = sum / count; var = sum2 / count - avg * avg; print count " samples: average = " avg "; variance = " var; }