SSDsim源码分析之get_request()

本文深入分析SSDsim的get_request()函数,该函数负责读取tracefile中的IO请求并挂载到队列。主要内容包括:检查文件结束符、读取IO参数、判断参数合理性、预留空间OP的概念及其作用,以及如何处理IO请求的插入和调度。文章还提及了find_nearest_event()函数在模拟过程中的关键作用。
摘要由CSDN通过智能技术生成

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的任何读写命令包括两个部分(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值