Логика для эффективного планирования запросов к диску должна рассматриваться в области самого диска!Оптимизация порядка чтения данных из секторов диска вряд ли будет переносимой или эффективной.
Однако, если у вас есть файл 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);
}
}