Как оптимально подгрузить из свопа?
От: OlegLy  
Дата: 18.10.02 09:26
Оценка:
Нужно, что-бы за секунду до использования данные из свопа уже точно
оказались в оперативке.

— Как лучше это сделать — гарантированно подгрузить,
и при этом с минимальными потерями производительности?

— Можно ли каким-либо образом периодичести сообщать винде,
что вот эти данные имеют большую вероятность понадобится в ближайшее время,
и поэтому лучше их не свопить, а эти — нет...
Re: Как оптимально подгрузить из свопа?
От: Алекс Россия http://wise-orm.com
Дата: 18.10.02 09:32
Оценка:
Здравствуйте OlegLy, Вы писали:

OL>Нужно, что-бы за секунду до использования данные из свопа уже точно

OL>оказались в оперативке.

OL> — Как лучше это сделать — гарантированно подгрузить,

OL> и при этом с минимальными потерями производительности?

OL> — Можно ли каким-либо образом периодичести сообщать винде,

OL> что вот эти данные имеют большую вероятность понадобится в ближайшее время,
OL> и поэтому лучше их не свопить, а эти — нет...

VirtualLock()
Re: Как оптимально подгрузить из свопа?
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.02 10:22
Оценка:
Здравствуйте OlegLy, Вы писали:

OL>Нужно, что-бы за секунду до использования данные из свопа уже точно

OL>оказались в оперативке.

Просто — пишешь меленький агент, который по таймеру будет обращаться по определенному указателю.

Например начинаешь алгоритм какой и закидываешь адресок, по которому данные тебе понадобятся. Этот агент читает кусочек и все. Если данные были в свопе, они перекачаются в ОП. Но для чего это надо тебе ?

Можно таким образом сканировать все адресное пространство в потоке каком, через промежутки времени определенные.

while(bContinue)
{
sleep(10);
pAddressVector->SafeReadNextAddress();
}

OL> — Как лучше это сделать — гарантированно подгрузить,
OL> и при этом с минимальными потерями производительности?

OL> — Можно ли каким-либо образом периодичести сообщать винде,

OL> что вот эти данные имеют большую вероятность понадобится в ближайшее время,
OL> и поэтому лучше их не свопить, а эти — нет...
Re: Как оптимально подгрузить из свопа?
От: AiratSA Россия  
Дата: 18.10.02 10:41
Оценка:
Здравствуйте OlegLy, Вы писали:

OL>Нужно, что-бы за секунду до использования данные из свопа уже точно

OL>оказались в оперативке.

OL> — Как лучше это сделать — гарантированно подгрузить,

OL> и при этом с минимальными потерями производительности?

OL> — Можно ли каким-либо образом периодичести сообщать винде,

OL> что вот эти данные имеют большую вероятность понадобится в ближайшее время,
OL> и поэтому лучше их не свопить, а эти — нет...

Строго говоря — никаках гарантий быть не может, поскольку Windows — не операционная система реального времени. К тому же твой процесс в "нужное" время может быть вытеснен другим и просто не получит процессорное время.
Re[2]: Как оптимально подгрузить из свопа?
От: OlegLy  
Дата: 18.10.02 11:39
Оценка:
Спасибо за ответы..- так вобщем-то и делал, но надо видимо как-то по-другому.
Опишу поконкрентее:

Точное время неважно: лишь бы в секунду-две грузанулось( заранее известно
какие именно данные понадобятся), возможность вытеснения другим процессом
не предусматривается, предположим, что в винде система, мой процесс и все.

Создал отдельный поток(Idle), задача которого – считывать данные( 4 мега)
из свопа (500 мегов) для того, чтобы они загрузились с в оперативку до того,
как понадобятся основному потоку.

Беда: На время этой подгрузки Своп тормозит все потоки процесса, хотя весь
смысл этой операции состоял бы именно в “парралельной” упреждающей подгрузке,
благо процессорного времени для этого – хоть отбавляй!!!

Как заставить своп не останавливать на время подгрузки весь процесс? Или как
по-другому сделать это псевдопарралельно?
Re[3]: Как оптимально подгрузить из свопа?
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.02 12:20
Оценка:
Здравствуйте OlegLy, Вы писали:

