C语言中的磁盘调度算法

时间:2011-07-25 21:58:18

标签: c algorithm scheduling disk

我正在尝试用C语言学习磁盘调度算法(SCAN和C-SCAN)的实现,有人可以参考C语言中这些实现的良好来源或建议我在C上编程吗?< / p>

进一步: - *目的是编写一个程序来优化磁盘访问,以便将磁盘上不连续的页面集读取到内存中,为此,我正在执行磁盘调度。

*我想在页面的读取序列上指示磁盘

1 个答案:

答案 0 :(得分:2)

应该在磁盘本身的域中考虑以有效的方式调度磁盘请求的逻辑!优化从磁盘扇区读取数据的顺序不太可能是便携式或高效的。

但是,如果您的文件为npages * PAGE_SIZE,则可以在为磁盘自己的内部读取提供服务时尝试提高应用程序性能。给出:

#define PAGE_SIZE ...
#define MAX_PAGE_READ ...

struct read_req {
    unsigned int page;
    /* any other book-keeping required */
};

您可以通过page在内部对请求进行排序(并可选择合并邻居页面):

/* qsort-comparer for two read_req structs */
int cmp_req(const void *a, const void *b)
{
    unsigned int pageA = ((struct read_req*)a)->page,
                 pageB = ((struct read_req*)b)->page;
    return pageA == pageB ? 0 : pageA > pageB ? 1 : -1;
}

int service_reads(struct read_req *reqs, size_t nreqs)
{
    size_t ii = 0;

    /* sort read requests in ascending order */
    qsort(reqs, nreqs, sizeof(reqs[0]), cmp_req);

    while (ii < nreqs)
    {
        unsigned int start = reqs[ii].page;
        size_t size = 1;

        while (++ii < nreqs)
        {
            if (reqs[ii].page != (start + size)) break;

            /* expand our read to include the next page,
             * and break if we've read too much
             */
            if (++size == MAX_PAGE_READ) break;
        }

        your_read_logic(start, size);
    }
}