Буферизація і кешування

Під буфером зазвичай розуміється деяка область пам'яті для запам'ятовування інформації при обміні даних між двома пристроями, двома процесами або процесом і пристроєм. Обмін інформацією між двома процесами відноситься до області кооперації процесів, і ми детально розглянули його організацію у відповідній лекції. Тут нас цікавитиме використання буферів у тому випадку, коли одним з учасників обміну є зовнішній пристрій. Існує три причини, що приводять до використання буферів в базовій підсистемі вводу-виводу.

Перша причина буферизації – це різні швидкості прийому і передачі інформації, якими володіють учасники обміну. Розглянемо, наприклад, випадок передачі потоку даних від клавіатури до модему. Швидкість, з якою поставляє інформацію клавіатура, визначається швидкістю набору тексту людиною і звичайна істотно менше швидкості передачі даних модемом. Для того, щоб не позичати модем на весь час набору тексту, роблячи його недоступним для інших процесів і пристроїв, доцільно накопичувати введену інформацію в буфері або декількох буферах достатнього розміру і посилати її через модем після заповнення буферів.

Друга причина буферизації – це різні об'єми даних, які можуть бути прийняті або отримані учасниками обміну одноразово. Візьмемо інший приклад. Хай інформація поставляється модемом і записується на жорсткий диск. Окрім володіння різними швидкостями здійснення операцій, модемом і жорстким диском є пристрої різного типу. Модем є символьним пристроєм і видає дані байт за байтом, тоді як диск є блоковим пристроєм і для проведення операції запису для нього потрібно накопичити необхідний блок даних в буфері. Тут також можна застосовувати більш за один буфер. Після заповнення першого буфера модем починає заповнювати другою, одночасно із записом першого на жорсткий диск. Оскільки швидкість роботи жорсткого диска в тисячі разів більша, ніж швидкість роботи модему, до моменту заповнення другого буфера операція запису першого буде завершена, і модем знову зможе заповнювати перший буфер одночасно із записом другого на диск.

Третя причина буферизації пов'язана з необхідністю копіювання інформації із застосувань, що здійснюють уведення-виведення, в буфер ядра операційної системи і назад. Допустимо, що деякий призначений для користувача процес побажав вивести інформацію зі свого адресного простору на зовнішній пристрій. Для цього він повинен виконати системний виклик з узагальненою назвою write, передавши як параметри адресу області пам'яті, де розташовані дані, і їх об'єм. Якщо зовнішній пристрій тимчасово зайнятий, то можлива ситуація, коли до моменту його звільнення вміст потрібної області виявиться зіпсованим (наприклад, при використанні асинхронної форми системного виклику). Щоб уникнути виникнення подібних ситуацій, найпростіше на початку роботи системного виклику скопіювати необхідні дані в буфер ядра операційної системи, що постійно знаходиться в оперативній пам'яті, і виводити їх на пристрій з цього буфера.

Під словом кеш (cash – "готівка"), етимологію якого ми тут не розглядатимемо, зазвичай розуміють область швидкої пам'яті, що містить копію даних, розташованих де-небудь в повільнішій пам'яті, призначену для прискорення роботи обчислювальної системи. Ми з вами стикалися з цим поняттям при розгляді ієрархії пам'яті. У базовій підсистемі вводу-виводу не слід змішувати два поняття, буферизацію і кешування, хоча часто для виконання цих функцій відводиться одна і та ж область пам'яті. Буфер часто містить єдиний набір даних, що існує в системі, тоді як кеш за визначенням містить копію даних, що існують де-небудь ще. Наприклад, буфер, використовуваний базовою підсистемою для копіювання даних з призначеного для користувача простору процесу при виводі на диск, може у свою чергу застосовуватися як кеш для цих даних, якщо операції модифікації і повторного читання даного блоку виконуються достатньо часто.

Функції буферизації і кешування не обов'язково мають бути локалізовані в базовій підсистемі вводу-виводу. Вони можуть бути частково реалізовані в драйверах і навіть в контроллерах пристроїв, скритно по відношенню до базової підсистеми.