解决方案:
思考题一:
我的思路是,如果说两次调度是没必要的,那为什么自然不必要进行把主线程的控制权交换以及重新获取的操作。那我们就不做此操作了。关键在于,“没必要”的理解。
我认为,有以下两种情况是没必要的:
- 调度太过频繁,使得大量的时间花在了切换上,这个时候及时调度的序列即是合理也会浪费大量时间。
- 两次调度结果一样。
算法改进方案
- 增大两次调度的时间片间隔
- 预测下一次调度的结果,如果一样则不进行切换。
修改代码:
for(i=0;i<demo_time;i+=10) //每十个时间片调度一次
{
int j;
Tmp=select_proc(alg);
if(curr_proc==Tmp) //预测调度结构
{
if((curr_proc=select_proc(alg))!=-1)
{
pthread_mutex_unlock(&proc_wait[curr_proc]);
pthread_mutex_lock(&main_wait);
}
else
{
pthread_mutex_unlock(&idle_wait);
pthread_mutex_lock(&main_wait);
}
}
for(j=0;j<task_num;j++)
{
if(--tasks[j].ti_left==0)
{
tasks[j].ti_left=tasks[j].ti;
tasks[j].ci_left=tasks[j].ci;
pthread_create(&tasks[j].th,NULL,(void*)proc,&tasks[j].arg);
tasks[j].flag=2;
}
}
}
思考题二:
增加计数器即可
设置全局变量
Int timeOfEDF=0,timeOfRMF=0;
把计数器加入线程切换的位置加入代码:
Switch(alg)
{
Case 1: timeOfEDF++;
Case 2: timeOfRMF++;
}
即可