資訊人筆記

Work hard, Have fun, Make history!

使用者工具

網站工具


course:nctu-高等unix程式設計:hw1

高等UNIX程式設計:作業一

0x00 前言


0x01 作業描述

本次作業主要為練習 argument passingtiming control

假設我們有隨機份工作,而每份工作的執行時間不得而知,只知道會少於100ms

作業目標希望我們的程式可以接受參數,表示要執行的工作數量,且從第一份工作開始執行算起,每份工作都在100ms的區間間隔內執行,並越接近那100ms的預期行時間越佳


0x02 範例程式

主程式,作業可以以此為基礎做任意修改

main.c
#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不能變動

job.c
#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越小越好

eval.awk
#!/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;
}

0x03 參考資料

  • 根據事後詢問老師,老師表示會使用到token bucket演算法,只是把時間間隔當成token來用,這部分還要研究
course/nctu-高等unix程式設計/hw1.txt · 上一次變更: 127.0.0.1