-1

Скажем, у вас есть программа.exe, занимающая 100 КБ памяти. Вы можете уменьшить его до 0 КБ, чтобы теоретически он не мог работать? Taskmgr.exe может сказать, что он работает, но если он уменьшен до 0kb, то его функции не могут быть выполнены.

Тогда с этим, если программа достигла 0kb, будет ли она даже перечислена в taskmgr?

[РЕДАКТИРОВАТЬ] Я предполагал ситуацию, когда традиционные задачи или C++ эквивалентны (забыл. Я переучиваю C++) заблокирован и не будет работать.

[РЕДАКТИРОВАТЬ 2] Мой сценарий является просто пакетный сценарий. В основном это выглядит так:

@echo off
:x
taskkill /f /im program.exe
goto x

2 ответа2

3

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

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

Допустим, ядро все равно делает это. Он распределяет часть памяти для программы foo , которая использует ее для хранения некоторых данных. Через некоторое время ядро крадет память обратно, возможно, перераспределяя ее какой-либо другой программе (или даже операционной системе). Как foo должен получить свои данные сейчас? Если он пытается получить доступ к куску памяти, который имел свои данные, система должна уничтожить его - и это правильно! Память может теперь содержать конфиденциальные данные другого пользователя, и в этом случае, если foo прочитает их, это будет дырой в безопасности. Если он назначен программе, выполняемой от имени другого пользователя, или операционной системе, разрешение записи в foo может привести к возникновению любого количества плохих и непредсказуемых вещей.

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

-2

На самом деле, нет. Я не очень знаком с архитектурой Windows, но в Unix вы ищете команду renice . Это уменьшает (или увеличивает) приоритет, с которым процессу выделяется процессорное время. Например, при значении -20-кратности программе выделяется все возможное время ЦП, тогда как при +20 она запускается только в том случае, если ЦП не нужен никакой другой процесс.

(Если вы хотите, чтобы процесс занимал нулевое время процессора, вы можете принудительно приостановить его, отправив сигнал SIGSTOP помощью команды kill -STOP , и возобновить его с помощью SIGCONT используя kill -CONT .)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .