Автор Тема: Буферизация ввода/вывода  (Прочитано 27236 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Буферизация ввода/вывода
« Ответ #15 : Январь 17, 2013, 06:38:26 am »
Но я в принципе согласен что в современных осях производительности системного кэширования достаточно для большинства задач. Свой буфер имеет смысл делать только в экстремальных задачах.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Буферизация ввода/вывода
« Ответ #16 : Январь 17, 2013, 06:47:03 am »
Так там тоже вроде как через int 21h это делается. Нет? То есть через прерывание - а это медленно. Это рраз.
Два - системный буфер в ДОС-е тоже есть (как бишь эту системную стандартную утиль звали, которая его включает... не помню, надо же... А! Во! smartdrv)
Не шарю в тонкостях IO DOS. Но в TP вроде был свой буфер, и читалось/писалось из него прямо на диск (а не в какой-то системный буфер). И потому в TP блочный ввод вывод с буфером кратным размеру сектора давал ускорение на порядки за счет минимизации числа обращений к диску. То же самое в оригинальном Обероне.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Буферизация ввода/вывода
« Ответ #17 : Январь 17, 2013, 06:52:07 am »
Кроме того если ты не контролируешь буфер, то скорее всего будут проблемы при реализации транзакций например, ибо неизвестно на диске уже данные или нет.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Буферизация ввода/вывода
« Ответ #18 : Январь 17, 2013, 07:22:06 am »
Так там тоже вроде как через int 21h это делается. Нет? То есть через прерывание - а это медленно. Это рраз.
Два - системный буфер в ДОС-е тоже есть (как бишь эту системную стандартную утиль звали, которая его включает... не помню, надо же... А! Во! smartdrv)
Не шарю в тонкостях IO DOS. Но в TP вроде был свой буфер, и читалось/писалось из него прямо на диск (а не в какой-то системный буфер). И потому в TP блочный ввод вывод с буфером кратным размеру сектора давал ускорение на порядки за счет минимизации числа обращений к диску. То же самое в оригинальном Обероне.
А вот если запустить до того smartdrv, то разница будет уже не столь велика :-) То есть экономия будет просто за счет меньшего числа прерываний.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Буферизация ввода/вывода
« Ответ #19 : Январь 17, 2013, 10:45:43 am »
Ради интереса посмотрел размеры буферов в разных Оберонах:
1. А2 - 4 КБ
2. ETH Oberon - 4 КБ
3. Linz Oberon V4 - 1 КБ
4. оригинальный Oberon:
BufferRecord =
RECORD apos, lim: INTEGER;
   mod: BOOLEAN;
   next: Buffer;
   data: FileDir.DataSector;
END

где:
DataSector = RECORD(Kernel.Sector)
    B: ARRAY SectorSize OF SYSTEM.BYTE;
END

где:
SectorSize = 1024

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Буферизация ввода/вывода
« Ответ #20 : Январь 17, 2013, 10:49:47 am »
Охохо. По моему, у нас тут идет смешение теплого с мягким.

Если мы пишем ОС, или работаем с блочным устройством на прямую, то критерии выбора размера буфера будет одни (будем подстраиваться под устройство оного блочного устройства).

Если мы пишем прикладное ПО, работающее на ОС у которой есть свой буфер, то критерии выбора размера буфера будут уже совсем другие. Ибо это буфер взаимодействия с ОС, а не буфер взаимодействия с блочным устройством.

Внимание вопрос - какой случай нас интересует?
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Буферизация ввода/вывода
« Ответ #21 : Январь 17, 2013, 11:02:06 am »
Тык вот именно! Я это и пытаюсь понять. Во всех приведенных системах размер буфера выбран конкретного размера по объективным причинам, ибо все эти системы могут работать нативно. И там это дает существенный профит.

