Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

ограничение памяти   Найти похожие ветки 

 
stin10   (2005-06-14 09:49) [0]

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


 
-=XP=- ©   (2005-06-14 09:52) [1]

Ей и так отводится определенный объем памяти - 2 ГБайта.


 
Bel ©   (2005-06-14 09:52) [2]

Никак.
А зачем?


 
stin10   (2005-06-14 11:28) [3]

а нужно 2 гбайта а 100 кб и или меньше, а если не знаете то так и скажите, а нужно  для безопастности


 
Kerk ©   (2005-06-14 11:32) [4]

а никак. ВАП оно 4Гб и будет 4Гб.. а сколько ты себе выделишь - другой вопрос.


 
Digitman ©   (2005-06-14 11:32) [5]


> а нужно  для безопастности


и чем же "опастна" программа, которая "умножает два числа" и которой "отведено" 2Гб ?


 
stin10   (2005-06-14 11:51) [6]

а если программа забивает всю оперативку, и всё на хрен виснет
а  сложение вообще не причем


 
Плохиш ©   (2005-06-14 11:53) [7]

>stin10   (14.06.05 11:51) [6]

А ты думаешь, ОС чем занимается, травку курит?

Память процесса и оперативная память панятия разные.


 
-=XP=- ©   (2005-06-14 11:54) [8]

а если программа забивает всю оперативку, и всё на хрен виснет

То это проблема не доступного объема памяти, а чьих-то кривых рук.
И ограничение доступной памяти тут не при чем - просто Ваша программа при таком ограничании рухнет задолго до "забития всей оперативки".

P.S. Интересно, кого потом будут "забивать" пользователи?


 
stin10   (2005-06-14 12:09) [9]

кривые руки тут ни причем, поясняю конкретно на сервер посылаются исходные коды пользователей на сервере они компилируються и запускаються с помощью компилятора командной строки dcc32,  вот и представте пользователь посылает прогу которая обрашаеться к оперативке и занимет её и другие пользователи ни чего отправить не смогут и запустить


 
Digitman ©   (2005-06-14 12:13) [10]


> запускаються с помощью компилятора


????!


 
Anatoly Podgoretsky ©   (2005-06-14 12:14) [11]

Пользователи не могут обратиться к оперативке.


 
Думкин ©   (2005-06-14 12:16) [12]

Не можете ответить - лучше помолчите. :)


 
Digitman ©   (2005-06-14 12:17) [13]


> прогу которая обрашаеться к оперативке


покажи пример такой "проги" ... хотя бы маленький фрагмент, где, по твоему утверждению, выполняется не иначе как "обращение к оперативке"


 
-=XP=- ©   (2005-06-14 12:17) [14]

Вирусня какая-то. И кривые руки "пользователей", написавших "прогу, забившую всю память".

P.S. Какая-то дикая сетевая помесь RPC, Delphi и еще чего-то страшного-страшного.


 
ЮЮ ©   (2005-06-14 12:20) [15]

если сервер после получения некоего кода и его "обработки" не обрабатывает других пользователей, значит в серевере есть "дыра", которой и воспользовался первый код :)


 
-=XP=- ©   (2005-06-14 12:23) [16]

Если пользователь может при помощи Вашего приложения запустить на сервере на выполнение вредоносный код (иначе и не назовешь), то это уже не приложение, а троян.


 
Kerk ©   (2005-06-14 12:52) [17]

-=XP=- ©   (14.06.05 12:17) [14]

Сам ты вирусня. По описанию похоже на софт, который в олимпиадах используется. Шлешь исходник на сервер, там он компилируется и запускается.


 
-=XP=- ©   (2005-06-14 13:12) [18]

Kerk ©   (14.06.05 12:52) [17]
Сам ты вирусня

Будьте добры, проявляйте свои наклонности в другом месте.

Автору: Есть два способа полностью контролировать поведение другой программы. Для произвольно взятой программы - использование виртуальной машины, способной выполнять код этой программы. Для программы, написанной на Delphi - использование интерпретатора, скриптового движка, способного выполнять программный код Delphi.
Все остальные способы не дадут полного контроля над выполняемым кодом, особенно в части контроля за памятью. Можно максимально приблизится к "полному контролю", но абсолюта достигнуть вряд ли удастся.
Можно еще покопаться в менеджере памяти Delphi. Но я почему-то сомневаюсь, что это копание не приведет к плачевным последствиям.


 
stin10   (2005-06-14 13:21) [19]

