Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка ПО ОСРВ заочники.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
8.72 Mб
Скачать

2.8. Буферизация и ядро

Буферизация - чрезвычайно полезная идея: читать данные в большие области памяти, ко­торые находятся в вашем пространстве. Затем процесс выбирает из этих областей более мелкие части - те, которые ему необходимы.

2.8.1. Если буферизация столь хороша, то почему ее не использует ядро?

Использует. При переходе в режим ядра и при возврате из него затрачивается время, но на передачу данных между твердым диском требуется несравненно больше времени. Для экономии времени ядро хранит копии блоков с диска в памяти. На рисунке 2.7 это проил­люстрировано.

Рисунок 2.7

Буферизация дисковых данных в ядр

Диск представляет собой объединение блоков данных аналогично тому, как файл utmp представляет собой объединение записей о входах в систему. Буферы ядра содержат копии некоторых блоков диска, точно так же, как наши utmp буферы содержат копии utmp записей.

Ядро копирует блоки с диска в буферы ядра. Когда процессу становятся нужны данные из определенного файла, то ядро копирует данные из буфера ядра в буфер процесса. Ядро не копирует непосредственно с диска в пользовательское пространство памяти.

Что происходит, если обнаруживается, что требуемой части данных нет в буфере ядра? Ядро приостанавливает процесс, который к нему обратился, и выставляет заявку на тре­буемый блок в свой "список покупок". Ядро затем находит другие процессы, которые готовы к выполнению некой работы и позволяет этим процессам развиваться.

Через какое-то время ядро переместит требуемые данные с диска в буфер ядра. Теперь ядро может копировать данные в буфер пользовательского пространства, после чего раз­будит спящий процесс.

Понимание принципов буферирования в ядре изменяет наше восприятие системных вызо­вов read и write. Системный вызов read копирует данные для процесса из буфера ядра, а сис­темный вызов write копирует данные из процесса в буфер ядра. Передача данных между буферами ядра и диском происходит не так, как при работе системных вызовов read и write.

Ядро может копировать данные на диск всякий раз, когда возникает в этом потребность. Возникает ситуация, аналогичная тому, как вы складываете почтовые конверты на столе в прихожей, чтобы потом их сразу переслать по почте. В нашем случае данные, которые обозначены процессом для записи, накапливаются в буферах ядра, ожидая момента, когда ядро скопирует их на диск. Если в системе внезапно произойдет отказ, который не позво­ляет ядру скопировать блоки из буфера на диск, то изменения в файле или добавления дан­ных в него произведены не будут.

Последствия буферизации в ядре:

• Более быстрый "дисковый " ввод/вывод. Оптимизированные записи на диск.

• Необходимость записи буферов на диск перед остановом системы.

2.9. Чтение файла и запись в файл

Наша первая программа who читала из файла. Наша вторая программа ср читала из одного файла и писала в другой файл. А есть ли программы, которые читают из файла и пишут в тот же файл?

2.9.1. Выход из системы: Что происходит?

Что происходит, когда вы выходите из системы? Прежде всего, в системе происходит из­менение записи в файле utmp. По полученному результату работы whol можно было заме­тить, что в файле utmp могут содержаться записи для неиспользуемых терминальных линий. Поэкспериментируйте и попытайтесь выполнить следующее:

1. Войдите в систему дважды, используя для этого два окна telnet к одной машине.

2. Используйте программу whol, которую мы написали, чтобы посмотреть содержимое файла utmp. Посмотрите, какие терминальные линии используются.

3. Выполните однократный выход из ваших сессий.

4. Запустите повторно на исполнение whol, чтобы посмотреть, что произошло с нашими двумя utmp записями.

Вы увидите, что одна из записей, которая содержит ваше входное имя, изменилась. Обра­тите внимание, что изменилось значение поля utjime. Какое будет новое значение времени I в этом поле? На некоторых системах поле с входным именем очищается. Будут ли еще какие-то изменения в записи? Что произойдет с именем удаленной машины?