Так, как я тебе описал раньше. Только по таймеру опрашиваешь страницы конкретные и не даешь уйти в своп.
Времени жрать будет макс 10% .Но оперативная память будет очень сильно юзаться. Но так возможна ситуация, что вы заставишь высвопиться другие аппликации. Если одна из них активируется, то все равно будет свопить долго, и твой процесс будет тормозить.


OL> Точное время неважно: лишь бы в секунду-две грузанулось( заранее известно

OL> какие именно данные понадобятся), возможность вытеснения другим процессом
OL> не предусматривается, предположим, что в винде система, мой процесс и все.

OL>Создал отдельный поток(Idle), задача которого – считывать данные( 4 мега)

OL>из свопа (500 мегов) для того, чтобы они загрузились с в оперативку до того,
OL>как понадобятся основному потоку.

OL> Беда: На время этой подгрузки Своп тормозит все потоки процесса, хотя весь

OL> смысл этой операции состоял бы именно в “парралельной” упреждающей подгрузке,
OL> благо процессорного времени для этого – хоть отбавляй!!!

OL>Как заставить своп не останавливать на время подгрузки весь процесс? Или как

OL>по-другому сделать это псевдопарралельно?
Re[3]: Как оптимально подгрузить из свопа?
От: Алекс Россия http://wise-orm.com
Дата: 18.10.02 12:33
Оценка:
Здравствуйте OlegLy, Вы писали:

[]

OL>Как заставить своп не останавливать на время подгрузки весь процесс? Или как

OL>по-другому сделать это псевдопарралельно?

Эта функция гарантирует, что страницы, входящие в указанный диапазон всегда будут в оператичной памяти на время работы хотя бы одного потока процесса.
Re[4]: Как оптимально подгрузить из свопа?
От: OlegLy  
Дата: 18.10.02 13:34
Оценка:
Здравствуйте Алекс, Вы писали:


А>Эта функция гарантирует, что страницы, входящие в указанный диапазон всегда

A>будут в оператичной памяти на время работы хотя бы одного потока процесса.

Функция – то классная, но у меня крайне мало данных, которые должны быть всегда в оперативной памяти.
90% данных каждую минуту-две постоянно меняются, причем по заранее известным законам. Поэтому здесь
лучше бы подошло правильное управление менеджером подкачек.

А вот как сделать, что бы он не останавливал главный поток, — не понятно…
Re[4]: Как оптимально подгрузить из свопа?
От: OlegLy  
Дата: 18.10.02 13:41
Оценка:
Здравствуйте old Dutchman, Вы писали:



OD>Так, как я тебе описал раньше. Только по таймеру опрашиваешь страницы конкретные и не даешь уйти в своп.

OD>Времени жрать будет макс 10% .Но оперативная память будет очень сильно юзаться. Но так возможна ситуация, что вы заставишь высвопиться другие аппликации. Если одна из них активируется, то все равно будет свопить долго, и твой процесс будет тормозить.

Если делать так, то даже без воздействия других процессов, эта загрузка ТОРМОЗНЕТ сам основной поток
процесса, так что смысл второго потока вообще теряется – одновременно работает-то все равно только один!!!

Если делаю подгрузку не из свопа, а просто из файла, то одновременно работают оба потока, и в процессе
загрузки ни чего(а гланое — основной поток) не тормозит. То есть, в принципе, — это возможно….

Вот и хотелось бы добиться где-то такого же эффекта…но через своп…

А постоянно грузить просто из файлов не приемлемо потому, что без максимального использования всей
доступной оперативки тормоза будут вообще полные…

Фактически, в моей задаче очень просто производить 100% верное кеширование, причем за секунду-другую
до самого события — идеальное место применения менеджера памяти, а вот как этот менеджер бестормозно
об этом уведомить, и не понятно….

Как заставить своп не тормозить основной поток?
Re[3]: Как оптимально подгрузить из свопа?
От: AiratSA Россия  
Дата: 18.10.02 14:26
Оценка:
Здравствуйте OlegLy, Вы писали:

OL>Спасибо за ответы..- так вобщем-то и делал, но надо видимо как-то по-другому.

OL>Опишу поконкрентее:

OL> Точное время неважно: лишь бы в секунду-две грузанулось( заранее известно

OL> какие именно данные понадобятся), возможность вытеснения другим процессом
OL> не предусматривается, предположим, что в винде система, мой процесс и все.

OL>Создал отдельный поток(Idle), задача которого – считывать данные( 4 мега)

OL>из свопа (500 мегов) для того, чтобы они загрузились с в оперативку до того,
OL>как понадобятся основному потоку.

OL> Беда: На время этой подгрузки Своп тормозит все потоки процесса, хотя весь

OL> смысл этой операции состоял бы именно в “парралельной” упреждающей подгрузке,
OL> благо процессорного времени для этого – хоть отбавляй!!!

OL>Как заставить своп не останавливать на время подгрузки весь процесс? Или как

OL>по-другому сделать это псевдопарралельно?

Не понятно, о каком свопе идет речь — о своп-файле Windows или о собственном файле программы?
Если о собственном файле, то загружать надо асинхронно.
Re[4]: Как оптимально подгрузить из свопа?
От: OlegLy  
Дата: 18.10.02 14:43
Оценка:
Здравствуйте AiratSA, Вы писали:


OL>>Как заставить своп не останавливать на время подгрузки весь процесс? Или как

OL>>по-другому сделать это псевдопарралельно?

ASA>Не понятно, о каком свопе идет речь — о своп-файле Windows или о собственном файле программы?

ASA>Если о собственном файле, то загружать надо асинхронно.

Речь — о виндовом свопе... А вот как заставить его ... — не понятно...
Re[5]: Как оптимально подгрузить из свопа?
От: AiratSA Россия  
Дата: 18.10.02 14:49
Оценка:
Здравствуйте OlegLy, Вы писали:

OL>Здравствуйте AiratSA, Вы писали:


OL>

OL>>>Как заставить своп не останавливать на время подгрузки весь процесс? Или как
OL>>>по-другому сделать это псевдопарралельно?

ASA>>Не понятно, о каком свопе идет речь — о своп-файле Windows или о собственном файле программы?

ASA>>Если о собственном файле, то загружать надо асинхронно.

OL>Речь — о виндовом свопе... А вот как заставить его ... — не понятно...


А почему именно из виндового? Почему данные нельзя разместить в другом файле?
Re[6]: Как оптимально подгрузить из свопа?
От: OlegLy  
Дата: 18.10.02 15:08
Оценка:
Здравствуйте AiratSA, Вы писали:


OL>>Речь — о виндовом свопе... А вот как заставить его ... — не понятно...


ASA>А почему именно из виндового? Почему данные нельзя разместить в другом файле?


А постоянно грузить просто из файлов не приемлемо потому, что без максимального
использования всей доступной оперативки тормоза будут вообще полные…
Нужно, что-бы вся имеющаяся память была занята данными, и еще мегов 250 постоянно подгружалось.
Если все 500 Мб держать только на диске, ни какая загрузка не спасет...
Хоть пиши собственный менеджер памяти..., но виндовым-то было бы воспользоваться понятно проще...
Re[5]: Как оптимально подгрузить из свопа?
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.02 16:41
Оценка:
Здравствуйте OlegLy, Вы писали:

OD>>Так, как я тебе описал раньше. Только по таймеру опрашиваешь страницы конкретные и не даешь уйти в своп.

OD>>Времени жрать будет макс 10% .Но оперативная память будет очень сильно юзаться. Но так возможна ситуация, что вы заставишь высвопиться другие аппликации. Если одна из них активируется, то все равно будет свопить долго, и твой процесс будет тормозить.

OL>Если делать так, то даже без воздействия других процессов, эта загрузка ТОРМОЗНЕТ сам основной поток

OL>процесса, так что смысл второго потока вообще теряется – одновременно работает-то все равно только один!!!

