首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言中的磁盘调度算法

C语言中的磁盘调度算法
EN

Stack Overflow用户
提问于 2011-07-26 05:58:18
回答 1查看 4.9K关注 0票数 1

我正在尝试学习磁盘调度算法(SCAN和C-SCAN)在C语言中的实现,有没有人可以参考一下这些算法在C语言中实现的很好的源码,或者建议我在C语言上编程?

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

*我想指示磁盘上的页的读取顺序

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-27 04:25:11

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

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

代码语言:javascript
复制
#define PAGE_SIZE ...
#define MAX_PAGE_READ ...

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

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

代码语言:javascript
复制
/* 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);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6822871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档