SSDsim源码分析之get_request()
本篇博文继续讲述SSDsim的核心模拟原理,这里介绍的get_request()函数主要负责逐条读取tracefile中的IO请求并且将其挂到ssd->request队列上,tracefile是作为IO请求数据的载体;根据固定格式的IO数据,如IO到达系统时间、IO的操作长度和目标扇区等,将这些IO数据进行相应的处理和保存记录工作。下面我们结合源码对其进行详细剖析:
get_request()函数
首先先看源码:
int get_requests(struct ssd_info *ssd)
{
char buffer[200]; //用到的缓冲区
unsigned int lsn=0;
int device, size, ope,large_lsn, i = 0,j=0;
struct request *request1; //IO请求项
int flag = 1;
long filepoint; //文件指针偏移量
__int64 time_t = 0;
__int64 nearest_event_time; //寻找所有子请求的最早到达的下个状态时间
#ifdef DEBUG
printf("enter get_requests, current time:%I64u\n",ssd->current_time);
#endif
/*
*feof()函数的原型是:int feof(FILE *stream);
*作用是检查流上的文件结束符;如果文件结束,则返回非0值,否则返回0,文件结束符只能被clearerr()清除。
*feof(fp)用于测试fp所指向的文件的当前状态是否为“文件结束”。如果是,函数则返回的值是1(真),否则为0(假)
*/
if(feof(ssd->tracefile))
return 0;
/*
*ftell()函数的原型是:long ftell(FILE *stream);
*作用是用于得到文件位置指针当前位置相对于文件首的偏移字节数。
*函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。
*/
filepoint = ftell(ssd->tracefile); //用于定位当前指针位置
fgets(buffer, 200, ssd->tracefile);
scanf(buffer,"%I64u %d %d %d %d",&time_t,&device,&lsn,&size,&ope);
if ((device<0)&&(lsn<0)&&(size<0)&&(ope<0))
{
return 100;
}
if (lsn<ssd->min_lsn)
ssd->min_lsn=lsn;
if (lsn>ssd->max_lsn)
ssd->max_lsn=lsn;
/******************************************************************************************************
*上层文件系统发送给SSD的任何读写命令包括两个部分(