Как это — один ? Я же говорю — максимум 10% времени процессорного.

OL> Если делаю подгрузку не из свопа, а просто из файла, то одновременно работают оба потока, и в процессе

OL> загрузки ни чего(а гланое — основной поток) не тормозит. То есть, в принципе, — это возможно….

OL>Вот и хотелось бы добиться где-то такого же эффекта…но через своп…


Блин, сделай FileMapping, чего ты к свопу пристал ?

OL> А постоянно грузить просто из файлов не приемлемо потому, что без максимального использования всей

OL>доступной оперативки тормоза будут вообще полные…

Масксимальная производительность только с FileMapping.

OL>Фактически, в моей задаче очень просто производить 100% верное кеширование, причем за секунду-другую

OL>до самого события — идеальное место применения менеджера памяти, а вот как этот менеджер бестормозно
OL>об этом уведомить, и не понятно….

OL>Как заставить своп не тормозить основной поток?
Re[7]: Как оптимально подгрузить из свопа?
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.02 16:46
Оценка:
Здравствуйте OlegLy, Вы писали:

OL>>>Речь — о виндовом свопе... А вот как заставить его ... — не понятно...


ASA>>А почему именно из виндового? Почему данные нельзя разместить в другом файле?


OL>А постоянно грузить просто из файлов не приемлемо потому, что без максимального

OL>использования всей доступной оперативки тормоза будут вообще полные…
OL>Нужно, что-бы вся имеющаяся память была занята данными, и еще мегов 250 постоянно подгружалось.
OL>Если все 500 Мб держать только на диске, ни какая загрузка не спасет...
OL>Хоть пиши собственный менеджер памяти..., но виндовым-то было бы воспользоваться понятно проще...

Виндовый своп запуск EXE, загрузка DLL, сервисов и всякой дряни — это FileMapping.
Такое ты можешь сам реализовать.

Для твоей задачи НАДО очень много памяти и проблема решится сама собой.

А вообще она не является системой реального времени. Что это значит ? Это значит, что время отклика на событие не детерминировано и является случайной величиной !!! Это значит, что как только ты захочешь получить доступ к ОП, ты можешь подвиснуть на некоторое время. Она не прерывается в системной фазе, например. Тут тебя никакой менеджер памяти не спасет.
Re: Как оптимально подгрузить из свопа?
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.10.02 16:49
Оценка:
Здравствуйте OlegLy, Вы писали:

Слушай, расскажи, что ты хочешь сделать ? Игры со свопом под виндой не дадут того успеха, как ты хочешь, потому, что она не является системой реального времени. А тебе похоже, имено это и надо.


Ты уже много нарассказывал, но это все фантазии. Расскажи задачу ?
Re[5]: Как оптимально подгрузить из свопа?
От: Алекс Россия http://wise-orm.com
Дата: 19.10.02 11:06
Оценка:
Здравствуйте OlegLy, Вы писали:

OL>Здравствуйте Алекс, Вы писали:


OL>

А>>Эта функция гарантирует, что страницы, входящие в указанный диапазон всегда
A>>будут в оператичной памяти на время работы хотя бы одного потока процесса.

OL>Функция – то классная, но у меня крайне мало данных, которые должны быть всегда в оперативной памяти.

OL>90% данных каждую минуту-две постоянно меняются, причем по заранее известным законам. Поэтому здесь
OL>лучше бы подошло правильное управление менеджером подкачек.
OL>
OL>А вот как сделать, что бы он не останавливал главный поток, — не понятно…

???

Ну и пускай меняются! В чем проблема-то?

Что значит не останавливал главный поток. Главных потоков не бывает, есть первичные!

Каждому потоку отводится определенное время для работы. По истечении этого времени (он называется квантом) система начинает исполнять другой поток. При чем начало перепланировки может быть и не связано с окончанием кванта потока.

