алгоритмы планирования диска на языке Си - PullRequest
1 голос
/ 26 июля 2011

Я пытаюсь изучить реализацию Алгоритмов планирования дисков (SCAN и C-SCAN) на языке C, может кто-нибудь обратиться к хорошим источникам их реализации на языке C или посоветовать мне по программированию их на C?

Далее: - * Цель состоит в том, чтобы написать программу для оптимизации доступа к диску для чтения несмежного набора страниц с диска в память, для этого я выполняю планирование диска.

* Iхотел бы проинструктировать диск о последовательности чтения страниц

1 Ответ

2 голосов
/ 27 июля 2011

Логика для эффективного планирования запросов к диску должна рассматриваться в области самого диска!Оптимизация порядка чтения данных из секторов диска вряд ли будет переносимой или эффективной.

Однако, если у вас есть файл 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);
    }
}
...