SSDsim simulation function:process()

struct ssd_info *process(struct ssd_info *ssd):

        1.这个函数的主要功能是主控读子请求和写子请求的状态变化处理。首先通过一个for循环来循环判断所有channel通道中是否有读子请求或者写子请求,没有子请求则令标识位flag=1,否则flag=0。若flag=1,说明此时没有子请求,则若gc_request>0的话那就紧接着调用gc()函数进行相应的GC操作。上述情况判断完(或者说是判断完,因为可能不满足条件没有进入具体执行路径),先处理处于SR_R_C_A_TRANSFER(命令地址传输阶段),或者SR_COMPLETE,或者下一状态是SR_COMPLETE并且下一状态预计时间小于当前状态时间的读子请求。

        2.再接着对所有channel进行一个for循环,如果该channel是IDLE的,再判断ssd->gc_request是否大于0,ssd->channel_head[i].gc_command是否为NULL,满足条件即可调用gc()函数,若gc成功则将该channel的flag_gc置1表示此channel正忙然后continue结束此次循环进入下一次循环(即判断下一个channel)。

        3.若channel是处于IDLE状态,但是不满足GC要求,即没有进行GC操作,则按顺序依次调用services_2_r_wait()函数处理等待状态的读子请求,再调用services_2_r_data_trans()函数处理数据传输状态的读子请求,最后再调用services_2_write()函数处理写子请求。

struct ssd_info *process(struct ssd_info *ssd)
{	/********************************************************************************************************************************************************************
	*flag_die表示是否因为die的busy,阻塞了时间前进,-1表示没有,非-1表示有阻塞,flag_die的值表示die号,old ppn记录在copyback之前的物理页号,用于判断copyback是否遵守了奇偶地址的限制;
	*two_plane_bit[8],two_plane_place[8]数组成员表示同一个channel上每个die的请求分配情况;chg_cur_time_flag作为是否需要调整当前时间的标志位,当因为channel处于busy导致请求阻塞时,需要调整当前时间;
	*初始认为需要调整,置为1,当任何一个channel处理了传送命令或者数据时,这个值置为0,表示不需要调整;
	*********************************************************************************************************************************************************************/
	unsigned int i,chan,random_num;     
	unsigned int flag=0,chg_cur_time_flag=1,flag_gc=0;
	int64_t time;
	struct sub_request *sub;
#ifdef DEBUG
	printf("enter process,  current time:%lld\n",ssd->current_time);
#endif
	/*********************************************************
	*判断是否有读写子请求,如果有那么flag令为0,没有flag就为1
	*当flag为1时,若ssd中有gc操作这时就可以执行gc操作
	**********************************************************/
	for(i=0;i<ssd->parameter->channel_number;i++){
		if((ssd->channel_head[i].subs_r_head==NULL)&&(ssd->channel_head[i].subs_w_head==NULL)&&(ssd->subs_w_head==NULL))
			flag=1;  //表示整个ssd没有读请求和写请求
		else{
			flag=0;  //表示ssd上有读或者写请求
			break;
		}
	}
	if(flag==1){  //此时没有读请求和写请求,有gc操作请求的话可以执行gc操作
		ssd->flag=1;  //表示此时SSD处于空闲状态,可以进行GC操作
		if(ssd->gc_request>0)  /*SSD中有gc操作的请求*/
			gc(ssd,0,1);    /*这个gc要求所有channel都必须遍历到*/
		return ssd;
	}else
		ssd->flag=0;
	time = ssd->current_time;
	services_2_r_cmd_trans_and_complete(ssd); /*专门为读子请求服务的函数,处理当前状态是SR_R_C_A_TRANSFER(命令地址传输状态)或者当前状态是SR_COMPLETE,或者下一状态是SR_COMPLETE并且下一状态预计时间小于当前状态时间*/
	random_num=ssd->program_count%ssd->parameter->channel_number;  /*产生一个随机数,保证每次从不同的channel开始查询*/ //random_num等于0或者1
	for(chan=0;chan<ssd->parameter->channel_number;chan++){  /*循环处理所有channel上的读写子请求,发读请求命令,传读写数据,都需要占用总线*/
		i=(random_num+chan)%ssd->parameter->channel_number;  //表示通道数,每次从不同通道开始工作
		flag=0;  //flag表示通道是否被占用(是否忙状态),0表示未被占用,1表示被占用(处于忙状态)
		flag_gc=0;  /*每次进入channel时,将gc的标志位置为0,默认认为没有进行gc操作*/
		if((ssd->channel_head[i].current_state==CHANNEL_IDLE)||(ssd->channel_head[i].next_state==CHANNEL_IDLE&&ssd->channel_head[i].next_state_predict_time<=ssd->current_time)){
			if(ssd->gc_request>0){   /*有gc操作,需要进行一定的判断*/
				if(ssd->channel_head[i].gc_command!=NULL)
					flag_gc=gc(ssd,i,0);  /*gc函数返回一个值,表示是否执行了gc操作,如果执行了gc操作(gc成功执行返回1,没有执行成功(即要先服务读写请求)返回0),这个channel在这个时刻不能服务其他的请求*/
				if(flag_gc==1)  /*执行过gc操作,需要跳出此次循环*/ //即此通道正忙,可以执行下一个通道的操作
					continue;
			}
			sub=ssd->channel_head[i].subs_r_head;     /*先处理读请求*/
			services_2_r_wait(ssd,i,&flag,&chg_cur_time_flag);    /*处理处于等待状态的读子请求(这里涉及到高级命令)*/
			if((flag==0)&&(ssd->channel_head[i].subs_r_head!=NULL))  /*if there are no new read request and data is ready in some dies, send these data to controller and response this request*/
				services_2_r_data_trans(ssd,i,&flag,&chg_cur_time_flag);  //处理处于数据传输状态的读子请求
			if(flag==0)  /*if there are no read request to take channel, we can serve write requests(没有读请求占用通道,此时所有读请求都被服务完成,可以开始处理写请求了)*/
				services_2_write(ssd,i,&flag,&chg_cur_time_flag);  //i表示通道channel,flag表示通道是否被占用(忙状态),0表示未被占用
		}
	}
	return ssd;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值