Принудительная запись на диск грязных страниц отображения в память
Системный вызов msynco может быть использован процессом для сброса на диск грязных страниц, принадлежащих совместно используемому отображению в память. В качестве параметров системный вызов принимает начальный адрес интервала линейных адресов, длину этого интервала и набор флагов, имеющих следующие значения:
- ms sync — этот флаг просит системный вызов приостановить процесс до завершения операции ввода/вывода. Таким образом, вызывающий процесс может предполагать, что, когда системный вызов закончит работу, все страницы отображения в память уже будут записаны;
- ms async (дополнительный к ms sync) — этот флаг просит системный вызов вернуть управление немедленно, не приостанавливая вызвавший процесс;
- ms invalidate — этот флаг просит системный вызов отменить другие отображения в память того же файла (что на самом деле не реализовано, поскольку в Linux это было бы бесполезно).
Служебная процедура sys_msync вызывает функцию msync interval о для каждой области памяти, входящей в интервал линейных адресов. Эта функция выполняет следующие действия:
1. Если поле vm fiie дескриптора области памяти равно null, или флаг vm shared сброшен, функция возвращает 0 (область памяти не является совместно используемым отображением файла в память с правами на запись).
2. Вызывает функцию fiiemap synco, которая просматривает записи в Таблице Страниц, соответствующие интервалам линейных адресов для данной области памяти. Для каждой найденной страницы функция сбрасывает флаг Dirty в соответствующей записи в таблице страниц и вызывает функцию flush tib page для очистки соответствующих TLB-буферов. Затем она устанавливает флаг PG dirty в дескрипторе страницы, чтобы пометить страницу как грязную.
3. Если флаг ms async установлен, функция возвращает управление. То есть практический эффект от флага ms async заключается в установке флагов PG dirty для страниц в области памяти; системный вызов не запускает пересылку данных.
4. Если функция дошла до этого шага, значит, флаг ms sync установлен. Следовательно, функция должна записать на диск страницы области памяти и
приостановить текущий процесс до окончания пересылки данных. Чтобы сделать это, она получает семафор i sem индексного дескриптора файла.
5. Вызывает функцию f iiemap fdatawrite , которая принимает адрес объекта address space данного файла. Вызванная функция настраивает дескриптор writeback controi, задав ему режим синхронизации wb sync all, и проверяет, есть ли у адресного пространства встроенный метод writepages. Если метод есть, функция вызывает функцию, реализующую метод, и возвращает управление. В противном случае она вызывает функцию mpage writepages
6. Проверяет, определен ли метод fsync для файлового объекта. Если определен, выполняет его. У обычных файлов этот метод, как правило, ограничивается сбросом на диск индексного дескриптора файла. Однако у файлов блОЧНЫХ устройств ЭТОТ Метод ВЫЗЫВает фуНКЦИЮ sync_blockdev(), которая запускает пересылку данных.
7. Вызывает функцию filemap fdatawait о . что базисное дерево в кэше страниц идентифицирует все страницы, записываемые на диск в данный момент, при помощи тега pagecache tag writeback. Функция быстро сканирует участок индексного дерева, покрывающий заданный интервал линейных адресов, с целью найти страницы, у которых установлен флаг PG writeback. Для каждой такой страницы функция вызывает функцию wait on page bit о и ждет, пока флаг PG writeback не будет сброшен, т. е. пока не завершится пересылка данных этой страницы.
8. Освобождает семафор i sem и завершает работу.
Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | Следующая страница