Яка різниця між буферними та кешованими стовпцями у виході / proc / meminfo?


Відповідь 1:

Операції вводу / виводу часто мають високі затримки; час між початком процесу вводу / виводу і його завершенням може становити мільйони циклів тактових процесорів. Більшість цієї затримки пов'язана з самим обладнанням; наприклад, інформація не може бути прочитана з жорсткого диска або записана доти, доки обертання диска не приведе цільові сектори безпосередньо під голову читання / запису. (На момент написання цього запису 7200 об / хв жорсткі диски є нормою, тому цей процес може зайняти приблизно 8 мілісекунд для завершення.) Коли пристрій вводу / виводу є мережевим інтерфейсом, затримка зазвичай більша.

Це полегшується, якщо один або кілька буферів вводу та виводу пов'язані з кожним пристроєм. Навіть якщо програма хоче зчитувати лише один блок даних з пристрою, драйвер може отримати цей блок плюс кілька блоків відразу після нього на диску, кешуючи їх у пам'яті, оскільки програми часто отримують доступ до диска послідовно, тобто Наступний блок програма запитає, ймовірно, наступний фізичний блок на диску. Коли це насправді так, драйвер замість того, щоб виконувати ще одне фізичне читання на диску, може потім просто повернути цей блок (який зберігається в пам'яті) і, отже, різко зменшити затримку. Коли запит на диск запитується, драйвер може просто кешувати дані в пам'яті, поки не накопичиться достатньо блоків даних, і в цей момент він записує їх усі відразу; це називається промиванням вихідного буфера або синхронізацією. Зазвичай драйвер надає засоби для запиту негайного видалення даних, а не кешування. Це потрібно зробити, наприклад, перед вилученням пристрою із системи (якщо це трапляється на знімних носіях, таких як оптичний диск), або після вимкнення системи.

У багатозадачній операційній системі апаратні пристрої керуються ядром, і програми користувальницького простору можуть не мати прямого доступу до них. З цієї причини виконання вводу / виводу вимагає виконання системних дзвінків, які з різних причин вводять накладні витрати. Цей накладний покрив, як правило, відбувається в порядку мікросекунд, а не мілісекунд, тому використання буферизації тут не має вирішального значення для програм, які виконують відносно невелику кількість вводу / виводу, але робить велику різницю для додатків, які пов'язані вводу / виводу (тобто, вони витрачають більшу частину свого часу на очікування завершення вводу-виводу, а не на виконання обчислень, які би прискорилися, якби процесор був швидшим).

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