В этой лекции рассматриваются базовые сведения, связанные с
Несмотря на то, что
В тех случаях, когда поведение и ключи программ /usr/. Таким образом, для того, чтобы выбрать,
какие программы – оригинальные или XPG4-совместимые вы предпочитаете
использовать в своей системе, – достаточно указать первым в переменной
/usr/, то при
вызове команды по ее короткому имени (например, grep ), а не по полному
имени файла (например, /usr/ ), будет вызываться /usr/
– оригинальная программа. Если указать в /usr/, то
будет запускаться XPG4-совместимая версия. Помните, что оригинальные
программы могут располагаться также в /, /usr/.
Спецификация XPG4 включает в себя
Единицей исполнения в любой операционной системе является
процесс. Процесс – это совокупность
В
Каждый процесс в большинстве ОС (в частности,
Когда процесс ждет завершения внешнего по отношению к нему
события (обработки
На помощь приходит механизм многопоточности: внутри одного
процесса создается несколько потоков. Поток (
Современные
Кроме удобного
В компьютерах с несколькими
Задача обеспечения многопоточности сводится к созданию
Диспетчер (также его иногда называют
(рис 9.1) Соотношение между потоками пользователя и потоками ядра в Solaris 10Такая организация многопоточности введена в
(рис 9.2) Соотношение между потоками пользователя и потоками ядра в Solaris до версии 9 включительноПроцессы делятся на
Само
Потоки
Каждый процесс имеет уникальный идентификатор, владельца и
группу, представленных
Процесс всегда имеет свой уникальный номер –
В pkill ниже) – реальные. Эти идентификаторы
передаются по наследству от
Передача этих идентификаторов для
Любой процесс относится к какой-либо терминальной группе, т.е. группе процессов, запущеных с одного терминала. Терминал определяется параметром TTYID.
Процесс имеет базовый и динамический приоритеты, в зависимости
от
Посмотреть полный список процессов в системе с выводом их идентификаторов и ряда других параметров можно командой .
Во многих системах UNIX процесс имеет базовый приоритет (NICE)
и динамический приоритет (
В
Каждый процесс может быть представлен одним или несколькими
потоками
Приоритет базируется на классе планирования (
Процесс получает свой класс
Получить информацию о текущих классах dispadmin.
Каждый процесс имеет свою
применяется для задания типа терминала. , обычно являются экспортируемыми. Из
:
export TERM PATH
К
char *env[]
Каждый процесс при запуске может получить один или несколько
аргументов. К аргументам можно обращаться так же, как и к переменным
char *argv[]
Число аргументов обязательно передается в каждый процесс в переменной
int argc
В
| Очередь планирования | |
|---|---|
| 159–100 | Процессы реального времени (0-59) |
| 99–60 | Системные процессы |
| 59–0 |
По умолчанию процессы попадают в класс с разделением времени.
С помощью команды
ps –cl
можно узнать глобальные приоритеты запущенных в данный момент
процессов, а "внутренние" dispadmin.
Планирование в реальном времени относится к средствам, с помощью
которых процессу по мере необходимости обеспечивается квант
Планирование в реальном времени важно там, где важно гарантированное
время реакции системы на внешнее событие: в системах управления
Существует три варианта
В нестрогой среде реального времени период реакции должен иметь
гарантированную конечную продолжительность (например, верхний
предел времени, за которое приложение должно освободить
В большинстве систем UNIX поддержки реального времени нет. Это связано с тем, что:
Решение первой из этих проблем в
Когда поток готов к выполнению, он помещается в очередь отправки
на выполнение. Каждый
Поток может лишиться процессорного времени в данный момент и
покинуть
Выяснить, с каким легковесным процессом ассоциирован конкретный
процесс, и какой и ключей –L и –с:
/usr/bin/ps –efcL
UID PID PPID LWP NLWP CLS PRI STIME TTY LTIME CMD
root 0 0 1 1 SYS 96 00:23:03 ? 0:03 sched
root 1 0 1 1 TS 59 00:23:03 ? 0:00 /etc/init -
root 2 0 1 1 SYS 98 00:23:03 ? 0:00 pageout
root 3 0 1 1 SYS 60 00:23:03 ? 0:00 fsflush
root 314 1 1 1 TS 59 00:23:35 ? 0:00 /usr/lib/saf/sac -t 300
root 289 1 1 1 TS 59 00:23:32 ? 0:00 /usr/lib/snmp/snmpdx -y -c
/etc/snmp/conf
root 182 1 1 3 TS 59 00:23:22 ? 0:00 /usr/lib/autofs/automountd
root 182 1 2 3 TS 59 00:23:23 ? 0:00 /usr/lib/autofs/automountd
root 182 1 3 3 TS 59 00:25:23 ? 0:00 /usr/lib/autofs/automountd
root 207 1 3 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd
root 207 1 4 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd
root 207 1 5 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd
root 207 1 6 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd
root 207 1 7 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd
root 207 1 8 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd
root 207 1 9 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd
root 193 1 11 13 TS 59 00:23:24 ? 0:00 /usr/sbin/syslogd
root 193 1 12 13 TS 59 00:23:24 ? 0:00 /usr/sbin/syslogd
root 193 1 13 13 TS 59 00:23:26 ? 0:00 /usr/sbin/syslogd
root 439 419 1 1 IA 39 00:24:42 pts/4 0:00 bash
Вывод этой команды сильно сокращен: процессов в системе на
самом деле всегда значительно больше. Сейчас нам интересны прежде
всего колонки
Чем больше числовое значение глобального приоритета (значение PRI), тем выше глобальный приоритет процесса.
Мы видим, что многопоточные процессы (например, /usr/lib/autofs/automountd и /usr/sbin/syslogd) могут одновременно иметь несколько
Таблицы диспетчера настраиваются с помощью команды dispadmin.
Настройка выполняется следующим образом: вначале таблица диспетчера
конкретного класса выводится в файл, затем файл редактируется в
dispadmin.
Чтобы узнать, какие классы доступны для редактирования, следует
запустить dispadmin с ключом –l и определить активные классы
планирования:
dispadmin -l CONFIGURED CLASSES ================== SYS (System Class) TS (Time Sharing) FX (Fixed Priority) IA (Interactive) RT (Real Time)
Далее выводим таблицу диспетчера для выбранного класса (попробуем это на классе планирования с разделением времени – TS ):
dispadmin -c TS -g # Time Sharing Dispatcher Configuration RES=1000 ts_quantum ts_tqexp ts_slpret ts_maxwait ts_lwait PRIORITY LEVEL 200 0 50 0 50 # 0 200 0 50 0 50 # 1 200 0 50 0 50 # 2 200 0 50 0 50 # 3 200 0 50 0 50 # 4 200 0 50 0 50 # 5 200 0 50 0 50 # 6 200 0 50 0 50 # 7 200 0 50 0 50 # 8 200 0 50 0 50 # 9 160 0 51 0 51 # 10 160 1 51 0 51 # 11 160 2 51 0 51 # 12 160 3 51 0 51 # 13 160 4 51 0 51 # 14 160 5 51 0 51 # 15 160 6 51 0 51 # 16 160 7 51 0 51 # 17 160 8 51 0 51 # 18 160 9 51 0 51 # 19 120 10 52 0 52 # 20 120 11 52 0 52 # 21 120 12 52 0 52 # 22 120 13 52 0 52 # 23 120 14 52 0 52 # 24 120 15 52 0 52 # 25 120 16 52 0 52 # 26 120 17 52 0 52 # 27 120 18 52 0 52 # 28 120 19 52 0 52 # 29 80 20 53 0 53 # 30 80 21 53 0 53 # 31 80 22 53 0 53 # 32 80 23 53 0 53 # 33 80 24 53 0 53 # 34 80 25 54 0 54 # 35 80 26 54 0 54 # 36 80 27 54 0 54 # 37 80 28 54 0 54 # 38 80 29 54 0 54 # 39 40 30 55 0 55 # 40 40 31 55 0 55 # 41 40 32 55 0 55 # 42 40 33 55 0 55 # 43 40 34 55 0 55 # 44 40 35 56 0 56 # 45 40 36 57 0 57 # 46 40 37 58 0 58 # 47 40 38 58 0 58 # 48 40 39 58 0 59 # 49 40 40 58 0 59 # 50 40 41 58 0 59 # 51 40 42 58 0 59 # 52 40 43 58 0 59 # 53 40 44 58 0 59 # 54 40 45 58 0 59 # 55 40 46 58 0 59 # 56 40 47 58 0 59 # 57 40 48 58 0 59 # 58 20 49 59 32000 59 # 59
Первая строка, в которой указано значение , определяет, в чем измеряется
время во всей
фактически задает дискретность измерения времени для столбца ts_quantum
таблицы диспетчера. Ее значение по умолчанию 1000. Изменять дискретность
не рекомендуется. Обратная к величина равна 0,001, и это интерпретируется
как одна тысячная секунды, т.е. одна миллисекунда. Стало быть, по умолчанию
время в столбце ts_quantum измеряется в миллисекундах.
Как было показано в разделе "Диспетчер" выше, смысл значений в столбцах таблицы диспетчера следующий:
ts_quantum представляет собой максимальный период времени (квант), в течение которого поток может оставаться в процессоре до того, как диспетчер изменит его приоритет;ts_tqexp задает приоритет, который будет назначен потоку после того, как он будет удален из ts_slpret указывает приоритет, который будет иметь процесс, когда он будет обрабатываться после "сна", т.е. после ожидания завершения ts_maxwait указывает время в секундах, которое процесс будет оставаться в очереди, в случае, если его квант времени еще не истек; если он не использует свой квант времени в течение этого числа секунд, ему будет присвоен новый приоритет ts_lswait. Если ts_maxwait равно нулю, то принимается значение по умолчанию (одна секунда);ts_lswait обозначает присваиваемый процессу приоритет, когда процесс на долгое время был В таблицах диспетчера указываются относительные приоритеты
(которые имеют силу внутри
Обратите внимание на то, что более высокоприоритетные процессы
имеют меньшие кванты времени. Значение maxwait для самого выского
приоритета, 59, настолько высоко, что ему придется ждать дольше других,
если он лишится процессорного времени в пользу
Посмотрим, как работает эта схема динамического назначения
приоритетов. Предположим, процесс начал выполняться с приоритетом
0. Подождав, пока ему дадут управление в течение одной секунды
( ts_maxwait ), процесс получил новый приоритет 50 ( ts_lwait ).
Вместе с новым
Если процесс продолжает все время использовать процессорное
время, не отвлекаясь на ts_tqexp ).
Дальнейшие назначения приоритетов показаны ниже:
| Приоритет | Квант |
|---|---|
| 40 | 40 |
| 30 | 80 |
| 20 | 120 |
| 10 | 160 |
| 0 | 200 |
| 50 | 40 |
| 40 | 40 |
| 30 | 80 |
| и т.д. | и т.д. |
Такая схема динамического назначения приоритетов позволяет
быстро выполниться коротким высокоприоритетным процессам и дает
возможность работать низкоприоритетным процессам. В то же время,
процессы, постоянно потребляющие процессорное время, перемещаются
к более низким приоритетам, получают большие кванты времени и
будут больше времени проводить с низким приоритетом. Если же низкоприоритетный
поток будет постоянно прерываться более высокоприоритетными,
то его приоритет будет быстро повышен – как только пойдет ts_maxwait секунд. Фактически, это означает, что в сильно загруженной
высокоприоритетными потоками системе низкоприоритетный поток
через секунду будет становиться высокоприоритетным.
Класс реального времени (RT) описывается более простой таблицей диспетчера:
# Real Time Dispatcher Configuration RES=1000 TIME QUANTUM(rt_quantum) PRIORITY LEVEL 1000 # 0 1000 # 1 1000 # 2 1000 # 3 1000 # 4 1000 # 5 1000 # 6 1000 # 7 1000 # 8 1000 # 9 800 # 10 800 # 11 800 # 12 800 # 13 800 # 14 800 # 15 800 # 16 800 # 17 800 # 18 800 # 19 600 # 20 600 # 21 600 # 22 600 # 23 600 # 24 600 # 25 600 # 26 600 # 27 600 # 28 600 # 29 400 # 30 400 # 31 400 # 32 400 # 33 400 # 34 400 # 35 400 # 36 400 # 37 400 # 38 400 # 39 200 # 40 200 # 41 200 # 42 200 # 43 200 # 44 200 # 45 200 # 46 200 # 47 200 # 48 200 # 49 100 # 50 100 # 51 100 # 52 100 # 53 100 # 54 100 # 55 100 # 56 100 # 57 100 # 58 100 # 59
Потоки реального времени выполняются до завершения или до
истечения их кванта (если в очереди стоят несколько потоков реального
времени). Потокам реального времени присваивается самый высокий
абсолютный приоритет, даже более высокий, чем потокам
В
В более ранних версиях
Более детальное описание этой возможности дано по адресу http://docs.sun.com/db/doc/816-4882/6mb2ipq5n?q=scheduling+classa=view
В лекции 5 курса "Системное
В любой многопроцессной системе запущенные и ждущие продолжения
выполнения процессы могут в сумме занимать больший объем,
чем объем установленной оперативной памяти, и поэтому в таких системах
используют
В UNIX вся память разделена на страницы определенного одинакового
размера. Каждый процесс получает от системы запрошенное
количество памяти, выделение памяти в UNIX осуществляется постранично.
Процессы реального времени и часть кода pagesize.
Традиционно в литературе по системам UNIX для описания процесса
обмена страницами между памятью и диском используетcя термин
"
Алгоритм, который используется для выгрузки страниц в UNIX,
называется "алгоритмом часов". Предполагается, что
Более подробно алгоритм работы менеджера виртуальной памяти
рассмотрен в лекции 8 курса "Системное
Для функционирования системы обязательно требуется, чтобы
существовал по крайней мере один
При планировании дисковой подсистемы (в частности, размера
При нехватке памяти
В ходе работы процессы обращаются к
То, какие права
Новый файл по умолчанию получает идентификаторы владельца и
группы по наследству от процесса, который его создал, а права доступа к
нему – по умолчанию – umask.
Эффективный
Идентификаторы владельца и
Обычно эффективные идентификаторы владельца и /etc/. С другой стороны, нельзя давать каждому пользователю такое
право: вдруг он поменяет не только свой пароль? Кто откажется сделать
милый сюрприз коллеге? Как быть? Если вы подумали, что выход в том,
чтобы все пароли менял только
Идея в том, чтобы право записи в /etc/ дать не конкретному
пользователю, а программе passwd (как нам известно, пароль меняет
именно эта программа). К сожалению, в UNIX нет механизма, который
позволяет давать какие-либо права отдельному процессу или приложению.
Поэтому право записи в /etc/ дали пользователю
Это право (запускать программу от имени владельца) является специальным
правом
Как мы помним, полный вид слова прав доступа таков:
| su | sg | t | r | w | x | r | w | x | r | w | x |
Старшие три
Установить chmod права доступа в
числовом виде:
chmod 4755 файл
или мнемоническом виде:
chmod u+s файл
В некоторых системах UNIX доступна только одна из этих двух форм.
В выводе команды ls файлы с установленными битами SUID и SGID
отличаются от прочих тем, что в поле, где обычно стоит "x" (
-r-xr-sr-x 1 root tty 10040 Nov 4 2002 /usr/sbin/wall -r-sr-sr-x 1 root sys 22168 Nov 4 2002 /usr/bin/passwd
Это означает, что присутствуют оба ls в правах доступа к каталогу при
отсутствии права поиска и наличии битов SUID/SGID буква S в выводе
прав доступа будет большой:
dr-Sr-xr-x 2 root other 512 May 10 01:48 enum -rw-r--r-- 1 root other 0 May 10 01:47 q
Обратите внимание на права доступа к каталогу . Объяснение
смысла SUID/SGID для каталога дано в лекции 7.
Найти все файлы, у которых установлен
find / -perm –u+s
а файлы с установленным битом SGID – по команде
find / -perm –g+s
Относитесь внимательно к файлам, права доступа к которым разрешают
запускать их от чужого имени. Появление таких файлов в системе
может облегчить жизнь взломщику. Программа passwd, например, написана
таким образом, что запускающий ее пользователь точно не сможет с ее
помощью сделать ничего, кроме изменения собственного пароля. Поэтому
ей можно доверить запускаться с правами
Появление новых файлов с такими правами доступа к ним может говорить
о попытке взлома системы, поэтому в некоторых ОС при установке
автоматически устанавливается простой сценарий, использующий вышеописанную
команду поиска таких файлов для поиска добавленных за последние
сутки файлов с установленным битом suid. Например, во /etc/daily, ежедневно проверяющем
Имеет смысл удостоверится в том, что все новые файлы появились по известной вам причине.
Процесс в UNIX может быть , редактор текста
stty -tostop
Обратная настройка выполняется командой
stty tostop
Если фоновый процесс пытается выводить что-либо на терминал,
настроенный для работы в режиме tostop, то процессу посылается сигнал
SIGSTOP. Процесс, получивший такой сигнал, останавливается (переводится
в состояние STOPPED).
Для запуска
команда
Можно запустить
make all
Процессы взаимодействуют друг с другом, используя при этом разные
механизмы. Процессы могут асинхронно или синхронно передавать
друг другу данные,
С каждым процессом связаны три независимых потока данных:
Каждому из этих потоков сопосотавлены внутренние
выдала список имен файлов в файл names, а не на терминал,
следует выполнить команду
find / -name "some_name" > names
Символ правой угловой скобки > означает перенаправление выходного
потока запущенной программы в файл. При использовании этой конструкции
файл names будет создан, а если он уже существует, то он будет уничтожен
и будет создан новый файл с таким именем и новым содержимым.
Для добавления вывода программы в
find / -name "some_name" >> names
В этом случае файл names будет создан, если он не существует, а если
существует, выходной поток программы добавится в
Можно перенаправить текст из файла во входной поток.
Если время от времени вы отправляете письма по стандартной
форме, например, уведомляя пользователей о том, что их
mail пользователь@компьютер < файл_с_письмом
Бывает необходимо отправлять пользователям не совершенно одинаковые письма, а письмо, где стандартный текст перемешан с личными обращениями и конкретными подробностями. Тогда на помощь приходит перенаправление потока посредством конструкции "документ здесь".
Это дает возможность перенаправить ввод в процесс не из файла, а
прямо из
mail пользователь@компьютер <<FINAL Дорогой(ая) $TARGETUSER, Вы превысили допустимый размер домашнего каталога на $OVERSIZE килобайт. Удалите ненужные Вам файлы, иначе это сделает робот! Системный администратор FINAL
Такой скрипт отправит по указанному адресу письмо, где вместо $TARGETUSER и $OVERSIZE будут подставлены имя того пользователя,
которому предназначается письмо, и превышение лимита, соответственно.
Естественно, этим переменным следует присвоить какое-то значение
перед выполнением команды, но тот фрагмент скрипта, в котором это
делается, вы с легкостью додумаете самостоятельно.
Указание в тексте значков << показывает что все, что следует
непосредственно за ними до ближайшего символа-разделителя, является ограничителем
текста. Символ-разделитель – это любой пустой символ: пробел,
табуляция или конец строки. Все, что идет за ограничителем текста, передается
во входной поток запущенного командой процеса вплоть до момента,
когда в начале новой строки не встретится такой же ограничитель текста.
Ограничитель может представлять собой любой набор непустых символов –
неважно, просто ли это символ "точка", слово или что-то еще.
Кроме того, что потоки могут быть перенаправлены в файл или из
файла, существует возможность перенаправить выходной поток одного
процесса во входной поток другого. Направьте выходной поток программы ls во входной поток программы more, чтобы длинный список файлов
вывести поэкранно:
ls –l | more
Символ вертикальной черты "|" означает перенаправление выходного потока программы, команда вызова которой находится слева от этого символа, во входной поток программы, вызываемой справа.
При обработке текста часто используется конструкция, называемая конвейером, когда одновременно запускается несколько программ, которые передают данные друг другу: выходной поток первой перенаправляется во входной поток второй, выходной поток второй – во входной поток третьей и т.д.
Например, для подсчета запущенных
ps –auxw | grep httpd | wc –l
Программа выводит список всех процессов, запущенных в системе, grep выбирает из этого списка строки, в которых есть httpd,
а wc с ключом l подсчитывает, как много строк оказалось в ее входном
потоке.
Программы, запущенные в конвейере, начинают работать одновременно, поэтому данные на входе второй программы оказываются так скоро, как их сможет сгенерировать первая.
Процессы могут взаимодействовать между собой, посылая друг другу
сигналы. Список сигналов в
Обычный процесс может послать сигнал только тому процессу, который
имеет такой же эффективный идентификатор владельца, т.е. запущен
тем же
С помощью команды
kill
можно послать сигнал с номером номер_сигнала процессу с идентификатором
kill –номер_сигнала PID
В некоторых системах UNIX есть возможность послать сигнал процессу
с определенным именем с помощью программы killall:
killall –номер_сигнала имя_процесса
В
killall
А отправлять сигнал процессам с определенным именем в pkill.
pkill sendmail
С помощью pkill можно отправлять сигнал завершения
pkill –HUP –G other,daemon
отправит сигнал HUP (SIGHUP) всем процессам, чья фактическая
группа – other или
В табл. 9.2 приведен список сигналов, определенный стандартом
| Сигнал | Номер | Значение |
|---|---|---|
| SIGHUP | 1 | Разрыв связи с управляющим терминалом или |
| SIGINT | 2 | |
| SIGQUIT | 3 | Сигнал выхода дан с клавиатуры |
| SIGILL | 4 | Недопустимая |
| SIGABRT | 6 | Сигнал |
| SIGFPE | 8 | exception: ошибка вычислений с |
| SIGKILL | 9 | Безусловное |
| SIGSEGV | 11 | Неверный адрес памяти |
| SIGPIPE | 13 | Запись в несуществующий |
| SIGALRM | 14 | Сигнал |
| SIGTERM | 15 | Завершение |
| SIGUSR1 | 30,10,16 | Определяется пользователем |
| SIGUSR2 | 31,12,17 | Определяется пользователем |
| SIGCHLD | 20,17,18 | |
| SIGCONT | 19,18,25 | Продолжить выполнение, если оно было остановлено |
| SIGSTOP | 17,19,23 | |
| SIGTSTP | 18,20,24 | |
| SIGTTIN | 21,21,26 | Ввод с терминала для |
| SIGTTOU | 22,22,27 | Вывод с терминала для |
Кроме команды pkill pgrep, которая заменяет конструкцию
ps –ef | grep команда
В
pgrep команда
| Название | Знач. | Действие по умолчанию | Событие |
|---|---|---|---|
| SIGHUP | 1 | завершение | разрыв связи с терминалом |
| SIGINT | 2 | завершение | |
| SIGQUIT | 3 | аварийное завершение ( |
Quit (see termio(7I)) |
| SIGILL | 4 | аварийное завершение ( |
недопустимая команда |
| SIGTRAP | 5 | аварийное завершение ( |
|
| SIGABRT | 6 | аварийное завершение ( |
аварийное принудительное завершение |
| SIGEMT | 7 | аварийное завершение ( |
|
| SIGFPE | 8 | аварийное завершение ( |
|
| SIGKILL | 9 | безусловное завершение | требование безусловного завершения |
| SIGBUS | 10 | аварийное завершение ( |
ошибка |
| SIGSEGV | 11 | аварийное завершение ( |
ошибка |
| SIGSYS | 12 | аварийное завершение ( |
неверный |
| SIGPIPE | 13 | завершение | запись в несуществующий |
| SIGALRM | 14 | завершение | сигнал |
| SIGTERM | 15 | завершение | завершение |
| SIGUSR1 | 16 | завершение | программируемый сигнал 1 |
| SIGUSR2 | 17 | завершение | программируемый сигнал 2 |
| SIGCHLD | 18 | действия не выполняются | изменение статуса |
| SIGPWR | 19 | действия не выполняются | сбой питания или перезагрузка |
| SIGWINCH | 20 | действия не выполняются | изменение размера окна |
| SIGURG | 21 | действия не выполняются | состояние |
| SIGPOLL | 22 | завершение | Pollable |
| SIGSTOP | 23 | остановка | требование остановки |
| SIGTSTP | 24 | остановка с терминала | остановка ввода |
| SIGCONT | 25 | действия не выполняются | требование продолжения |
| SIGTTIN | 26 | остановка ввода | ввод с терминала для |
| SIGTTOU | 27 | остановка вывода | вывод с терминала для |
| SIGVTALRM | 28 | завершение | |
| SIGPROF | 29 | завершение | |
| SIGXCPU | 30 | аварийное завершение ( |
достижение лимита времени использования |
| SIGXFSZ | 31 | аварийное завершение ( |
превышение допустимого |
| SIGWAITING | 32 | действия не выполняются | зарезервировано библиотекой потоков |
| SIGLWP | 33 | действия не выполняются | межпроцессный ( |
| SIGFREEZE | 34 | действия не выполняются | |
| SIGTHAW | 35 | действия не выполняются | |
| SIGCANCEL | 36 | действия не выполняются | |
| SIGXRES | 37 | действия не выполняются | |
| SIGRTMIN | * | завершение | первый сигнал реального времени |
| (SIGRTMIN+1) | * | завершение | второй сигнал реального времени |
| (SIGRTMAX-1) | * | завершение | предпоследний сигнал реального времени |
| SIGRTMAX | * | завершение | последний сигнал реального времени |
Процессы могут обмениваться данными друг с другом, и в UNIX
предусмотрены механизмы такого обмена. Прежде всего, это каналы
(
С точки зрения программиста, бывают именованные и неименованные
каналы, и способы обращения к ним несколько отличаются.
При использовании
Сокет – это объект, который используется для межпроцессных коммуникаций;
он существует, пока какой-либо процесс хранит дескриптор,
ссылающийся на него. Сокет создается системным вызовом
Для каждого
Основными способами, при помощи которых процесс может получить
дескриптор, является открытие или создание объекта, а также
Подробнее о .
Семафоры – это механизм, который принято использовать для контроля
доступа нескольких процессов к одному ресурсу. Есть несколько
реализаций программного интерфейса (
Семафор по сути – это переменная, в зависимости от значения
которой доступ к тому или иному ресурсу разрешается или блокируется
до его
Для Oracle8i в Oracle8i
set semsys:seminfo_semmni=100
set semsys:seminfo_semmsl=<10+самое большое значение PROCESSES
среди ваших БД>
set semsys:seminfo_semmns=<столько, сколько объяснено ниже>
set semsys:seminfo_semopm=100
set semsys:seminfo_semvmx=32767
Значение seminfo_semmns рекомендуется установить равным сумме
параметров
Посмотреть текущие значения параметров семафоров в
sysdef | tail -25
Однако начиная с версии
Посмотреть текущие наборы семафоров в
ipcs -sb
Иногда случается, что при неверном
ipcrm -s semsetID
semsetID здесь означает
Для просмотра текущего списка и
Программа без аргументов сообщает список процессов,
запущенных пользователем в текущей сессии. Обычно
ps –ef
В системах man .
Разберем подробнее, какую информацию выдает программа .
ps -ef | more
UID PID PPID C STIME TTY TIME CMD
root 0 0 0 17:43:30 ? 0:03 sched
root 1 0 0 17:43:30 ? 0:00 /etc/init -s
root 2 0 0 17:43:30 ? 0:00 pageout
root 3 0 0 17:43:30 ? 0:00 fsflush
root 349 1 0 17:43:53 ? 0:00 /usr/lib/saf/sac –t 300
root 277 276 0 17:43:49 ? 0:00 htt_server –port 9010
–syslog -message_locale C
root 180 1 0 17:43:45 ? 0:00 /usr/lib/autofs/automountd
root 59 1 0 17:43:39 ? 0:00 /usr/lib/sysevent/syseventd
root 73 1 0 17:43:40 ? 0:00 /usr/lib/picl/picld
root 133 1 0 17:43:43 ? 0:00 /usr/sbin/rpcbind
root 229 1 0 17:43:48 ? 0:00 /usr/lib/power/powerd
root 172 1 0 17:43:44 ? 0:00 /usr/lib/nfs/lockd
root 156 1 0 17:43:44 ? 0:00 /usr/sbin/inetd -s
root 217 1 0 17:43:47 ? 0:00 /usr/lib/lpsched
daemon 168 1 0 17:43:44 ? 0:00 /usr/lib/nfs/statd
root 189 1 0 17:43:45 ? 0:00 /usr/sbin/syslogd
root 203 1 0 17:43:46 ? 0:00 /usr/sbin/cron
root 205 1 0 17:43:46 ? 0:00 /usr/sbin/nscd
root 343 1 0 17:43:53 ? 0:00 /usr/sbin/vold
root 240 1 0 17:43:48 ? 0:00 /usr/lib/utmpd
root 324 1 0 17:43:51 ? 0:00 /usr/lib/snmp/snmpdx –y –c
/etc/snmp/conf
root 261 1 0 17:43:49 ? 0:00 /usr/sadm/lib/smc/bin/smcboot
root 355 329 0 17:43:56 ? 0:00 /usr/dt/bin/dtlogin -daemon
root 329 1 0 17:43:52 ? 0:00 /usr/dt/bin/dtlogin -daemon
root 262 261 0 17:43:49 ? 0:00 /usr/sadm/lib/smc/bin/smcboot
root 263 261 0 17:43:49 ? 0:00 /usr/sadm/lib/smc/bin/smcboot
root 354 1 0 17:43:55 ? 0:00 /usr/lib/ssh/sshd
root 338 1 0 17:43:52 ? 0:00 /usr/lib/dmi/snmpXdmid -s sunny
root 352 349 0 17:43:53 ? 0:00 /usr/lib/saf/ttymon
root 353 329 2 17:43:54 ? 1:41 /usr/openwin/bin/Xsun :0
–nobanner –auth
/var/dt/A:0-KtaiPa
root 356 329 0 17:43:56 ? 0:00 /usr/openwin/bin/fbconsole –d :0
root 358 324 0 17:43:57 ? 0:00 mibiisa -r –p 5248
root 337 1 0 17:43:52 ? 0:00 /usr/lib/dmi/dmispd
Ниже мы описываем смысл колонок этого вывода. Некоторые
колонки появятся только при использовании специфических ключей,
отличных от ключей ef. Для получения еще более детальной информации
следует обратиться к man .
–f ).
В колонке F –
В колонке S – state (состояние) – указывается
Идентификатор
C –
NI – значение NICE (показателя уступчивости), используется при
вычислении глобального
ADDR – адрес в памяти.
SZ – размер процесса в виртуальной памяти, включая все отображенные
файлы и устройства, измеряется в pagesize.
WCHAN – адрес события, ради которого процесс перешел в состояние сна; если поле пусто – процесс запущен.
STIME – время
TIME – сколько времени процесс отнял у
При указании ключа j выводятся дополнительные сведения:
При указании ключа L выводятся дополнительные сведения, причем информация выдается по одной строке на каждый легковесный процесс. Обычные однопоточные процессы соотносятся только с одним легковесным процессом:
Процессы, которые завершились, но чей код заверешния не был
востребован <defunct>.
Кроме программы :
top last pid: 923; load averages: 4.56, 1.18, 0.50 17:54:22 64 processes: 63 sleeping, 1 on cpu CPU states: 0.0% idle, 0.5% user, 99.5% kernel, 0.0% iowait, 0.0% swap Memory: 128M real, 18M free, 101M swap in use, 499M swap free PID USERNAME LWP PRI NICE SIZE RES STATE TIME CPU COMMAND 909 root 1 60 0 17M 3340K sleep 0:00 0.92% pagein 353 root 1 58 0 32M 16M sleep 0:05 0.37% Xsun 893 root 1 49 0 2228K 1172K cpu 0:00 0.15% top 753 root 1 49 0 15M 8112K sleep 0:00 0.13% dtterm 911 root 1 59 0 3352K 752K sleep 0:00 0.03% sh 912 root 1 49 0 3360K 600K sleep 0:00 0.03% sh 894 root 1 59 0 3064K 1816K sleep 0:00 0.03% dtexec 656 root 5 59 0 22M 10M sleep 0:01 0.02% dtwm 648 root 1 59 0 6644K 2280K sleep 0:00 0.02% ttsession 667 root 1 59 0 1844K 512K sleep 0:00 0.02% rpc.rstatd 277 root 29 59 0 5612K 1724K sleep 0:00 0.01% htt_server 895 root 1 59 0 3360K 756K sleep 0:00 0.01% soffice 720 root 4 49 0 42M 26M sleep 0:03 0.00% mozilla-bin 649 root 1 49 0 18M 6288K sleep 0:00 0.00% dtsession 760 root 1 49 0 4752K 1656K sleep 0:00 0.00% bash
В принято использовать похожую по
функциональности команду prstat.
Кроме этого, в
pgrep имя
Она является эквивалентом команды
ps –ef | grep имя
С помощью pargs можно посмотреть, какие аргументы переданы
конкретному процессу и какая у него
pargs 2793 2793: dtterm -name Run -xrm *menuBar: False -iconic -map -e /usr/dt/ bin/dtexec -open argv[0]: dtterm argv[1]: -e argv[2]: /usr/dt/bin/dtexec argv[3]: -open argv[4]: -1 argv[5]: -ttprocid argv[6]: 2.10fX-r 01 648 1289637086 1 1 0 192.168.5.33 5 sunny_105_1 argv[7]: /export/home/mozilla_bin/sfw/bin/mozilla argv[8]: <NULL> argv[9]: -open argv[10]: -1 argv[11]: -ttprocid argv[12]: 2.10fX-r 01 648 1289637086 1 1 0 192.168.5.33 5 sunny_105_1 argv[13]: /export/home/mozilla_bin/sfw/bin/mozilla pargs -e 2793 2793: dtterm -name Run -xrm *menuBar: False -iconic -map -e /usr/dt/ bin/dtexec -open envp[0]: AB_CARDCATALOG=/usr/dt/share/answerbooks/ru_RU.UTF-8/ ab_cardcatalog envp[1]: DISPLAY=:0.0 envp[2]: DTAPPSEARCHPATH=//.dt/appmanager:/etc/dt/appconfig/ appmanager/%L:/etc/dt/appconfig/appmanager/C:/usr/dt/appconfig/ appmanager/%L:/usr/dt/appconfig/appmanager/C envp[3]: DTDATABASESEARCHPATH=//.dt/types,/etc/dt/appconfig/types/%L,/ etc/dt/appconfig/types/C,/usr/dt/appconfig/types/%L,/usr/dt/appconfig/ types/C
Вывод команды pargs значительно сокращен, ключ –e требует вывести
все содержимое dtterm, как в нашем примере,
Команда prstat позволяет в динамике, подобно команде ,
отслеживать
prstat PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP 3576 root 3412K 868K run 13 0 0:00:02 6,3% find/1 353 root 45M 19M sleep 59 0 0:02:30 0,2% Xsun/1 753 root 15M 3620K run 49 0 0:00:02 0,1% dtterm/1 3577 root 6640K 4108K cpu0 49 0 0:00:00 0,1% prstat/1 205 root 2872K 624K sleep 59 0 0:00:00 0,0% nscd/18 895 root 123M 21M sleep 49 0 0:00:49 0,0% soffice.bin/4 667 root 1844K 488K sleep 59 0 0:00:00 0,0% rpc.rstatd/1 217 root 5364K 536K sleep 59 0 0:00:00 0,0% lpsched/1 324 root 4360K 196K sleep 59 0 0:00:00 0,0% snmpdx/1 240 root 1100K 288K sleep 59 0 0:00:00 0,0% utmpd/1 343 root 4892K 0K sleep 59 0 0:00:00 0,0% vold/3 276 root 3240K 0K sleep 59 0 0:00:00 0,0% htt/1 633 root 3784K 0K sleep 59 0 0:00:00 0,0% sdt_shell/1 657 root 16M 2496K sleep 49 0 0:00:00 0,0% dtfile/1 203 root 4484K 568K sleep 59 0 0:00:00 0,0% cron/1 189 root 5636K 1092K sleep 59 0 0:00:00 0,0% syslogd/13 168 daemon 2444K 820K sleep 59 0 0:00:00 0,0% statd/1 156 root 2412K 688K sleep 59 0 0:00:00 0,0% inetd/1 172 root 2160K 748K sleep 59 0 0:00:00 0,0% lockd/2 229 root 1348K 0K sleep 59 0 0:00:00 0,0% powerd/2 133 root 2212K 604K sleep 59 0 0:00:00 0,0% rpcbind/1 Total: 61 processes, 161 lwps, load averages: 0,25, 0,17, 0,27
Вы можете получить информацию только о тех процессах, которые
запущены вами. Пользователь
В , но если этого
почему-либо не произошло, можно воспользоваться программой preap,
которая примет код
, передающая процессу сигналы. Также можно использовать вышеописанные
программы изменения
Не следует путать команду с сигналом
Будучи запущенной без ключей, она передает процессу сигнал
kill [-ключи] номер_процесса
Например, для sendmail можно выполнить
следующие действия:
ps auxw | grep sendmail root 2057 0.0 0.2 2664 444 ? S Jul08 3:24 sendmail: accepting connections
Как видно, sendmail имеет
kill 2057
И повторяем последнее действие для проверки (контрольный выстрел):
kill 2057 kill: (2057) - No such pid
Сообщение No such говорит о том, что процесс уже завершился.
Программу можно использовать для передачи любых сигналов.
Чтобы передать некий сигнал, надо указать в качестве ключа числовое
или мнемоническое обозначение этого сигнала.
Например, после изменений, внесенных в файл конфигурации /etc/inetd.conf, следует потребовать от inetd перечитать этот
файл конфигурации.
Это можно сделать, послав ему сигнал HUP (номер один), так как
известно, что этот
ps -ef | grep inetd root 156 1 0 17:43:44 ? 0:00 /usr/sbin/inetd -s root 4555 760 0 19:15:16 pts/5 0:00 grep inetd
Мы видим два процесса, в строках информации о которых есть слово
inetd. Первая строка, grep inetd – это тот самый процесс grep, который мы
только что сами запустили. Программы и grep запустились
одновременно, и показал "мгновенный снимок"
По идее, строка grep inetd в таком случае должна показываться всегда, но на практике иногда мы не видим этой строки при запуске такой команды. Проведите эксперимент: возможно, что в вашей системе (это зависит от ее скорости и текущей загрузки) вы никогда не увидите строку grep или, наоборот, будете ее видеть всегда.
Это связано с тем, что физически запуск grep происходит чуть-чуть
позже, чем , последняя может успеть завершиться раньше, чем grep
начнется (ведь таблица процессов может оказаться маленькой и работы
у будет мало). Тогда строки про grep в списке найденных процессов
не будет.
Теперь пошлем сигнал процессу inetd:
kill –1 156
Помните, не все демоны и не во всех системах по сигналу HUP
перечитывают свой файл конфигурации. Прежде, чем посылать демону
сигналы, выясните, как он на них собирается реагировать: почитайте в man о его повадках.
kill –9 PID.
или
kill –KILL PID
При выполнении команды лучше указывать мнемонические
обозначения сигналов, а не числовые: в разных системах UNIX сигналы с
одним числовым номером могут иметь разные смыслы. Впрочем, можно
смело руководствоваться вышеприведенными таблицами в разделе "сигналы"
в отношении сигналов в
Чтобы послать сигнал нескольким процессам одновременно, следует
использовать программу pkill или killall (их подробное описание
есть в разделе "сигналы" выше в этой лекции).
При запуске процесса можно менять его базовый приоритет внутри
В
nice -n приращение команда
например,
nice –n 5 ls
Это "5" воспринимается как увеличение значения NICE на 5, т.е.
снижение приоритета на 5 единиц. Пользователь nice –n -4 ls. Это будет воспринято как увеличение базового
приоритета, т.е. уменьшение значения NICE на 4.
Базовый приоритет уже запущенного процесса можно менять командой renice:
renice -n приращение PID
Команда renice может быть использована также для изменения
приоритета renice ).
Заданием называется запущенные одной командой несколько программ
(в частном случае, это может быть и одна программа). Для управления
заданиями можно использовать , bg и fg
для получения информации о заданиях, переключении задания в фоновый
или
Более подробно о работе с заданиями рассказано в лекции 11.
Вынесете ли вы сегодня мусор или пойдете в магазин, поедете на заправку кормить своего железного коня бензином или просто ляжете спать пораньше – так или иначе, какое-нибудь дело вы сегодня сделаете. Дела, которые вы делаете, могут быть однократными (купить щенка) или регулярными (погулять с собакой). Может быть, "однократные" – не совсем точное прилагательное, потому что щенка вы можете купить и раз, и два, и еще много раз в жизни. Но вряд ли это дело можно назвать регулярным – не станете же вы раз в год ровно в полночь 13 марта покупать щенка!
Все-таки станете? Вы не сатанист, часом?
Еще приятнее запланировать выполнение нерегуряного или регулярного дела так, чтобы его делал кто-то другой. Например, сообщите сыну, что вы просите его завтра в полдень отправиться в клуб собаководов и купить там щеночка. Однократно. А потом (когда купит) скажите, что вы запланировали его (сына) прогулки с ним (щеночком) ежедневно – на годы вперед.
at, а для регулярных
– crontab.
Для планирования однократного запуска задач в строго определенное
время (точность – одна минута) используется программа at. Она
создает и изменяет список задач для выполнения, размещая его в каталоге /var/. В cron не
отвечает за задания, запланированные с помощью at, и для последних
имеется специальный atd.
Чтобы at могла верно запланировать задачи, следует указать ей
время и дату запуска задачи:
at time date
Параметр time может быть в форме HH:MM (часы:минуты), или
словом midnight, noon, now, или временем с название_месяца день [год], либо MMDDYY,
либо MM/DD/YY, либо DD.MM.YY. Также можно
указать время в виде now+ n единицы, где единицы – это minutes, . Можно указать для времени суффикс today или tomorrow.
Указание time без date означает выполнение задачи в текущие сутки,
а если time сегодня уже прошло, то завтра в указанное время.
Программа at принимает список задач для выполнения во входной
поток.
at –l (или atq ) распечатывает список поставленных в очередь задач
at –r позволяет удалить задачу по идентификатору, который показывает at –l.
В некоторых системах at –r называется atrm. В
at.
Обычному пользователю разрешается использовать at в случае, если
его имя указано в файле /usr/lib/cron/at.allow. Если этого файла нет,
то проверяется, нет ли имени пользователя в /usr/lib/cron/at.deny (если
есть, ему запрещается использование at ). Если ни одного из этих двух
файлов нет, пользоваться at разрешается только пользователям, которым
назначен набор /usr/lib/cron/at.deny и он
пуст, то по умолчанию всем разрешено пользоваться at. В файлах at.deny
и at.allow имена пользователей пишутся по одному в строке.
Задания at и crontab заблокированного пользователя не запускаются.
cron запустит задания только того пользователя, который имеет
легальный доступ в систему в настоящее время, как отражено в файле /etc/.
Задание, запущенное на выполнение демоном cron, выполняется от
имени пользователя, который поставил задание в очередь. Стандартный
вывод и стандартный поток ошибок задания cron высылает почтой этому
пользователю. Можно указать иное место для вывода информации с
помощью ключа m команды at или с помощью параметра в файле crontab
(см. ниже). Запланированные задачи выполняются в среде командного
/ без назначения
Проведем небольшой эксперимент. Вначале убедимся, что каталог,
где сохраняются задания at, пуст.
ls /var/spool/cron/atjobs/
Проверим время и дату.
date Сбт 15 Май 2004 19:10:29
Запланируем
at 1912 at> touch /tuition at> <Ctrl-D> commands will be executed using /sbin/sh job 1084633920.a at Сбт Май 15 19:12:00 2004
В каталоге, где собираются задания в очереди на выполнение, появился новый файл:
ls /var/spool/cron/atjobs/ 1084633920.a
И по команде at –l мы получаем информацию о поставленном в
at -l user = root 1084633920.a Сбт Май 15 19:12:00 2004
Пока в tuition нет:
ls / bin devices lib opt tmp xfn boot etc lost+found platform TT_DB cdrom export mnt proc usr core home net sbin var dev kernel nsmail test vol
Почему? Да время еще не наступило:
date Сбт 15 Май 2004 19:11:42
Дожидаемся заданного времени и (о чудо!) файл /tuition появился!
Смотрите:
date Сбт 15 Май 2004 19:12:12 ls / bin devices lib opt tmp vol boot etc lost+found platform TT_DB xfn cdrom export mnt proc tuition core home net sbin usr dev kernel nsmail test var
cron ежеминутно инспектирует таблицу запланированных
задач и выполняет те задачи, время которых наступило (в crontab служит
для планирования периодически запускаемых процессов. Они подготавливают
таблицу заданий для cron.
У каждого пользователя есть своя таблица crontab. Ее можно отредактировать
командой crontab –e. По этой команде вызывается текстовый
редактор (обычно – ), а в качестве файла для редактирования окажется
таблица crontab. Если вы раньше не задавали никаких периодических
задач, файл будет пустым.
Формат таблицы crontab: каждая строка описывает одну задачу, в
строке содержится 6 полей:
mm hh dd mo dw command
mm – минуты от 0 до 59hh – часы от 0 до 23dd – числа от 1 до 31mo – месяцы от 1 до 12dw – дни недели от 0 до 7, 0 и 7 – это воскресенье.command – команда Каждое числовое поле в таблице может содержать число, несколько
чисел через запятую,
Если в строке указаны определенное число месяца и определенный день недели, то для выполнения команды достаточно, чтобы наступило либо это число, либо этот день недели.
Так, строка
12 10 * * 0 rm -rf /var/log/*.[0-9]
означает, что в 10:12 каждое воскресенье нужно удалять файлы *.[0-9] из /var/log.
Однако, если было бы написано
12 10 10 * 0 rm -rf /var/log/*.[0-9]
это бы требовало выполнять такое удаление "в 10:12 по воскресеньям и десятым числам", а не "в 10:12 десятого числа, если оно приходится на воскресенье".
Как и в случае с at, команда запускается от имени владельца
таблицы, в качестве /.
В первых строках таблицы могут быть установлены переменные
PATH=/usr/bin:/usr/sbin:/usr/local/bin
В ней можно задать каталоги, которые по умолчанию не входят в
Кроме cron отправит
сообщение владельцу таблицы crontab, если найдет повод это сделать
(например, произошла ошибка выполнения команды). Если переменная
cron
расценит это значение как имя адресата, которому надо послать письмо,
вместо пользователя, запланировавшего задачу. Если переменная
crontab
осуществляется так:
имя_переменной = значение
Пробелы вокруг знака
Для просмотра таблицы crontab используйте команду crontab -l, для
crontab –r. Можно создать файл с таблицей crontab
заранее и установить ее в систему командой
crontab имя_файла_таблицы.
Такая команда потенциально опасна: если раньше существовали
какие-либо команды в таблице crontab, то они потеряются навсегда.
В /var/ или /etc/.
crontab -e 22 * * * * /var/admin/cron/hourly 22 22 * * * /var/admin/cron/daily 2 22 * * 0 /var/admin/cron/weekly 2 2 1 * * /var/admin/cron/monthly
В скрипт рекомендуется включать проверку состояния сетевого
подсоединения (
В скрипт daily включают проверку очереди сообщений (не слишком
ли велика – запустите mailq ), синхронизацию системного времени
( ntpdate, rdate ).
В скрипт weekly включают проверку свободного места на диске (если
у вас это приходится делать чаще, чем раз в неделю, подумайте о покупке
нового диска; и может быть, лучше сразу купить парочку?), проверку
файлов passwd, и hosts.deny, файлов конфигурации ftpd,
sendmail, протоколов utmp и wtmp на предмет прав доступа и размера.
Ежемесячный скрипт
Вы можете включить в эти скрипты свои задачи, которые являются специфическими для конкретной системы – проверку конфигурации smbd для файлового сервера samba, проверку дисковых квот пользователей, контроль появления свежих файлов с установленным битом SUID и так далее.
В этой лекции рассматриваются базовые сведения, связанные с
Несмотря на то, что
В тех случаях, когда поведение и ключи программ /usr/. Таким образом, для того, чтобы выбрать,
какие программы – оригинальные или XPG4-совместимые вы предпочитаете
использовать в своей системе, – достаточно указать первым в переменной
/usr/, то при
вызове команды по ее короткому имени (например, grep ), а не по полному
имени файла (например, /usr/ ), будет вызываться /usr/
– оригинальная программа. Если указать в /usr/, то
будет запускаться XPG4-совместимая версия. Помните, что оригинальные
программы могут располагаться также в /, /usr/.
Спецификация XPG4 включает в себя
Единицей исполнения в любой операционной системе является
процесс. Процесс – это совокупность
В
Каждый процесс в большинстве ОС (в частности,
Когда процесс ждет завершения внешнего по отношению к нему
события (обработки
На помощь приходит механизм многопоточности: внутри одного
процесса создается несколько потоков. Поток (
Современные
Кроме удобного
В компьютерах с несколькими
Задача обеспечения многопоточности сводится к созданию
Диспетчер (также его иногда называют
(рис 9.1) Соотношение между потоками пользователя и потоками ядра в Solaris 10Такая организация многопоточности введена в
(рис 9.2) Соотношение между потоками пользователя и потоками ядра в Solaris до версии 9 включительноПроцессы делятся на
Само
Потоки
Каждый процесс имеет уникальный идентификатор, владельца и
группу, представленных
Процесс всегда имеет свой уникальный номер –
В pkill ниже) – реальные. Эти идентификаторы
передаются по наследству от
Передача этих идентификаторов для
Любой процесс относится к какой-либо терминальной группе, т.е. группе процессов, запущеных с одного терминала. Терминал определяется параметром TTYID.
Процесс имеет базовый и динамический приоритеты, в зависимости
от
Посмотреть полный список процессов в системе с выводом их идентификаторов и ряда других параметров можно командой .
Во многих системах UNIX процесс имеет базовый приоритет (NICE)
и динамический приоритет (
В
Каждый процесс может быть представлен одним или несколькими
потоками
Приоритет базируется на классе планирования (
Процесс получает свой класс
Получить информацию о текущих классах dispadmin.
Каждый процесс имеет свою
применяется для задания типа терминала. , обычно являются экспортируемыми. Из
:
export TERM PATH
К
char *env[]
Каждый процесс при запуске может получить один или несколько
аргументов. К аргументам можно обращаться так же, как и к переменным
char *argv[]
Число аргументов обязательно передается в каждый процесс в переменной
int argc
В
| Очередь планирования | |
|---|---|
| 159–100 | Процессы реального времени (0-59) |
| 99–60 | Системные процессы |
| 59–0 |
По умолчанию процессы попадают в класс с разделением времени.
С помощью команды
ps –cl
можно узнать глобальные приоритеты запущенных в данный момент
процессов, а "внутренние" dispadmin.
Планирование в реальном времени относится к средствам, с помощью
которых процессу по мере необходимости обеспечивается квант
Планирование в реальном времени важно там, где важно гарантированное
время реакции системы на внешнее событие: в системах управления
Существует три варианта
В нестрогой среде реального времени период реакции должен иметь
гарантированную конечную продолжительность (например, верхний
предел времени, за которое приложение должно освободить
В большинстве систем UNIX поддержки реального времени нет. Это связано с тем, что:
Решение первой из этих проблем в
Когда поток готов к выполнению, он помещается в очередь отправки
на выполнение. Каждый
Поток может лишиться процессорного времени в данный момент и
покинуть
Выяснить, с каким легковесным процессом ассоциирован конкретный
процесс, и какой и ключей –L и –с:
/usr/bin/ps –efcL
UID PID PPID LWP NLWP CLS PRI STIME TTY LTIME CMD
root 0 0 1 1 SYS 96 00:23:03 ? 0:03 sched
root 1 0 1 1 TS 59 00:23:03 ? 0:00 /etc/init -
root 2 0 1 1 SYS 98 00:23:03 ? 0:00 pageout
root 3 0 1 1 SYS 60 00:23:03 ? 0:00 fsflush
root 314 1 1 1 TS 59 00:23:35 ? 0:00 /usr/lib/saf/sac -t 300
root 289 1 1 1 TS 59 00:23:32 ? 0:00 /usr/lib/snmp/snmpdx -y -c
/etc/snmp/conf
root 182 1 1 3 TS 59 00:23:22 ? 0:00 /usr/lib/autofs/automountd
root 182 1 2 3 TS 59 00:23:23 ? 0:00 /usr/lib/autofs/automountd
root 182 1 3 3 TS 59 00:25:23 ? 0:00 /usr/lib/autofs/automountd
root 207 1 3 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd
root 207 1 4 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd
root 207 1 5 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd
root 207 1 6 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd
root 207 1 7 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd
root 207 1 8 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd
root 207 1 9 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd
root 193 1 11 13 TS 59 00:23:24 ? 0:00 /usr/sbin/syslogd
root 193 1 12 13 TS 59 00:23:24 ? 0:00 /usr/sbin/syslogd
root 193 1 13 13 TS 59 00:23:26 ? 0:00 /usr/sbin/syslogd
root 439 419 1 1 IA 39 00:24:42 pts/4 0:00 bash
Вывод этой команды сильно сокращен: процессов в системе на
самом деле всегда значительно больше. Сейчас нам интересны прежде
всего колонки
Чем больше числовое значение глобального приоритета (значение PRI), тем выше глобальный приоритет процесса.
Мы видим, что многопоточные процессы (например, /usr/lib/autofs/automountd и /usr/sbin/syslogd) могут одновременно иметь несколько
Таблицы диспетчера настраиваются с помощью команды dispadmin.
Настройка выполняется следующим образом: вначале таблица диспетчера
конкретного класса выводится в файл, затем файл редактируется в
dispadmin.
Чтобы узнать, какие классы доступны для редактирования, следует
запустить dispadmin с ключом –l и определить активные классы
планирования:
dispadmin -l CONFIGURED CLASSES ================== SYS (System Class) TS (Time Sharing) FX (Fixed Priority) IA (Interactive) RT (Real Time)
Далее выводим таблицу диспетчера для выбранного класса (попробуем это на классе планирования с разделением времени – TS ):
dispadmin -c TS -g # Time Sharing Dispatcher Configuration RES=1000 ts_quantum ts_tqexp ts_slpret ts_maxwait ts_lwait PRIORITY LEVEL 200 0 50 0 50 # 0 200 0 50 0 50 # 1 200 0 50 0 50 # 2 200 0 50 0 50 # 3 200 0 50 0 50 # 4 200 0 50 0 50 # 5 200 0 50 0 50 # 6 200 0 50 0 50 # 7 200 0 50 0 50 # 8 200 0 50 0 50 # 9 160 0 51 0 51 # 10 160 1 51 0 51 # 11 160 2 51 0 51 # 12 160 3 51 0 51 # 13 160 4 51 0 51 # 14 160 5 51 0 51 # 15 160 6 51 0 51 # 16 160 7 51 0 51 # 17 160 8 51 0 51 # 18 160 9 51 0 51 # 19 120 10 52 0 52 # 20 120 11 52 0 52 # 21 120 12 52 0 52 # 22 120 13 52 0 52 # 23 120 14 52 0 52 # 24 120 15 52 0 52 # 25 120 16 52 0 52 # 26 120 17 52 0 52 # 27 120 18 52 0 52 # 28 120 19 52 0 52 # 29 80 20 53 0 53 # 30 80 21 53 0 53 # 31 80 22 53 0 53 # 32 80 23 53 0 53 # 33 80 24 53 0 53 # 34 80 25 54 0 54 # 35 80 26 54 0 54 # 36 80 27 54 0 54 # 37 80 28 54 0 54 # 38 80 29 54 0 54 # 39 40 30 55 0 55 # 40 40 31 55 0 55 # 41 40 32 55 0 55 # 42 40 33 55 0 55 # 43 40 34 55 0 55 # 44 40 35 56 0 56 # 45 40 36 57 0 57 # 46 40 37 58 0 58 # 47 40 38 58 0 58 # 48 40 39 58 0 59 # 49 40 40 58 0 59 # 50 40 41 58 0 59 # 51 40 42 58 0 59 # 52 40 43 58 0 59 # 53 40 44 58 0 59 # 54 40 45 58 0 59 # 55 40 46 58 0 59 # 56 40 47 58 0 59 # 57 40 48 58 0 59 # 58 20 49 59 32000 59 # 59
Первая строка, в которой указано значение , определяет, в чем измеряется
время во всей
фактически задает дискретность измерения времени для столбца ts_quantum
таблицы диспетчера. Ее значение по умолчанию 1000. Изменять дискретность
не рекомендуется. Обратная к величина равна 0,001, и это интерпретируется
как одна тысячная секунды, т.е. одна миллисекунда. Стало быть, по умолчанию
время в столбце ts_quantum измеряется в миллисекундах.
Как было показано в разделе "Диспетчер" выше, смысл значений в столбцах таблицы диспетчера следующий:
ts_quantum представляет собой максимальный период времени (квант), в течение которого поток может оставаться в процессоре до того, как диспетчер изменит его приоритет;ts_tqexp задает приоритет, который будет назначен потоку после того, как он будет удален из ts_slpret указывает приоритет, который будет иметь процесс, когда он будет обрабатываться после "сна", т.е. после ожидания завершения ts_maxwait указывает время в секундах, которое процесс будет оставаться в очереди, в случае, если его квант времени еще не истек; если он не использует свой квант времени в течение этого числа секунд, ему будет присвоен новый приоритет ts_lswait. Если ts_maxwait равно нулю, то принимается значение по умолчанию (одна секунда);ts_lswait обозначает присваиваемый процессу приоритет, когда процесс на долгое время был В таблицах диспетчера указываются относительные приоритеты
(которые имеют силу внутри
Обратите внимание на то, что более высокоприоритетные процессы
имеют меньшие кванты времени. Значение maxwait для самого выского
приоритета, 59, настолько высоко, что ему придется ждать дольше других,
если он лишится процессорного времени в пользу
Посмотрим, как работает эта схема динамического назначения
приоритетов. Предположим, процесс начал выполняться с приоритетом
0. Подождав, пока ему дадут управление в течение одной секунды
( ts_maxwait ), процесс получил новый приоритет 50 ( ts_lwait ).
Вместе с новым
Если процесс продолжает все время использовать процессорное
время, не отвлекаясь на ts_tqexp ).
Дальнейшие назначения приоритетов показаны ниже:
| Приоритет | Квант |
|---|---|
| 40 | 40 |
| 30 | 80 |
| 20 | 120 |
| 10 | 160 |
| 0 | 200 |
| 50 | 40 |
| 40 | 40 |
| 30 | 80 |
| и т.д. | и т.д. |
Такая схема динамического назначения приоритетов позволяет
быстро выполниться коротким высокоприоритетным процессам и дает
возможность работать низкоприоритетным процессам. В то же время,
процессы, постоянно потребляющие процессорное время, перемещаются
к более низким приоритетам, получают большие кванты времени и
будут больше времени проводить с низким приоритетом. Если же низкоприоритетный
поток будет постоянно прерываться более высокоприоритетными,
то его приоритет будет быстро повышен – как только пойдет ts_maxwait секунд. Фактически, это означает, что в сильно загруженной
высокоприоритетными потоками системе низкоприоритетный поток
через секунду будет становиться высокоприоритетным.
Класс реального времени (RT) описывается более простой таблицей диспетчера:
# Real Time Dispatcher Configuration RES=1000 TIME QUANTUM(rt_quantum) PRIORITY LEVEL 1000 # 0 1000 # 1 1000 # 2 1000 # 3 1000 # 4 1000 # 5 1000 # 6 1000 # 7 1000 # 8 1000 # 9 800 # 10 800 # 11 800 # 12 800 # 13 800 # 14 800 # 15 800 # 16 800 # 17 800 # 18 800 # 19 600 # 20 600 # 21 600 # 22 600 # 23 600 # 24 600 # 25 600 # 26 600 # 27 600 # 28 600 # 29 400 # 30 400 # 31 400 # 32 400 # 33 400 # 34 400 # 35 400 # 36 400 # 37 400 # 38 400 # 39 200 # 40 200 # 41 200 # 42 200 # 43 200 # 44 200 # 45 200 # 46 200 # 47 200 # 48 200 # 49 100 # 50 100 # 51 100 # 52 100 # 53 100 # 54 100 # 55 100 # 56 100 # 57 100 # 58 100 # 59
Потоки реального времени выполняются до завершения или до
истечения их кванта (если в очереди стоят несколько потоков реального
времени). Потокам реального времени присваивается самый высокий
абсолютный приоритет, даже более высокий, чем потокам
В
В более ранних версиях
Более детальное описание этой возможности дано по адресу http://docs.sun.com/db/doc/816-4882/6mb2ipq5n?q=scheduling+classa=view
В лекции 5 курса "Системное
В любой многопроцессной системе запущенные и ждущие продолжения
выполнения процессы могут в сумме занимать больший объем,
чем объем установленной оперативной памяти, и поэтому в таких системах
используют
В UNIX вся память разделена на страницы определенного одинакового
размера. Каждый процесс получает от системы запрошенное
количество памяти, выделение памяти в UNIX осуществляется постранично.
Процессы реального времени и часть кода pagesize.
Традиционно в литературе по системам UNIX для описания процесса
обмена страницами между памятью и диском используетcя термин
"
Алгоритм, который используется для выгрузки страниц в UNIX,
называется "алгоритмом часов". Предполагается, что
Более подробно алгоритм работы менеджера виртуальной памяти
рассмотрен в лекции 8 курса "Системное
Для функционирования системы обязательно требуется, чтобы
существовал по крайней мере один
При планировании дисковой подсистемы (в частности, размера
При нехватке памяти
В ходе работы процессы обращаются к
То, какие права
Новый файл по умолчанию получает идентификаторы владельца и
группы по наследству от процесса, который его создал, а права доступа к
нему – по умолчанию – umask.
Эффективный
Идентификаторы владельца и
Обычно эффективные идентификаторы владельца и /etc/. С другой стороны, нельзя давать каждому пользователю такое
право: вдруг он поменяет не только свой пароль? Кто откажется сделать
милый сюрприз коллеге? Как быть? Если вы подумали, что выход в том,
чтобы все пароли менял только
Идея в том, чтобы право записи в /etc/ дать не конкретному
пользователю, а программе passwd (как нам известно, пароль меняет
именно эта программа). К сожалению, в UNIX нет механизма, который
позволяет давать какие-либо права отдельному процессу или приложению.
Поэтому право записи в /etc/ дали пользователю
Это право (запускать программу от имени владельца) является специальным
правом
Как мы помним, полный вид слова прав доступа таков:
| su | sg | t | r | w | x | r | w | x | r | w | x |
Старшие три
Установить chmod права доступа в
числовом виде:
chmod 4755 файл
или мнемоническом виде:
chmod u+s файл
В некоторых системах UNIX доступна только одна из этих двух форм.
В выводе команды ls файлы с установленными битами SUID и SGID
отличаются от прочих тем, что в поле, где обычно стоит "x" (
-r-xr-sr-x 1 root tty 10040 Nov 4 2002 /usr/sbin/wall -r-sr-sr-x 1 root sys 22168 Nov 4 2002 /usr/bin/passwd
Это означает, что присутствуют оба ls в правах доступа к каталогу при
отсутствии права поиска и наличии битов SUID/SGID буква S в выводе
прав доступа будет большой:
dr-Sr-xr-x 2 root other 512 May 10 01:48 enum -rw-r--r-- 1 root other 0 May 10 01:47 q
Обратите внимание на права доступа к каталогу . Объяснение
смысла SUID/SGID для каталога дано в лекции 7.
Найти все файлы, у которых установлен
find / -perm –u+s
а файлы с установленным битом SGID – по команде
find / -perm –g+s
Относитесь внимательно к файлам, права доступа к которым разрешают
запускать их от чужого имени. Появление таких файлов в системе
может облегчить жизнь взломщику. Программа passwd, например, написана
таким образом, что запускающий ее пользователь точно не сможет с ее
помощью сделать ничего, кроме изменения собственного пароля. Поэтому
ей можно доверить запускаться с правами
Появление новых файлов с такими правами доступа к ним может говорить
о попытке взлома системы, поэтому в некоторых ОС при установке
автоматически устанавливается простой сценарий, использующий вышеописанную
команду поиска таких файлов для поиска добавленных за последние
сутки файлов с установленным битом suid. Например, во /etc/daily, ежедневно проверяющем
Имеет смысл удостоверится в том, что все новые файлы появились по известной вам причине.
Процесс в UNIX может быть , редактор текста
stty -tostop
Обратная настройка выполняется командой
stty tostop
Если фоновый процесс пытается выводить что-либо на терминал,
настроенный для работы в режиме tostop, то процессу посылается сигнал
SIGSTOP. Процесс, получивший такой сигнал, останавливается (переводится
в состояние STOPPED).
Для запуска
команда
Можно запустить
make all
Процессы взаимодействуют друг с другом, используя при этом разные
механизмы. Процессы могут асинхронно или синхронно передавать
друг другу данные,
С каждым процессом связаны три независимых потока данных:
Каждому из этих потоков сопосотавлены внутренние
выдала список имен файлов в файл names, а не на терминал,
следует выполнить команду
find / -name "some_name" > names
Символ правой угловой скобки > означает перенаправление выходного
потока запущенной программы в файл. При использовании этой конструкции
файл names будет создан, а если он уже существует, то он будет уничтожен
и будет создан новый файл с таким именем и новым содержимым.
Для добавления вывода программы в
find / -name "some_name" >> names
В этом случае файл names будет создан, если он не существует, а если
существует, выходной поток программы добавится в
Можно перенаправить текст из файла во входной поток.
Если время от времени вы отправляете письма по стандартной
форме, например, уведомляя пользователей о том, что их
mail пользователь@компьютер < файл_с_письмом
Бывает необходимо отправлять пользователям не совершенно одинаковые письма, а письмо, где стандартный текст перемешан с личными обращениями и конкретными подробностями. Тогда на помощь приходит перенаправление потока посредством конструкции "документ здесь".
Это дает возможность перенаправить ввод в процесс не из файла, а
прямо из
mail пользователь@компьютер <<FINAL Дорогой(ая) $TARGETUSER, Вы превысили допустимый размер домашнего каталога на $OVERSIZE килобайт. Удалите ненужные Вам файлы, иначе это сделает робот! Системный администратор FINAL
Такой скрипт отправит по указанному адресу письмо, где вместо $TARGETUSER и $OVERSIZE будут подставлены имя того пользователя,
которому предназначается письмо, и превышение лимита, соответственно.
Естественно, этим переменным следует присвоить какое-то значение
перед выполнением команды, но тот фрагмент скрипта, в котором это
делается, вы с легкостью додумаете самостоятельно.
Указание в тексте значков << показывает что все, что следует
непосредственно за ними до ближайшего символа-разделителя, является ограничителем
текста. Символ-разделитель – это любой пустой символ: пробел,
табуляция или конец строки. Все, что идет за ограничителем текста, передается
во входной поток запущенного командой процеса вплоть до момента,
когда в начале новой строки не встретится такой же ограничитель текста.
Ограничитель может представлять собой любой набор непустых символов –
неважно, просто ли это символ "точка", слово или что-то еще.
Кроме того, что потоки могут быть перенаправлены в файл или из
файла, существует возможность перенаправить выходной поток одного
процесса во входной поток другого. Направьте выходной поток программы ls во входной поток программы more, чтобы длинный список файлов
вывести поэкранно:
ls –l | more
Символ вертикальной черты "|" означает перенаправление выходного потока программы, команда вызова которой находится слева от этого символа, во входной поток программы, вызываемой справа.
При обработке текста часто используется конструкция, называемая конвейером, когда одновременно запускается несколько программ, которые передают данные друг другу: выходной поток первой перенаправляется во входной поток второй, выходной поток второй – во входной поток третьей и т.д.
Например, для подсчета запущенных
ps –auxw | grep httpd | wc –l
Программа выводит список всех процессов, запущенных в системе, grep выбирает из этого списка строки, в которых есть httpd,
а wc с ключом l подсчитывает, как много строк оказалось в ее входном
потоке.
Программы, запущенные в конвейере, начинают работать одновременно, поэтому данные на входе второй программы оказываются так скоро, как их сможет сгенерировать первая.
Процессы могут взаимодействовать между собой, посылая друг другу
сигналы. Список сигналов в
Обычный процесс может послать сигнал только тому процессу, который
имеет такой же эффективный идентификатор владельца, т.е. запущен
тем же
С помощью команды
kill
можно послать сигнал с номером номер_сигнала процессу с идентификатором
kill –номер_сигнала PID
В некоторых системах UNIX есть возможность послать сигнал процессу
с определенным именем с помощью программы killall:
killall –номер_сигнала имя_процесса
В
killall
А отправлять сигнал процессам с определенным именем в pkill.
pkill sendmail
С помощью pkill можно отправлять сигнал завершения
pkill –HUP –G other,daemon
отправит сигнал HUP (SIGHUP) всем процессам, чья фактическая
группа – other или
В табл. 9.2 приведен список сигналов, определенный стандартом
| Сигнал | Номер | Значение |
|---|---|---|
| SIGHUP | 1 | Разрыв связи с управляющим терминалом или |
| SIGINT | 2 | |
| SIGQUIT | 3 | Сигнал выхода дан с клавиатуры |
| SIGILL | 4 | Недопустимая |
| SIGABRT | 6 | Сигнал |
| SIGFPE | 8 | exception: ошибка вычислений с |
| SIGKILL | 9 | Безусловное |
| SIGSEGV | 11 | Неверный адрес памяти |
| SIGPIPE | 13 | Запись в несуществующий |
| SIGALRM | 14 | Сигнал |
| SIGTERM | 15 | Завершение |
| SIGUSR1 | 30,10,16 | Определяется пользователем |
| SIGUSR2 | 31,12,17 | Определяется пользователем |
| SIGCHLD | 20,17,18 | |
| SIGCONT | 19,18,25 | Продолжить выполнение, если оно было остановлено |
| SIGSTOP | 17,19,23 | |
| SIGTSTP | 18,20,24 | |
| SIGTTIN | 21,21,26 | Ввод с терминала для |
| SIGTTOU | 22,22,27 | Вывод с терминала для |
Кроме команды pkill pgrep, которая заменяет конструкцию
ps –ef | grep команда
В
pgrep команда
| Название | Знач. | Действие по умолчанию | Событие |
|---|---|---|---|
| SIGHUP | 1 | завершение | разрыв связи с терминалом |
| SIGINT | 2 | завершение | |
| SIGQUIT | 3 | аварийное завершение ( |
Quit (see termio(7I)) |
| SIGILL | 4 | аварийное завершение ( |
недопустимая команда |
| SIGTRAP | 5 | аварийное завершение ( |
|
| SIGABRT | 6 | аварийное завершение ( |
аварийное принудительное завершение |
| SIGEMT | 7 | аварийное завершение ( |
|
| SIGFPE | 8 | аварийное завершение ( |
|
| SIGKILL | 9 | безусловное завершение | требование безусловного завершения |
| SIGBUS | 10 | аварийное завершение ( |
ошибка |
| SIGSEGV | 11 | аварийное завершение ( |
ошибка |
| SIGSYS | 12 | аварийное завершение ( |
неверный |
| SIGPIPE | 13 | завершение | запись в несуществующий |
| SIGALRM | 14 | завершение | сигнал |
| SIGTERM | 15 | завершение | завершение |
| SIGUSR1 | 16 | завершение | программируемый сигнал 1 |
| SIGUSR2 | 17 | завершение | программируемый сигнал 2 |
| SIGCHLD | 18 | действия не выполняются | изменение статуса |
| SIGPWR | 19 | действия не выполняются | сбой питания или перезагрузка |
| SIGWINCH | 20 | действия не выполняются | изменение размера окна |
| SIGURG | 21 | действия не выполняются | состояние |
| SIGPOLL | 22 | завершение | Pollable |
| SIGSTOP | 23 | остановка | требование остановки |
| SIGTSTP | 24 | остановка с терминала | остановка ввода |
| SIGCONT | 25 | действия не выполняются | требование продолжения |
| SIGTTIN | 26 | остановка ввода | ввод с терминала для |
| SIGTTOU | 27 | остановка вывода | вывод с терминала для |
| SIGVTALRM | 28 | завершение | |
| SIGPROF | 29 | завершение | |
| SIGXCPU | 30 | аварийное завершение ( |
достижение лимита времени использования |
| SIGXFSZ | 31 | аварийное завершение ( |
превышение допустимого |
| SIGWAITING | 32 | действия не выполняются | зарезервировано библиотекой потоков |
| SIGLWP | 33 | действия не выполняются | межпроцессный ( |
| SIGFREEZE | 34 | действия не выполняются | |
| SIGTHAW | 35 | действия не выполняются | |
| SIGCANCEL | 36 | действия не выполняются | |
| SIGXRES | 37 | действия не выполняются | |
| SIGRTMIN | * | завершение | первый сигнал реального времени |
| (SIGRTMIN+1) | * | завершение | второй сигнал реального времени |
| (SIGRTMAX-1) | * | завершение | предпоследний сигнал реального времени |
| SIGRTMAX | * | завершение | последний сигнал реального времени |
Процессы могут обмениваться данными друг с другом, и в UNIX
предусмотрены механизмы такого обмена. Прежде всего, это каналы
(
С точки зрения программиста, бывают именованные и неименованные
каналы, и способы обращения к ним несколько отличаются.
При использовании
Сокет – это объект, который используется для межпроцессных коммуникаций;
он существует, пока какой-либо процесс хранит дескриптор,
ссылающийся на него. Сокет создается системным вызовом
Для каждого
Основными способами, при помощи которых процесс может получить
дескриптор, является открытие или создание объекта, а также
Подробнее о .
Семафоры – это механизм, который принято использовать для контроля
доступа нескольких процессов к одному ресурсу. Есть несколько
реализаций программного интерфейса (
Семафор по сути – это переменная, в зависимости от значения
которой доступ к тому или иному ресурсу разрешается или блокируется
до его
Для Oracle8i в Oracle8i
set semsys:seminfo_semmni=100
set semsys:seminfo_semmsl=<10+самое большое значение PROCESSES
среди ваших БД>
set semsys:seminfo_semmns=<столько, сколько объяснено ниже>
set semsys:seminfo_semopm=100
set semsys:seminfo_semvmx=32767
Значение seminfo_semmns рекомендуется установить равным сумме
параметров
Посмотреть текущие значения параметров семафоров в
sysdef | tail -25
Однако начиная с версии
Посмотреть текущие наборы семафоров в
ipcs -sb
Иногда случается, что при неверном
ipcrm -s semsetID
semsetID здесь означает
Для просмотра текущего списка и
Программа без аргументов сообщает список процессов,
запущенных пользователем в текущей сессии. Обычно
ps –ef
В системах man .
Разберем подробнее, какую информацию выдает программа .
ps -ef | more
UID PID PPID C STIME TTY TIME CMD
root 0 0 0 17:43:30 ? 0:03 sched
root 1 0 0 17:43:30 ? 0:00 /etc/init -s
root 2 0 0 17:43:30 ? 0:00 pageout
root 3 0 0 17:43:30 ? 0:00 fsflush
root 349 1 0 17:43:53 ? 0:00 /usr/lib/saf/sac –t 300
root 277 276 0 17:43:49 ? 0:00 htt_server –port 9010
–syslog -message_locale C
root 180 1 0 17:43:45 ? 0:00 /usr/lib/autofs/automountd
root 59 1 0 17:43:39 ? 0:00 /usr/lib/sysevent/syseventd
root 73 1 0 17:43:40 ? 0:00 /usr/lib/picl/picld
root 133 1 0 17:43:43 ? 0:00 /usr/sbin/rpcbind
root 229 1 0 17:43:48 ? 0:00 /usr/lib/power/powerd
root 172 1 0 17:43:44 ? 0:00 /usr/lib/nfs/lockd
root 156 1 0 17:43:44 ? 0:00 /usr/sbin/inetd -s
root 217 1 0 17:43:47 ? 0:00 /usr/lib/lpsched
daemon 168 1 0 17:43:44 ? 0:00 /usr/lib/nfs/statd
root 189 1 0 17:43:45 ? 0:00 /usr/sbin/syslogd
root 203 1 0 17:43:46 ? 0:00 /usr/sbin/cron
root 205 1 0 17:43:46 ? 0:00 /usr/sbin/nscd
root 343 1 0 17:43:53 ? 0:00 /usr/sbin/vold
root 240 1 0 17:43:48 ? 0:00 /usr/lib/utmpd
root 324 1 0 17:43:51 ? 0:00 /usr/lib/snmp/snmpdx –y –c
/etc/snmp/conf
root 261 1 0 17:43:49 ? 0:00 /usr/sadm/lib/smc/bin/smcboot
root 355 329 0 17:43:56 ? 0:00 /usr/dt/bin/dtlogin -daemon
root 329 1 0 17:43:52 ? 0:00 /usr/dt/bin/dtlogin -daemon
root 262 261 0 17:43:49 ? 0:00 /usr/sadm/lib/smc/bin/smcboot
root 263 261 0 17:43:49 ? 0:00 /usr/sadm/lib/smc/bin/smcboot
root 354 1 0 17:43:55 ? 0:00 /usr/lib/ssh/sshd
root 338 1 0 17:43:52 ? 0:00 /usr/lib/dmi/snmpXdmid -s sunny
root 352 349 0 17:43:53 ? 0:00 /usr/lib/saf/ttymon
root 353 329 2 17:43:54 ? 1:41 /usr/openwin/bin/Xsun :0
–nobanner –auth
/var/dt/A:0-KtaiPa
root 356 329 0 17:43:56 ? 0:00 /usr/openwin/bin/fbconsole –d :0
root 358 324 0 17:43:57 ? 0:00 mibiisa -r –p 5248
root 337 1 0 17:43:52 ? 0:00 /usr/lib/dmi/dmispd
Ниже мы описываем смысл колонок этого вывода. Некоторые
колонки появятся только при использовании специфических ключей,
отличных от ключей ef. Для получения еще более детальной информации
следует обратиться к man .
–f ).
В колонке F –
В колонке S – state (состояние) – указывается
Идентификатор
C –
NI – значение NICE (показателя уступчивости), используется при
вычислении глобального
ADDR – адрес в памяти.
SZ – размер процесса в виртуальной памяти, включая все отображенные
файлы и устройства, измеряется в pagesize.
WCHAN – адрес события, ради которого процесс перешел в состояние сна; если поле пусто – процесс запущен.
STIME – время
TIME – сколько времени процесс отнял у
При указании ключа j выводятся дополнительные сведения:
При указании ключа L выводятся дополнительные сведения, причем информация выдается по одной строке на каждый легковесный процесс. Обычные однопоточные процессы соотносятся только с одним легковесным процессом:
Процессы, которые завершились, но чей код заверешния не был
востребован <defunct>.
Кроме программы :
top last pid: 923; load averages: 4.56, 1.18, 0.50 17:54:22 64 processes: 63 sleeping, 1 on cpu CPU states: 0.0% idle, 0.5% user, 99.5% kernel, 0.0% iowait, 0.0% swap Memory: 128M real, 18M free, 101M swap in use, 499M swap free PID USERNAME LWP PRI NICE SIZE RES STATE TIME CPU COMMAND 909 root 1 60 0 17M 3340K sleep 0:00 0.92% pagein 353 root 1 58 0 32M 16M sleep 0:05 0.37% Xsun 893 root 1 49 0 2228K 1172K cpu 0:00 0.15% top 753 root 1 49 0 15M 8112K sleep 0:00 0.13% dtterm 911 root 1 59 0 3352K 752K sleep 0:00 0.03% sh 912 root 1 49 0 3360K 600K sleep 0:00 0.03% sh 894 root 1 59 0 3064K 1816K sleep 0:00 0.03% dtexec 656 root 5 59 0 22M 10M sleep 0:01 0.02% dtwm 648 root 1 59 0 6644K 2280K sleep 0:00 0.02% ttsession 667 root 1 59 0 1844K 512K sleep 0:00 0.02% rpc.rstatd 277 root 29 59 0 5612K 1724K sleep 0:00 0.01% htt_server 895 root 1 59 0 3360K 756K sleep 0:00 0.01% soffice 720 root 4 49 0 42M 26M sleep 0:03 0.00% mozilla-bin 649 root 1 49 0 18M 6288K sleep 0:00 0.00% dtsession 760 root 1 49 0 4752K 1656K sleep 0:00 0.00% bash
В принято использовать похожую по
функциональности команду prstat.
Кроме этого, в
pgrep имя
Она является эквивалентом команды
ps –ef | grep имя
С помощью pargs можно посмотреть, какие аргументы переданы
конкретному процессу и какая у него
pargs 2793 2793: dtterm -name Run -xrm *menuBar: False -iconic -map -e /usr/dt/ bin/dtexec -open argv[0]: dtterm argv[1]: -e argv[2]: /usr/dt/bin/dtexec argv[3]: -open argv[4]: -1 argv[5]: -ttprocid argv[6]: 2.10fX-r 01 648 1289637086 1 1 0 192.168.5.33 5 sunny_105_1 argv[7]: /export/home/mozilla_bin/sfw/bin/mozilla argv[8]: <NULL> argv[9]: -open argv[10]: -1 argv[11]: -ttprocid argv[12]: 2.10fX-r 01 648 1289637086 1 1 0 192.168.5.33 5 sunny_105_1 argv[13]: /export/home/mozilla_bin/sfw/bin/mozilla pargs -e 2793 2793: dtterm -name Run -xrm *menuBar: False -iconic -map -e /usr/dt/ bin/dtexec -open envp[0]: AB_CARDCATALOG=/usr/dt/share/answerbooks/ru_RU.UTF-8/ ab_cardcatalog envp[1]: DISPLAY=:0.0 envp[2]: DTAPPSEARCHPATH=//.dt/appmanager:/etc/dt/appconfig/ appmanager/%L:/etc/dt/appconfig/appmanager/C:/usr/dt/appconfig/ appmanager/%L:/usr/dt/appconfig/appmanager/C envp[3]: DTDATABASESEARCHPATH=//.dt/types,/etc/dt/appconfig/types/%L,/ etc/dt/appconfig/types/C,/usr/dt/appconfig/types/%L,/usr/dt/appconfig/ types/C
Вывод команды pargs значительно сокращен, ключ –e требует вывести
все содержимое dtterm, как в нашем примере,
Команда prstat позволяет в динамике, подобно команде ,
отслеживать
prstat PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP 3576 root 3412K 868K run 13 0 0:00:02 6,3% find/1 353 root 45M 19M sleep 59 0 0:02:30 0,2% Xsun/1 753 root 15M 3620K run 49 0 0:00:02 0,1% dtterm/1 3577 root 6640K 4108K cpu0 49 0 0:00:00 0,1% prstat/1 205 root 2872K 624K sleep 59 0 0:00:00 0,0% nscd/18 895 root 123M 21M sleep 49 0 0:00:49 0,0% soffice.bin/4 667 root 1844K 488K sleep 59 0 0:00:00 0,0% rpc.rstatd/1 217 root 5364K 536K sleep 59 0 0:00:00 0,0% lpsched/1 324 root 4360K 196K sleep 59 0 0:00:00 0,0% snmpdx/1 240 root 1100K 288K sleep 59 0 0:00:00 0,0% utmpd/1 343 root 4892K 0K sleep 59 0 0:00:00 0,0% vold/3 276 root 3240K 0K sleep 59 0 0:00:00 0,0% htt/1 633 root 3784K 0K sleep 59 0 0:00:00 0,0% sdt_shell/1 657 root 16M 2496K sleep 49 0 0:00:00 0,0% dtfile/1 203 root 4484K 568K sleep 59 0 0:00:00 0,0% cron/1 189 root 5636K 1092K sleep 59 0 0:00:00 0,0% syslogd/13 168 daemon 2444K 820K sleep 59 0 0:00:00 0,0% statd/1 156 root 2412K 688K sleep 59 0 0:00:00 0,0% inetd/1 172 root 2160K 748K sleep 59 0 0:00:00 0,0% lockd/2 229 root 1348K 0K sleep 59 0 0:00:00 0,0% powerd/2 133 root 2212K 604K sleep 59 0 0:00:00 0,0% rpcbind/1 Total: 61 processes, 161 lwps, load averages: 0,25, 0,17, 0,27
Вы можете получить информацию только о тех процессах, которые
запущены вами. Пользователь
В , но если этого
почему-либо не произошло, можно воспользоваться программой preap,
которая примет код
, передающая процессу сигналы. Также можно использовать вышеописанные
программы изменения
Не следует путать команду с сигналом
Будучи запущенной без ключей, она передает процессу сигнал
kill [-ключи] номер_процесса
Например, для sendmail можно выполнить
следующие действия:
ps auxw | grep sendmail root 2057 0.0 0.2 2664 444 ? S Jul08 3:24 sendmail: accepting connections
Как видно, sendmail имеет
kill 2057
И повторяем последнее действие для проверки (контрольный выстрел):
kill 2057 kill: (2057) - No such pid
Сообщение No such говорит о том, что процесс уже завершился.
Программу можно использовать для передачи любых сигналов.
Чтобы передать некий сигнал, надо указать в качестве ключа числовое
или мнемоническое обозначение этого сигнала.
Например, после изменений, внесенных в файл конфигурации /etc/inetd.conf, следует потребовать от inetd перечитать этот
файл конфигурации.
Это можно сделать, послав ему сигнал HUP (номер один), так как
известно, что этот
ps -ef | grep inetd root 156 1 0 17:43:44 ? 0:00 /usr/sbin/inetd -s root 4555 760 0 19:15:16 pts/5 0:00 grep inetd
Мы видим два процесса, в строках информации о которых есть слово
inetd. Первая строка, grep inetd – это тот самый процесс grep, который мы
только что сами запустили. Программы и grep запустились
одновременно, и показал "мгновенный снимок"
По идее, строка grep inetd в таком случае должна показываться всегда, но на практике иногда мы не видим этой строки при запуске такой команды. Проведите эксперимент: возможно, что в вашей системе (это зависит от ее скорости и текущей загрузки) вы никогда не увидите строку grep или, наоборот, будете ее видеть всегда.
Это связано с тем, что физически запуск grep происходит чуть-чуть
позже, чем , последняя может успеть завершиться раньше, чем grep
начнется (ведь таблица процессов может оказаться маленькой и работы
у будет мало). Тогда строки про grep в списке найденных процессов
не будет.
Теперь пошлем сигнал процессу inetd:
kill –1 156
Помните, не все демоны и не во всех системах по сигналу HUP
перечитывают свой файл конфигурации. Прежде, чем посылать демону
сигналы, выясните, как он на них собирается реагировать: почитайте в man о его повадках.
kill –9 PID.
или
kill –KILL PID
При выполнении команды лучше указывать мнемонические
обозначения сигналов, а не числовые: в разных системах UNIX сигналы с
одним числовым номером могут иметь разные смыслы. Впрочем, можно
смело руководствоваться вышеприведенными таблицами в разделе "сигналы"
в отношении сигналов в
Чтобы послать сигнал нескольким процессам одновременно, следует
использовать программу pkill или killall (их подробное описание
есть в разделе "сигналы" выше в этой лекции).
При запуске процесса можно менять его базовый приоритет внутри
В
nice -n приращение команда
например,
nice –n 5 ls
Это "5" воспринимается как увеличение значения NICE на 5, т.е.
снижение приоритета на 5 единиц. Пользователь nice –n -4 ls. Это будет воспринято как увеличение базового
приоритета, т.е. уменьшение значения NICE на 4.
Базовый приоритет уже запущенного процесса можно менять командой renice:
renice -n приращение PID
Команда renice может быть использована также для изменения
приоритета renice ).
Заданием называется запущенные одной командой несколько программ
(в частном случае, это может быть и одна программа). Для управления
заданиями можно использовать , bg и fg
для получения информации о заданиях, переключении задания в фоновый
или
Более подробно о работе с заданиями рассказано в лекции 11.
Вынесете ли вы сегодня мусор или пойдете в магазин, поедете на заправку кормить своего железного коня бензином или просто ляжете спать пораньше – так или иначе, какое-нибудь дело вы сегодня сделаете. Дела, которые вы делаете, могут быть однократными (купить щенка) или регулярными (погулять с собакой). Может быть, "однократные" – не совсем точное прилагательное, потому что щенка вы можете купить и раз, и два, и еще много раз в жизни. Но вряд ли это дело можно назвать регулярным – не станете же вы раз в год ровно в полночь 13 марта покупать щенка!
Все-таки станете? Вы не сатанист, часом?
Еще приятнее запланировать выполнение нерегуряного или регулярного дела так, чтобы его делал кто-то другой. Например, сообщите сыну, что вы просите его завтра в полдень отправиться в клуб собаководов и купить там щеночка. Однократно. А потом (когда купит) скажите, что вы запланировали его (сына) прогулки с ним (щеночком) ежедневно – на годы вперед.
at, а для регулярных
– crontab.
Для планирования однократного запуска задач в строго определенное
время (точность – одна минута) используется программа at. Она
создает и изменяет список задач для выполнения, размещая его в каталоге /var/. В cron не
отвечает за задания, запланированные с помощью at, и для последних
имеется специальный atd.
Чтобы at могла верно запланировать задачи, следует указать ей
время и дату запуска задачи:
at time date
Параметр time может быть в форме HH:MM (часы:минуты), или
словом midnight, noon, now, или временем с название_месяца день [год], либо MMDDYY,
либо MM/DD/YY, либо DD.MM.YY. Также можно
указать время в виде now+ n единицы, где единицы – это minutes, . Можно указать для времени суффикс today или tomorrow.
Указание time без date означает выполнение задачи в текущие сутки,
а если time сегодня уже прошло, то завтра в указанное время.
Программа at принимает список задач для выполнения во входной
поток.
at –l (или atq ) распечатывает список поставленных в очередь задач
at –r позволяет удалить задачу по идентификатору, который показывает at –l.
В некоторых системах at –r называется atrm. В
at.
Обычному пользователю разрешается использовать at в случае, если
его имя указано в файле /usr/lib/cron/at.allow. Если этого файла нет,
то проверяется, нет ли имени пользователя в /usr/lib/cron/at.deny (если
есть, ему запрещается использование at ). Если ни одного из этих двух
файлов нет, пользоваться at разрешается только пользователям, которым
назначен набор /usr/lib/cron/at.deny и он
пуст, то по умолчанию всем разрешено пользоваться at. В файлах at.deny
и at.allow имена пользователей пишутся по одному в строке.
Задания at и crontab заблокированного пользователя не запускаются.
cron запустит задания только того пользователя, который имеет
легальный доступ в систему в настоящее время, как отражено в файле /etc/.
Задание, запущенное на выполнение демоном cron, выполняется от
имени пользователя, который поставил задание в очередь. Стандартный
вывод и стандартный поток ошибок задания cron высылает почтой этому
пользователю. Можно указать иное место для вывода информации с
помощью ключа m команды at или с помощью параметра в файле crontab
(см. ниже). Запланированные задачи выполняются в среде командного
/ без назначения
Проведем небольшой эксперимент. Вначале убедимся, что каталог,
где сохраняются задания at, пуст.
ls /var/spool/cron/atjobs/
Проверим время и дату.
date Сбт 15 Май 2004 19:10:29
Запланируем
at 1912 at> touch /tuition at> <Ctrl-D> commands will be executed using /sbin/sh job 1084633920.a at Сбт Май 15 19:12:00 2004
В каталоге, где собираются задания в очереди на выполнение, появился новый файл:
ls /var/spool/cron/atjobs/ 1084633920.a
И по команде at –l мы получаем информацию о поставленном в
at -l user = root 1084633920.a Сбт Май 15 19:12:00 2004
Пока в tuition нет:
ls / bin devices lib opt tmp xfn boot etc lost+found platform TT_DB cdrom export mnt proc usr core home net sbin var dev kernel nsmail test vol
Почему? Да время еще не наступило:
date Сбт 15 Май 2004 19:11:42
Дожидаемся заданного времени и (о чудо!) файл /tuition появился!
Смотрите:
date Сбт 15 Май 2004 19:12:12 ls / bin devices lib opt tmp vol boot etc lost+found platform TT_DB xfn cdrom export mnt proc tuition core home net sbin usr dev kernel nsmail test var
cron ежеминутно инспектирует таблицу запланированных
задач и выполняет те задачи, время которых наступило (в crontab служит
для планирования периодически запускаемых процессов. Они подготавливают
таблицу заданий для cron.
У каждого пользователя есть своя таблица crontab. Ее можно отредактировать
командой crontab –e. По этой команде вызывается текстовый
редактор (обычно – ), а в качестве файла для редактирования окажется
таблица crontab. Если вы раньше не задавали никаких периодических
задач, файл будет пустым.
Формат таблицы crontab: каждая строка описывает одну задачу, в
строке содержится 6 полей:
mm hh dd mo dw command
mm – минуты от 0 до 59hh – часы от 0 до 23dd – числа от 1 до 31mo – месяцы от 1 до 12dw – дни недели от 0 до 7, 0 и 7 – это воскресенье.command – команда Каждое числовое поле в таблице может содержать число, несколько
чисел через запятую,
Если в строке указаны определенное число месяца и определенный день недели, то для выполнения команды достаточно, чтобы наступило либо это число, либо этот день недели.
Так, строка
12 10 * * 0 rm -rf /var/log/*.[0-9]
означает, что в 10:12 каждое воскресенье нужно удалять файлы *.[0-9] из /var/log.
Однако, если было бы написано
12 10 10 * 0 rm -rf /var/log/*.[0-9]
это бы требовало выполнять такое удаление "в 10:12 по воскресеньям и десятым числам", а не "в 10:12 десятого числа, если оно приходится на воскресенье".
Как и в случае с at, команда запускается от имени владельца
таблицы, в качестве /.
В первых строках таблицы могут быть установлены переменные
PATH=/usr/bin:/usr/sbin:/usr/local/bin
В ней можно задать каталоги, которые по умолчанию не входят в
Кроме cron отправит
сообщение владельцу таблицы crontab, если найдет повод это сделать
(например, произошла ошибка выполнения команды). Если переменная
cron
расценит это значение как имя адресата, которому надо послать письмо,
вместо пользователя, запланировавшего задачу. Если переменная
crontab
осуществляется так:
имя_переменной = значение
Пробелы вокруг знака
Для просмотра таблицы crontab используйте команду crontab -l, для
crontab –r. Можно создать файл с таблицей crontab
заранее и установить ее в систему командой
crontab имя_файла_таблицы.
Такая команда потенциально опасна: если раньше существовали
какие-либо команды в таблице crontab, то они потеряются навсегда.
В /var/ или /etc/.
crontab -e 22 * * * * /var/admin/cron/hourly 22 22 * * * /var/admin/cron/daily 2 22 * * 0 /var/admin/cron/weekly 2 2 1 * * /var/admin/cron/monthly
В скрипт рекомендуется включать проверку состояния сетевого
подсоединения (
В скрипт daily включают проверку очереди сообщений (не слишком
ли велика – запустите mailq ), синхронизацию системного времени
( ntpdate, rdate ).
В скрипт weekly включают проверку свободного места на диске (если
у вас это приходится делать чаще, чем раз в неделю, подумайте о покупке
нового диска; и может быть, лучше сразу купить парочку?), проверку
файлов passwd, и hosts.deny, файлов конфигурации ftpd,
sendmail, протоколов utmp и wtmp на предмет прав доступа и размера.
Ежемесячный скрипт
Вы можете включить в эти скрипты свои задачи, которые являются специфическими для конкретной системы – проверку конфигурации smbd для файлового сервера samba, проверку дисковых квот пользователей, контроль появления свежих файлов с установленным битом SUID и так далее.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.