вот дельный ответ, но к сожелению использование виртуальной машины это мне не подходит,слишком сложна реализация и времени нет, а вот насчет второго если можно поподробнее, к примеру для запуска в безопастном режиме что прога не смогла обратиться к катологам и файлам использую функцию CreateProcessWithLogonW котоая запускает файлы с определенными привелегиями, нет ли чего нибудь в роде это функции, но относительно оперативки.


 
-=XP=- ©   (2005-06-14 13:37) [20]

нет ли чего нибудь в роде это функции, но относительно оперативки

Да что Вам эта оперативка сдалась? Программа работает в виртуальном адресном пространстве, и объем доступной программе памяти не зависит от объема установленной на машине физической оперативной памяти. У каждого приложения 4 ГБайтное адресное пространство, из которого программе доступно 2 ГБайта. Так уж устроена 32-разрядная Windows. Единственное, что Вы можете сделать - так это заставить ОС скинуть занятую процессом память в Swap-файл при помощи функции SetProcessWorkingSetSize() - но это полумера, для "отвода глаз".


 
Digitman ©   (2005-06-14 13:39) [21]


> stin10   (14.06.05 13:21) [19]



> нет ли чего нибудь в роде это функции, но относительно оперативки


не было, нет и не предвидится.


 
stin10   (2005-06-14 14:00) [22]

уважаемый XP, с этого места поподробнее и по конкретнеее и ссылками  если можно т.е если запусть десять прог одновременно что получиться сколько памяти на каждую проги


 
Alexander Panov ©   (2005-06-14 14:07) [23]

stin10   (14.06.05 14:00) [22]
уважаемый XP, с этого места поподробнее и по конкретнеее и ссылками  если можно т.е если запусть десять прог одновременно что получиться сколько памяти на каждую проги


на каждую по 4Гб.


 
-=XP=- ©   (2005-06-14 14:10) [24]

сколько памяти на каждую проги

Еще раз. Не путайте виртуальную память с физической памятью. Ни одно приложение Win32 не работате с физической памятью. Вся выделяемая приложению память - виртуальная. Распределением памяти управляет ОС. Она же может (и часто делает), без ведома приложения, скинуть страницы памяти в Swap-файл на диск.
Еще раз: 4 ГБайта - виртуальное адресное пространство. И, сколько бы памяти не было установлено на конкретно взятом компьютере, каждое приложение получает 4 ГБайтное адресное пространство, из которых 2 ГБайта отводится приложению, 2 ГБайта - системе. Приложение вольно брать для своих нужд из этих 2 ГБайт столько памяти, сколько ему нужно. И никто не ограничивает приложение в аппетитах.

Можно еще ограничить размер стека директивой компилятора {$m MinStackSize, MaxStackSize}, но это, опять же, чревато плачевными последствиями.

Хотите ссылки - поищите в Google.
Для начала, прочитайте хотя бы вот это: http://itc.ua/article.phtml?ID=539&IDw=1&pid=15


 
Erik1 ©   (2005-06-14 15:59) [25]

Вобщето если программа компилируется то ей можно подсунуть другой Memory Manager. Кроме того возможно стоит понизить приоритет выполнения.
 А о выполнения Delphi кода скриптом стоит подумать, поскольку такие движки уже есть.


 
-=XP=- ©   (2005-06-14 16:11) [26]

Кроме того возможно стоит понизить приоритет выполнения.

Как это отразится на использовании памяти приложением?

Вобщето если программа компилируется то ей можно подсунуть другой Memory Manager

Один из возможных оговоренных вариантов, если не используются механизмы выделения памяти ОС, типа VirtualAlloc, GlobalAlloc и пр.


 
evvcom ©   (2005-06-14 16:14) [27]


> то ей можно подсунуть другой Memory Manager

Да какой ему менеджер? Во первых, автор не понимает элементарных вещей, а во вторых, далеко не каждый программист пользует Дельфовый менеджер. Хотя можно, конечно, и API перехватить, но рано автору это еще. Имхо.


 
pasha_golub ©   (2005-06-14 16:58) [28]

Вообще-то, я раньше занимался похожей проблемой. Согласен с Керком, что автор пишет олимпиадный софт.

Посему:
1. Использовать FreePascal
2. Использовать Linux

Щас я поищу у себя, может даже дам готовый вариант


 
pasha_golub ©   (2005-06-14 17:19) [29]

Не могу найти исходников, но идея такова:

1. Сервис слушает и заливает полученные исходники, например, в /tmp/practice

2. Затем переходим в этот каталог chdir("/tmp/practice")

3. Переопределяем корень системы для заданного процесса chroot("/tmp/practice")

4. "Понижаем пользователя" setuid(500)

5. Компилируем и запускаем полученные исходники.

6. ПРоверяем вывод программы.

7. После чего все грохаем.

Можно ограничить и память и дисковое пространство для процесса, но я в упор не помню как...

Начать поиск можно отсюда: http://www.linuxfocus.org/English/January2002/article225.shtml

ЗЫ В папке /tmp должны быть все необходимые файлы для компиляции, или можно скомпилить исходники до установки chroot.


 
pasha_golub ©   (2005-06-14 17:21) [30]

По поводу 5 пункта.

Можно запустить через system, но, ИМХО, лучше через fork, а в теле основной программы ждать завершения работы через waitpid


 
pasha_golub ©   (2005-06-14 17:25) [31]

О, нашел.

Вот тут об ограничении для пользователей:
http://www.linux.com/howtos/Xterminals/advanced.shtml


 
pasha_golub ©   (2005-06-14 17:31) [32]

ulimit - ограничить ресурсы под Линью.


 
stin10   (2005-06-15 10:10) [33]

а что вы скажите по поводут этого
Ограничения на процессы можно накладывать в WinNT системах.
Системы 9х не поддерживают данных функций.
Чтобы ограничить процесс или процессы, их помещают в задание.
На задание накладываются всевозможные ограничения, помещают в него процессы.
Ищи в инете функцию CreateJobObject
В структурах OBOBJECT_EXTENDED_LIMIT_INFORMATION и JOBOBJECT_BASIC_LIMIT_INFORMATION (это часть предыдущей структуры) нужно выставлять флаги ограничения на минимальный и максимальный объем памяти на процесс или общей памяти на все процессы в задании, выставить значения ограничений в ProcessMemoryLimit или JobMemoryLimit. Потом присвоить эти ограничения хэндлу задания через SetInformationJobObject. Потом создать новый процесс и воткнуть его в это задание.
Слишком много информации ковырять нужно. Сейчас времени на это нет.
Поищи какой-нить пример по CreateJobObject. По аналогии воткни нужные значения в описанные выше структуры.
Просто сделано не для программистов, а для системы, чтобы ей было удобно. Зато можно ограничивать почти все. Кроме памяти можно задать максимальное время работы, что можно, а что нельзя юзать, приоритет, запретить юзать клипборд, изменение системных параметров, юзать чужие окна, и многое другое.
Система навороченная, поэтому все не так просто. Нужно повозиться. С чем и желаю успехов. Прямая тебе дорога в MSDN за инфой...


 
TUser ©   (2005-06-15 10:34) [34]

> Есть два способа полностью контролировать поведение другой программы.

SoftICE забыл.


 
Andy BitOff ©   (2005-06-15 10:56) [35]

stin10   (15.06.05 10:10) [33]

Копирайт, пожалуйста, и ссылку на источник.


 
stin10   (2005-06-15 11:05) [36]

msdn


 
Andy BitOff ©   (2005-06-15 11:52) [37]

Неужели теперь в msdn пишу так; "...Поищи какой-нить пример по CreateJobObject. По аналогии воткни нужные значения в описанные выше структуры.
Просто сделано не для программистов, а для системы, чтобы ей было удобно. Зато можно ограничивать почти все. Кроме памяти можно задать максимальное время работы, что можно, а что нельзя юзать, приоритет, запретить юзать клипборд, изменение системных параметров, юзать чужие окна, и многое другое.
Система навороченная, поэтому все не так просто. Нужно повозиться. С чем и желаю успехов. Прямая тебе дорога в MSDN за инфой..."


 
pasha_golub ©   (2005-06-15 15:51) [38]

Andy BitOff ©   (15.06.05 11:52) [37]
Поддерживаю. Хочется увидеть прямой линк



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.041 c
3-1116933870
alex_***
2005-05-24 15:24
2005.07.11
MS SQL server


14-1118051494
Juice
2005-06-06 13:51
2005.07.11
Меню Windows 2000


3-1117107578
stud
2005-05-26 15:39
2005.07.11
знатокам dxmasterview


14-1118233188
Ilya39
2005-06-08 16:19
2005.07.11
бесплатный хостинг с cgi скриптами на Delphi


1-1119523292
samuel
2005-06-23 14:41
2005.07.11
Как запустить программу как сервис?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский