Скажите, что два разных процесса открывают два разных файла. Обычно у каждого из них был бы свой собственный инод, и у каждого инода был бы свой struct address_space
(это парень, который помнит, где страницы кэша страниц находятся в памяти).
Но, скажем, я знал , что эти файлы изначально были идентичны. Я хочу придумать способ интеллектуального разделения кэширования в максимально возможной степени.
Я рассматривал следующие стратегии:
Добавить новое поле в структуру struct address_space
: указатель на «родителя». Затем, всякий раз, когда я ищу существующую страницу, я также смотрю в родительской (если она существует). Всякий раз, когда я пишу на страницу, мне, таким образом, нужно делать сбой и C-O-W страницу в главном address_space. Оба файла будут иметь общего родителя.
Сгруппируйте каждый связанный набор struct address_space
в связанный список. Всякий раз, когда я ищу существующую страницу, ищите весь связанный список. В этом случае, однако, было бы запрещено «находить» грязную страницу в адресном пространстве друга. Другими словами, если страница испачкается, она больше не может использоваться в качестве резервной копии. В этом случае, если кто-нибудь когда-либо записывает данные в файл, мне нужно будет отсоединить адресные пространства. Мне также нужно было бы какое-то поведение C-O-W, чтобы поддержать это.
Может кто-нибудь сказать мне:
- Является ли одна или обе эти идеи обоснованными?
- На что конкретно мне следует обращать внимание?
Для справки, я делаю хакерское ядро, чтобы сэкономить память, потому что в моей системе открыто несколько идентичных файлов (но не один и тот же inode = не разделяет pagecache).
РЕДАКТИРОВАТЬ: 3-я идея:
- Храните связанный список «связанного» кэша страниц
address_space
, а затем каждый раз, когда мы читаем с диска, обновляем каждую открытую структуру address_space
. Открытие нового связанного файла может привести к тому, что произойдет копирование большой таблицы страниц, за исключением пропуска любых грязных страниц.