А вот почему буфер ББ такой непонятно. И непонятно почему он фиксированный. Кроме того буфер ББ - это не то же самое, что буфер Оберона, т.к. нет прямого обмена с файловой системой. Т.е. в ББ буфер пользовательский и его размер по идее не зависит от файловой системы. Системный буфер windows делает за ББ ту работу, которая лежала на буфере оригинального Оберона.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Буферизация ввода/вывода
« Ответ #22 : Январь 17, 2013, 11:05:05 am »
И кроме того, valexey, управление файлами и буферами во всех Оберонах одинаковое. В этом то и странность.

ps А системный буфер windows вообще 256КБ...
« Последнее редактирование: Январь 17, 2013, 11:06:50 am от ilovb »

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Буферизация ввода/вывода
« Ответ #23 : Январь 17, 2013, 11:16:45 am »
И кроме того, valexey, управление файлами и буферами во всех Оберонах одинаковое. В этом то и странность.

ps А системный буфер windows вообще 256КБ...

Да ладно? А это что такое?
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Буферизация ввода/вывода
« Ответ #24 : Январь 17, 2013, 11:20:50 am »
Это весь кэш. А я говорю про отдельный буфер:
Цитировать
As depicted by the solid arrows in the previous figure, a 256 KB region of data is read into a 256 KB cache "slot" in system address space when it is first requested by the cache manager during a file read operation. A user-mode process then copies the data in this slot to its own address space. When the process has completed its data access, it writes the altered data back to the same slot in the system cache, as shown by the dotted arrow between the process address space and the system cache. When the cache manager has determined that the data will no longer be needed for a certain amount of time, it writes the altered data back to the file on the disk, as shown by the dotted arrow between the system cache and the disk.
http://msdn.microsoft.com/ru-ru/library/windows/desktop/aa364218(v=vs.85).aspx

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Буферизация ввода/вывода
« Ответ #25 : Январь 17, 2013, 11:23:56 am »
По аналогии - в ББ весь кэш 8 КБ на каждый файл, т.к. состоит из 4 буферов по 2 КБ

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Буферизация ввода/вывода
« Ответ #26 : Январь 17, 2013, 11:25:20 am »
И кроме того, valexey, управление файлами и буферами во всех Оберонах одинаковое. В этом то и странность.
Ну, а что такого странного? Что 1024 что 4096 буфер будет работать лучше чем без буфера вообще (в случае если мы работаем поверх ОС). Впрочем, также неплохо будет работать и буфер размером в 1234 байта (но немного хуже, но чтобы это самое немного хуже обнаружить, придется сильно извратиться). Ибо экономим на syscall'ах. То есть выбор не принципиален для очень многих задач.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Буферизация ввода/вывода
« Ответ #27 : Январь 17, 2013, 11:30:51 am »
Странно что он такой маленький и фиксированный.
Размер 2 КБ ни туда ни сюда. Не оставили же они 1 КБ как в оригинале...

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Буферизация ввода/вывода
« Ответ #28 : Январь 17, 2013, 11:36:31 am »
Т.е. для уменьшения частоты обмена с системным буфером логичнее было бы делать пользовательский буфер больше (32КБ - 64КБ), но они этого не сделали, и даже сделали размер неизменным...

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Буферизация ввода/вывода
« Ответ #29 : Январь 17, 2013, 11:38:25 am »
Странно что он такой маленький и фиксированный.
Размер 2 КБ ни туда ни сюда. Не оставили же они 1 КБ как в оригинале...
Изучая исключительно io-шедулер NT ты не поймешь почему в ББ сделано именно так. Просто потому, что ББ не затачивался под NT.

ББ затачивался под Win9x и MacOS (классику). Поэтому, видимо, следует смотреть что было с кешированием там, и что там было с FS.

То есть решение по этой константе было принято когда-то тогда. Решение не менялось просто потому, что ни разу не встретилась задача, где это выстрелило бы.
Y = λf.(λx.f (x x)) (λx.f (x x))