Короче твой поток рано или позно, все равно будет остановлен. Если он будет ждать у какого-либо объекта синхронизации достаточно долго или системе срочно потребуется большое кол-во оперативной памяти, часть рабочего набора твоего процесса будет урезана (возможно до минимального значения). В этом случае, некоторые критические, по-твоему, данные могут быть выгружены на диск, в файл подкачки. Твоя проблема заключается в том, что тебе нужно чтобы всегда при работе любого, хотя бы одного потока твоего процесса, эти данные находились бы в физической памяти, так? Это гарантирует вышеприведенная функция. Она гарантирует, что никогда при обращении к заданным страницам не будет сгенерено исключение page fault (оно перехватывается менеджером памяти и, если данная страница переданна (commited), загружает ее в оперативку).

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

Теперь что касается остальных постов. Там тебе советовали завести поток, который бы постоянно обращался к данным. Это в корне не верно и вызвано недопониманием работы менеджера памяти и планировщика (scheduler). Без обид.

Любой поток может быть вытеснен системой (возникло прерывание, освободились системные потоки, проч.). Если он вытеснен, то никаких обращений к твоим данным он делать не сможет, так? Если в этот момент система примет решение об урезании рабочих наборов процессов, вследствии нехватки оперативной памяти, возможно твои данные будут выгружены. И никакие дополнительные потоки тебе не помогут.

Смотри Марка Руссиновича "Windows2000 изнутри."
Re[7]: Как оптимально подгрузить из свопа?
От: AiratSA Россия  
Дата: 20.10.02 07:01
Оценка:
Здравствуйте OlegLy, Вы писали:

OL>Здравствуйте AiratSA, Вы писали:

OL>

OL>>>Речь — о виндовом свопе... А вот как заставить его ... — не понятно...


ASA>>А почему именно из виндового? Почему данные нельзя разместить в другом файле?


OL>А постоянно грузить просто из файлов не приемлемо потому, что без максимального

OL>использования всей доступной оперативки тормоза будут вообще полные…
OL>Нужно, что-бы вся имеющаяся память была занята данными, и еще мегов 250 постоянно подгружалось.
OL>Если все 500 Мб держать только на диске, ни какая загрузка не спасет...
OL>Хоть пиши собственный менеджер памяти..., но виндовым-то было бы воспользоваться понятно проще...

Не зная задачи, трудно что-то порекомендовать конкретное, но общие рекомендации таковы.
Для работы с большими объемами памяти нужно использовать VirtualAlloc и связнные с ней фукнции. Возможно придется увеличить Working Set твоего процесса. Данные наверное лучше загружать из своего собственного файла, т.к. неизвестно, как винда грузит из свопа — вполне возможно, что она останавливает весь процесс не время загрузки.
Re[8]: Как оптимально подгрузить из свопа?
От: Алекс Россия http://wise-orm.com
Дата: 20.10.02 08:50
Оценка:
Здравствуйте AiratSA, Вы писали:

ASA>Здравствуйте OlegLy, Вы писали:


[]

ASA>Не зная задачи, трудно что-то порекомендовать конкретное, но общие рекомендации таковы.

ASA>Для работы с большими объемами памяти нужно использовать VirtualAlloc и связнные с ней фукнции. Возможно придется увеличить Working Set твоего процесса. Данные наверное лучше загружать из своего собственного файла, т.к. неизвестно, как винда грузит из свопа — вполне возможно, что она останавливает весь процесс не время загрузки.

Процесс остановить нельзя! Он не исполняется. Если ты имеешь ввиду вопрос: "Кто расплачивается за page fault?". Отвечаю — поток, который вызвал это исключание. Процесс загрузки страниц из свопа синхронный, он использует контекст данного потока

Inside Windows 2000
...
The kernel trap handler dispatches this kind of fault to the memory manager fault handler (MmAccessFault) to resolve. This routine runs in the context of the thread that incurred the fault...

неизвестно, как винда грузит из свопа

Кому не известно, а кому известно. Читайте книги, господа программисты!
Re: Как оптимально подгрузить из свопа?
От: Kubyshev Andrey  
Дата: 22.10.02 13:23
Оценка:
Здравствуйте OlegLy, Вы писали:

OL>Нужно, что-бы за секунду до использования данные из свопа уже точно

OL>оказались в оперативке.

a v unixe est' `madvise`
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.