(Borland C++Builder 6) [Статья 4] (FIFO)(LIFO)(BUF)(Буфер)(Память)(C/C++)

| 05.07.2015

(Borland C++Builder 6) [Статья 4] (FIFO)(LIFO)(BUF)(Буфер)(Память)(C/C++)

fifo_Lifo

Общее
Параллельный или произвольный доступ это именно то, что было везде на сайте, когда мы что то хранили в памяти или что-то от туда читали. Мы могли зарезервировать любые объемы памяти и как угодно читать её и писать туда. Лучше для примера взять массив BUF[100] мы можем писать операции с элементами этого массива в любом порядке (писать в BUF[n] или читать от туда).  Это кажется предельно удобным и ничего лучше уже не придумать)))).
Но что если умышленно ограничим себя и придумаем себе проблемы? Есть ли в этом смысл?
Давайте обозначим ряд условий составляющих ограничения.
1) Мы не можем писать в произвольное место памяти
2) Пишем данные последовательно по “одному адресу” и все, ранее записанное, сдвигается
3) Читаем данные последовательно по “одному адресу” и все, ранее записанное, сдвигается
** Туманные правила но суть в последовательном доступе !!!
С памятью с такими варварскими правилами мы и будем разбираться далее.

Суть
Решая различные задачи удобно использовать различные инструменты. Допустим нам нужно где то хранить данные но не хочется заморачиваться с адресами куда класть данные. Давайте попробуем сравнить произвольный и последовательный доступ со складом.
1) Произвольный доступ:
На склад приезжают мандарины (данные) куда их класть, на какие полки (ячейки памяти)? Нам необходимо это определять и записывать куда положили мандарины которые приехали таково-то числа. Получается чтобы потом взять именно эти мандарины необходимо вести учет. Снова приезжают мандарины нам надо смотреть в этот листик не положить данные на те же полки.
Вывод: Можешь взять мандарины с любой полки но может получиться большой листик
2) Последовательный доступ:
На склад приезжают мандарины (данные) куда их класть, на какие полки (ячейки памяти)? Мы имеем хитрый склад который представляет собой некий конвеер. То есть все коробки с мандаринами лежат друг за другом. Новые коробки мы добавляем в конец и крутим рычаг передвигая все коробки вперед. Таким образом мы как-бы кладем коробки всегда в одно место но в разные ячейки из за прокрутки. А что бы взять коробку и не нарушить данную модель у нас только 2 варианта. Это брать из начала или конца прокрутив конвеер в определенную сторону. У нас нет листика и мы можем брать либо самые старые мандарины, либо самые новые мандарины.
Вывод: Можешь взять мандарины только с краев.Нет листика

Зачем
Наша хитрая память с последовательным доступом это популярный способ согласования передачи данных между устройствами с разной скоростью.
Простой примерчик:
У нас есть микроконтроллер. Будем рассматривать 2-а устройства в составе микроконтроллера (процессор(быстрое устр) и UART(медленное устр)). Если процессор хочет передать данные в блок UART то тут возникает проблема. Ему нужно будет ждать пока данные отправятся, а он мог бы делать что-то полезное как насчет такой модели что между процессором и UART городим склад и привозим мандарины и кладем их друг за другом и даем команду что вперед бери мандарины самые старые и убегает по своим делам. Каждый раз когда процессор захочет что то передать то процессор просто дает задание и не сидит не смотрит на выполнение.
Такое промежуточное хранение позволяет лучше скоординировать работу устройств, участвующих в обмене данными, повысить их независимость друг от друга, согласовать скорости передачи и приема данных. Суть информационного буфера состоит в следующем: передающее устройство записывает передаваемые данные в буфер, а принимающее устройство читает принимаемые данные из буфера.

Еще немного сравнений
Наш хитрый склад : 2 варианта откуда брать мандарины
1) FIFO – первый пришел первый ушел (брать самый старый)
Другим примером может служить очередь из людей скажем к доктору. Кто первый пришел тот и раньше всех проверился, а остальные идут строго за ним в порядке в котором они заняли очередь.
Вывод: Читаем данные в том же порядке что были записаны в память.
2) LIFO – последний пришел первый ушел (брать самый новый)
Другим примером может служить обойма пистолета или автомата. Мы засовываем туда патроны но они идут в низ, то-есть тот первый патрон выстрелит последним.
Вывод: Читаем данные в обратном порядке.

Пример
Описание: Давайте посмотрим на пример программной реализации буферов FIFO и LIFO.
Качаем проектик для билдера (ссылка)


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *