Использование renice
в программе Linux не сжигает ваш процессор, но не обязательно будет делать то, что вы хотите.
Приоритеты не имеют ничего общего с тем, насколько быстро ЦП выполняет код. Он одинаково быстро выполняет код из программ с разными уровнями приоритета.Приоритеты меняются - это программа, которую операционная система выбирает для запуска, когда ей предоставляется выбор. ЦП могут одновременно запускать только один «поток» выполнения (технически 1 на ядро для многоядерных ЦП).Если ему нужно сделать больше, он полагается на многозадачность - он переключается между выполнением разных программ, чтобы создать иллюзию выполнения большего количества потоков, чем имеется процессоров. Выбирая, сколько времени уделять каждой из этих задач, он делает это, используя приоритет в качестве подсказки.
То, что «в реальном времени» означает для компьютера, не столько «работать так быстро», сколько «не прерывать этот процесс». Программирование в реальном времени очень важно во многих областях. Например, если я писал программное обеспечение, которое управляет антиблокировочной системой тормозов в автомобиле, я действительно не хочу, чтобы моя задача выполнялась на несколько миллисекунд позже, потому что ОС решила, что необходимо запустить диагностику на дворники. Соответственно, программное обеспечение управления антиблокировочной тормозной системой в автомобилях работает с приоритетом «в реальном времени».
По правде говоря, в Linux уровень приоритета «реального времени» употребляется неправильно. Это связано с тем, как Linux планирует свои процессы. В Windows, если у вас есть процесс, который работает с более высоким приоритетом, процессам, работающим с более низким приоритетом, не дается процессорное время, если задача с более высоким приоритетом чего-то не ожидает - вообще никакого. Только процессы ядра могут выполняться поверх задачи Windows в реальном времени. В Windows имеется тонна вредоносного ПО, постоянно работающего в фоновом режиме, поэтому повышение приоритета до «реального времени» предотвращает запуск всего этого мусора.
Однако с этим есть проблема. Иногда ваша задача с более высоким приоритетом зависит от одной из задач с более низким приоритетом. Это называется «инверсией приоритета» и является большой темой в мире многопоточного программирования.Когда это происходит, задача с более высоким приоритетом может заморозить задачу с более низким приоритетом, не осознавая, что она останавливается сама! В Linux этого не происходит, потому что в Linux приоритеты рассматриваются как способ определения того, какая часть ЦП отдана каждой программе, а не как принцип «все или ничего». Процесс, работающий с -20, получает существенно процессорного времени, чем процесс, работающий с 0, но даже при наличии программы -20 программа 0 получает некоторое процессорного времени. Если память обслуживает, текущий планировщик Linux дает программе со значением -1 вдвое больше мощности процессора, чем 0, а программе со значением -2 вдвое больше, чем -1, и так далее. Это означает, что 0,9999046% вашего процессорного времени уйдет на программу с -20, но небольшая часть действительно уйдет на программу с нулевым значением. Программа с 0 будет выглядеть так, как будто она работает на процессоре 200 кГц. !
Если вы когда-нибудь захотите истинно в реальном времени, где вы можете предотвратить вытеснение чего-либо еще, вы должны написать драйвер ядра или использовать расширение реального времени для Linux. У Redhat есть один под названием MRG, который позволяет обрабатывать данные в реальном времени в Linux. В этом случае «реальное время» означает нечто конкретное. В MRG пользователям из группы «реального времени» разрешено использовать эти расширения реального времени (которые могут постоянно загружать процессор, потому что они намеренно не используют удобный планировщик Linux).
Есть два способа:
printf
для печати и форматирования вывода (вместо echo
) column -s: -t
command
./list_packages openSUSE-2016-254 | column -s : -t
zypper-aptitude.noarch 1.12.23-1.1 update needed
zypper-log.noarch 1.12.23-1.1 update needed
libsolv-debugsource None not installed
libsolv-demo None not installed
libsolv-demo-debuginfo None not installed
libsolv-devel None not installed
libsolv-devel-debuginfo None not installed
libsolv-tools 0.6.14-1.1 update needed
libsolv-tools-debuginfo None not installed
perl-solv None not installed
perl-solv-debuginfo None not installed
python-solv 0.6.14-1.1 update needed
python-solv-debuginfo None not installed
ruby-solv None not installed
ruby-solv-debuginfo None not installed
libzypp 15.19.5-1.1 update needed
libzypp-debuginfo None not installed
libzypp-debugsource None not installed
libzypp-devel None not installed
libzypp-devel-doc None not installed
zypper 1.12.23-1.1 update needed
zypper-debuginfo None not installed
zypper-debugsource None not installed
Вы можете использовать что-то вроде: при чтении -r arg1 arg2; do awk '{print "package: $ arg1 version: $ arg1}'; done
Идея в том, что arg1 всегда будет первым словом в строке, arg2 будет вторым и т. д. используйте if
grep
и т. д. для достижения желаемой цели. Надеюсь, что это поможет!