Тег «устройство ОС»

Unix: тени прошлого

Друзья, не обижайтесь, но у меня сейчас совершенно нет времени писать что-то вдумчивое и основательное. Поэтому решил разбавить тишину ссылками на статьи с LWN:

Вкратце о содержимом. В ранние годы Unix были приняты некоторые архитектурные решения, которые определили то, что сейчас принято называть «Unix Way». Над этими решениями думали не самые глупые люди, но предусмотреть, что будет через 40 лет, никто не в силах. Поэтому в свете современных требований некоторые ключевые решения и паттерны до сих пор остались красивыми и согласованными, а некоторые породили проблемы разной величины. В статьях как раз про второй тип: какие выявились проблемы, как их можно решать и как они решаются сейчас.

Лично меня статьи зацепили тем, что многие из описанных проблем я заметил и сам, хотя и не подвергал их такому глубокому анализу.

Как часто бывает на LWN, комменты не менее ценны, чем сами статьи.

Кэширование и буферизация

У меня с институтских времен осталась незалеченная психологическая травма. Преподаватель по курсу «Проектирование операционных систем«, человек во всех отношениях уважаемый и компетентный, однажды высказал утверждение: «Кэширование и буферизация — это одно и то же, только кэширование относится к физическому хранению данных, а буферизация — к логическому«. Интуиция моя возопила, я чувствовал, что где-то тут подвох, но не смог привести убедительные аргументы против. В том числе и на экзамене (за что и получил единственную четверку в диплом). Попробую реабилитироваться и прояснить ситуацию. Все что я написал ниже — мое личное мнение. Но это не значит, что я все это высосал из пальца, некоторую работу по изучению вопроса я все же провел. Итак.

Кэширование — это способ ускорения доступа (чтения и записи) к медленной памяти за счет использования более скоростной (обычно существенно меньшего объема). Используемая часть быстрой памяти носит название кэша. Фрагменты содержимого медленной памяти, к которым наиболее часто происходит обращение, сохраняются в кэше. При чтении или записи этих фрагментов нет необходимости обращаться к медленной памяти — можно получить нужные данные из кэша или, напротив, записать в кэш. В последнем случае потребуется дальнейшая синхронизация кэша с медленной памятью.

Примеры использования кэширования:

  • кэширование отображения виртуальных адресов в физические; медленная память — таблицы преобразования в оперативной памяти, быстрая — кэш TLB;
  • кэширование обмена данными с жестким диском; медленная память — диск, быстрая — оперативная память;
  • кэширование веб-страниц (кэш браузера); медленная память — соединение с Интернетом, быстрая — жесткий диск.

Как можно видеть, один и тот же вид памяти может в разных случаях выступать и в роли кэша, и в роли медленной памяти.

Буферизация — это такая организация обмена данными, при которой используется промежуточное временное хранилище (буфер), в котором накапливаются данные, если по какой-то причине прямой обмен нежелателен или невозможен. Причиной, по которой следует избегать прямого обмена, может являться, например:

  • временная неготовность устройства; при прожиге болванок наверняка все видели волшебный Progress Bar «Уровень буфера», это как раз то самое;
  • невозможность принять поток данных с требуемой скоростью; например, для этих целей существует исходящая очередь сетевых пакетов — приложения могут клепать данные быстрее, чем сетевая карта успеет их передавать;
  • гранулярность обмена; в этом случае буферизация служит средством группировки данных; яркий пример — жесткий диск, обмен с которым возможен только блоками размером с сектор (512 байт обычно), а лучше даже целыми дорожками (много секторов); это также пример того, как одна и та же структура данных может использоваться и для кэширования, и для буферизации (см. выше пример про кэширование жесткого диска).

Буферизация бывает прозрачной и непрозрачной. Прозрачная — когда обменивающиеся данными стороны в курсе, что буфер существует (clipboard, message queue). Непрозрачная буферизация — когда буферизация незаметна (сокеты).

Резюме. Основная задача кэширования — ускорить, а лучше вообще устранить чтение из медленной памяти. Основная задача буферизации — повысить эффективность записи.

Контрольный вопрос. Что такое буферный кэш?

УжасноПлохоНормальноХорошоОтлично (6 голосов, средний: 4,67 из 5)
Loading ... Loading ...