Да! Можно даже пойти дальше и взять концепцию ОС-фантом им. DZ, но наоборот. Не "у нас всё будет в памяти и не будет файловой системы...", а "у нас будут только файлы и ничего кроме файлов". И сделать функцию mmap. Ограниченную банкой или двумя (по размеру непрерывного окна, в которое виден кусок файла). Надо данные: открыл файл, отмапил (включилась нужная банка, если нужно подкачали данные с флоповода), поработал, сделал unmap... когда-то потом сделал close или fsync (данные записались на диск, если они не записались ещё раньше, когда страниц в системе не хватало и началось выкидывание не записанного на флоповод). Так даже лучше, чем предлагаемое ранее. В том смысле, что это не отменяет, то что я ранее предлагал, а просто добавляет сверху всего ещё слой файлов. И не нужно тогда разделять -- мол это у нас оперативная память, а это дисковый кеш -- всё едино.
Т.е. вот пример, например, работы программы, например:
- Code: Select all
1. char name[] = "XXXXXXX";
int fd=mkstemp(name); // создаём файл для временных данных
unlink(name); // сразу удаляем файл (только для временных файлов)
// чтоб при (аварийном) завершении программы не засирать /tmp
2. if (pwrite(fd, ..., 10000) <= 0) { // резервируем 10000 памяти
perror(...); // нет места на диске и др. ошибки...
exit(1);
}
while (1) { // цикл работы программы
3. int *addr=mmap(preferred_addr, fd, offset, size); // отображаем кусок файла в память (включается банка)
if (addr==NULL) {
perror(...); // какая-то ошибка: либо кончилось адресное пространство (слишком много mmap и не unmap),
abort(); // либо ошибка чтения с диска и т.п.
}
4. *addr=*addr++.... // поработали с отображаемой памятью
5. munmap(addr); // банка выключилась, память больше не доступна, но данные ещё в ОЗУ
}
6. fsync(fd); // принудительно сохранили данные если нужно (если файл не временный, а постоянный).
7. close(fd); // данные записались на диск и будут максимально быстро
// (когда потребуется память) удалены из памяти
PS: Офигенно удобно, что временные файлы можно в рамдиске создавать. Или своп на винт, если рамдиска не хватает.
PPS: Я бы забыл про рамдиск. Вся память -- дисковый кеш. Остальное на винт (SD-карточку). Не хватает -- пошёл в своп (в том смысле, что как такового своп-файла не будет, просто файлы действительно запишутся в виде файлов на карточку).
PPPS: Только работать оно тогда должно с FAT с большим диском. На TR-DOS'ном диске можно не высвопишь, да и проблемы с записью в первый файл, после записи второго...