Я в 1996г создавал программу управления программатором ПЗУ. Имея 256К ОЗУ на ZX, приходилось работать с двумя буферами образа ПЗУ по 64Кб каждый, применяя страничную адресацию.
Буфера были размещены по границам страниц. Были подпрограммы чтения и записи байта в буфер по 16-битному адресу внутри буфера. Работали они очень медленно, ведь для чтения или записи каждого байта приходилось вычислять адрес, переключать страницы, а потом переключать их назад. В результате скорость работы программатора определялась не скоростью работы микросхем ПЗУ или самого программатора, а скоростью доступа в буфер. Одним словом, тормозно было.
Особенно большие тормоза наблюдались при чтении и записи содержимого буферов на диск. Ведь если подготовка данных занимает слишком большое время - то головка проскакивает над нужным сектором, и приходится ждать следующего оборота диска. Поэтому для целей чтения и записи на диск пришлось сделать блочный доступ к буферам в памяти. То есть с дискеты считывалось несколько секторов (как правило, дорожка целиком) в промежуточный буфер, после чего из промежуточного буфера данные уже помещались в основной, тоже побайтно. Тоже тормоза, но чуть меньше.
Тем не менее, благодаря тому, что я не вылизывал эти частные моменты, программа "Omniprog" управления программатором была создана в рекордно короткие сроки и имела множество полезных функций и красивый интерфейс пользователя. А тормоза - дело относительное. Несмотря на неэффективный доступ к памяти, Omniprog работал быстрее, чем другие доступные на то время программаторы, в том числе те, которые работали на PC.
Если бы я все это дело разрабатывал сейчас - то сразу реализовал бы блочный доступ к основным буферам, т.е. извлекал оттуда или помещал туда сразу блоки, а не отдельные байты. Думаю, в этом случае основные тормоза были бы побеждены.
Но блочный доступ реализовать сложнее, чем побайтный. Например, для пересылки блока произвольной длины с произвольного виртуального адреса нужно учитывать ситуации, когда этот блок переходит через границу страницы. Также блочный доступ сложнее использовать в подпрограммах высокого уровня. Например, функция поиска строки в буфере тривиально реализуется в случае побайтного доступа. А в случае блочного - нужно разбить весь процесс на отдельные блоки и как-то отрабатывать переходы через их границы.




Ответить с цитированием