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

Насколько я понимаю Ваш вопрос, это обычно происходит таким способом:

Если Вы выделяете память:

  • Память Mark, как выделено, но не выделяет физическую память (следовательно на доступе будет отсутствие страницы). В Linux это останавливается на данном этапе, но возможно, что система может сразу выделить физическое место - затем это выполняет подобный алгоритм в конце как на отсутствии страницы за исключением того, что OOM не произойдет.

Если существует отсутствие страницы (получающий доступ не отображенная страница)

  1. Проверьте, выделяется ли память, если не возвращают ошибку.
  2. Проверьте, существует ли свободная физическая страница. Если существует goto 5
  3. Проверьте, существует ли часть, которая может быть записана обратно к диску (как файл от кэша) или если существует свободное пространство на подкачке (если нет никакой подкачки, рассматривают это как подкачку размера 0). Если существует, записывают обратно файл/блок к диску или страницу записи к диску, то не отображают его и goto 5. Если оба возможны, выбирают любого.
  4. Возвратите условие OOM. Это зависит от ядра, что происходит - это может отобразить ошибку пользователю, панике/"синему" экрану ядра, найдите, что некоторый процесс уничтожает и т.д.
  5. Отобразите страницу, которая вызвала проблему к освобожденной странице. Если страница была подкачана прочитанная страница от подкачки и помещала ее в страницу. Если страница поддерживается файлом чтения файла и поместила содержание там.

В целом можно сказать, что никакая подкачка не эквивалентна полной подкачке.

3
30.03.2012, 05:50
2 ответа

GNU date имеет точность наносекунды через %N.

every=3     # test every n'th itteration 
bsecs=0.95  # break at secs (float)
bnano=$(printf '%0.9f' "$bsecs"); bnano=${bnano/./};  
# avoid lead '0' octal clash when time slice < 1 sec
shopt -s extglob; bnano=${bnano#+(0)}  

tprev=$(date +%s%N)
for i in {1..24} ;do  # just a test loop

  if ((i%every==1)) ;then
    tnow=$(date +%s%N)
    if ((tnow-tprev>=bnano)) ;then 
        echo "Auto Break!  $every itteratons took longer than $bsecs secs"
        break
    fi
    ((tprev=tnow))
  fi
  # do something, eg sleep for testing
  sleep 1.$i; echo $i
done
2
27.01.2020, 21:20
  • 1
    выглядит правильным, хотя я еще не протестировал. спасибо Peter –  cwd 31.03.2012, 07:00

Если Вы находитесь на Linux, можно использовать команду тайм-аута, которая обеспечивается coreutils пакетом.

документация тайм-аута

2
27.01.2020, 21:20
  • 1
    Хм... перечитывая Ваш вопрос, я понимаю, что мой ответ немного вне темы, поскольку он действительно не считает цикл, просто уничтожает команду после предопределенного периода, если он еще не вышел из себя. Преимущество тайм-аута состоит в том, что он также уничтожает цикл, когда единственное выполнение занимает слишком много времени (например, когда соединение отбрасывается брандмауэром). –  jippie 30.03.2012, 10:37

Теги

Похожие вопросы