Выделение блоков данных
Когда ядру нужно найти блок с данными обычного файла Ext2, оно вызывает функцию ext2_get_biock . Если такого блока нет, функция автоматически выделяет его файлу. Вспомним, что эту функцию можно вызывать каждый раз, когда ядро выполняет операцию чтения или записи в отношении обычного файла Ext2 (см. разд. "Чтение из файла" и "Запись в файл" главы 16). Очевидно, что эта функция вызывается, только если требуемый блок отсутствует в кэше страниц.
Функция ext2_get_biock работает со структурами данных, описанными ранее, в разд. "Адресация блоков данных", и, если необходимо, вызывает функцию ext2_aiioc_biock для поиска свободного блока в разделе Ext2. Когда это нужно, функция также выделяет блоки, применяемые для косвенной адресации
Для минимизации фрагментации файла файловая система Ext2 пытается получить для файла новый блок по соседству с последним блоком, выделенным файлу. Если это ей не удается, файловая система ищет новый блок в группе блоков, содержащей индексный дескриптор файла. В самом крайнем случае свободный блок берется из какой-нибудь другой группы.
Файловая система Ext2 применяет предварительное выделение блоков. Файл получает не только запрошенный блок, а группу, содержащую до восьми смежных блоков. Поле i preaiioc count структуры ext2_inode_info содержит количество блоков, заранее выделенных файлу и все еще неиспользуемых, а поле i preaiioc biock хранит логический номер предварительно выделенного блока, который нужно использовать следующим. Все неиспользованные предварительно выделенные блоки освобождаются, когда файл закрывается, когда он усекается, или когда операция записи идет не подряд за операцией записи, вызвавшей предварительное выделение блоков.
Функция ext2_aiioc_biock принимает в качестве параметров указатель на объект индексный дескриптор” , цель и адрес переменной, которая будет содержать код ошибки. Цель — это логический номер блока, соответствующий предпочтительному расположению нового блока. Функция ext2_get_ block о задает параметр цель” в соответствии со следующими эвристическими правилами:
- Если блок, выделяемый в данный момент, и предыдущий выделенный блок имеют последовательные номера в файле, целью является логический номер предыдущего блока плюс 1. Есть смысл в том, чтобы блоки, видимые программой как последовательные, были смежными на диске.
- Если первое правило неприменимо, и хотя бы один блок уже был выделен файлу, целью является один из логических номеров этих блоков. Точнее
говоря, это логический номер уже выделенного блока, который предшествует выделяемому блоку в файле.
- Если первые два правила неприменимы, целью является логический номер первого блока (необязательно свободного) в группе блоков, содержащей индексный дескриптор файла.
Функция ext2_aiioc_biock проверяет, ссылается ли цель на один из предварительно выделенных блоков файла. Если это так, функция выделяет этот блок и возвращает его логический номер. В противном случае она отбрасывает все оставшиеся предварительно выделенные блоки и вызывает функцию
ext2_new_block.
Эта последняя функция ищет свободный блок в разделе Ext2, применяя следующую стратегию:
- Если предпочтительный блок, переданный функции ext2_aiioc_biock (то есть блок, являющийся целью) свободен, функция выделяет его.
- Если цель занята, функция проверяет, свободен ли один из блоков, следующих за предпочтительным.
- Если поблизости от предпочтительного блока свободных блоков не оказалось, функция рассматривает все группы блоков, начиная с той, которая содержит цель. Для каждой группы функция выполняет следующие действия:
• ищет группу из хотя бы восьми смежных свободных блоков;
• если такой группы не окажется, ищет один свободный блок.
Поиск прекращается, как только будет найден свободный блок. Перед завершением работы функция ext2_new_biock пытается предварительно выделить до восьми свободных блоков, смежных с только что найденным блоком, и записывает в поля i preaiioc biock и i preaiioc count индексного деск- риптора на диске местоположение блока и количество блоков.
Предыдущая страница | 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 | Следующая страница