Андрей Робачевский - Операционная система UNIX
- Название:Операционная система UNIX
- Автор:
- Жанр:
- Издательство:BHV - Санкт-Петербург
- Год:1997
- Город:Санкт-Петербург
- ISBN:5-7791-0057-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Андрей Робачевский - Операционная система UNIX краткое содержание
Книга посвящена семейству операционных систем UNIX и содержит информацию о принципах организации, идеологии и архитектуре, объединяющих различные версии этой операционной системы.
В книге рассматриваются: архитектура ядра UNIX (подсистемы ввода/вывода, управления памятью и процессами, а также файловая подсистема), программный интерфейс UNIX (системные вызовы и основные библиотечные функции), пользовательская среда (командный интерпретатор shell, основные команды и утилиты) и сетевая поддержка в UNIX (протоколов семейства TCP/IP, архитектура сетевой подсистемы, программные интерфейсы сокетов и TLI).
Для широкого круга пользователей
Операционная система UNIX - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Текущие и фоновые группы процессов
Как было показано, для каждого управляющего терминала существует сеанс, включающий одну или несколько групп процессов. Одна из этих групп является текущей (foreground group), а остальные фоновыми (background group). [27] Наличие текущей и фоновых групп процессов в сеансе работы пользователя зависит от возможности командного интерпретатора управлять заданиями (job control). При отсутствии этой возможности все процессы будут выполняться в той же группе, что и shell.
Сигналы SIGINT
и SIGQUIT
, которые генерируются драйвером терминала, посылаются всем процессам текущей группы. Попытка процессов фоновых групп осуществить доступ к управляющему терминалу, как правило, вызывает отправление им сигналов SIGSTP
, SIGTTIN
или SIGTTOU
.
Рассмотрим следующие команды:
$ find / -name foo &
$ cat | sort
При этом происходит чтение ввода пользователя с клавиатуры ( cat(1) и сортировка введенных данных ( sort(1) ). Если интерпретатор поддерживает управление заданиями, оба процесса, созданные для программ cat(1) и sort(1) , будут помещены в отдельную группу. Это подтверждается выводом команды ps(1) :
$ ps -efj | egrep "PID|andy"
UID PID PPID PGID SID С STIME TTY TIME CMD
andy 2436 2407 2435 2407 1 15:51:30 tty01 0:00 sort
andy 2431 2407 2431 2407 0 15:51:25 tty01 0:00 find / -name foo
andy 2407 2405 2407 2407 0 15:31:09 tty01 0:00 -sh
andy 2435 2407 2435 2407 0 15:51:30 tty01 0:00 cat
Все четыре процесса (sh, find, cat и sort) имеют один и тот же идентификатор сеанса, связанного с управляющим терминалом tty01. Процессы cat(1) и sort(1) принадлежат одной группе, идентификатор которой (2435) отличен от идентификатора группы командного интерпретатора (2407). То же самое можно сказать и о процессе find(1) , который является лидером отдельной группы (2431). Можно также заметить, что процессы sh(1) , find(1) и cat(1) являются лидерами групп, a еще sh(1) и лидером сеанса.
Хотя команда ps(1) не указывает, какие группы являются фоновыми, а какая текущей, синтаксис команд позволяет утверждать, что командный интерпретатор помещает cat(1) и sort(1) в текущую группу. Это, во-первых, позволяет процессу cat(1) читать данные со стандартного потока ввода, связанного с терминалом tty01. Во-вторых, пользователь имеет возможность завершить выполнение обоих процессов путем нажатия клавиши < Del > (или < Ctrl >+< C >), что вызовет генерацию сигнала SIGINT
. Получение процессами этого сигнала вызовет завершение их выполнения (действие по умолчанию), если, конечно, процесс не установил игнорирование SIGINT
. На рис. 2.13. представлена схема взаимодействия управляющего терминала, сеанса и групп процессов для приведенного выше примера. Более детально взаимосвязь между терминалом и процессами рассмотрена в следующей главе.

Рис. 2.13. Связь между управляющим терминалом, сеансом и группами
Если командный интерпретатор не поддерживает управление заданиями, оба процесса станут членами той же группы, что и сам shell. В этом случае командный интерпретатор должен позаботиться об игнорировании сигналов SIGINT
и SIGQUIT
, чтобы допустимые действия пользователя (такие как нажатие клавиши < Del > или < Ctrl >+< C >) не привели к завершению выполнения shell и выходу из системы.
Ограничения
UNIX является многозадачной системой. Это значит, что несколько процессов конкурируют между собой при доступе к различным ресурсам. Для "справедливого" распределения разделяемых ресурсов, таких как память, дисковое пространство и т.п., каждому процессу установлен набор ограничений. Эти ограничения не носят общесистемного характера, как, например, максимальное число процессов или областей, а устанавливаются для каждого процесса отдельно. Для получения информации о текущих ограничениях и их изменения предназначены системные вызовы getrlimit(2) и setrlimit(2) :
#include
#include
int getrlimit{int resource, struct rlimit *rlp);
int setrlimit(int resource, const struct rlimit *rlp);
Аргумент resource
определяет вид ресурса, для которого мы хотим узнать или изменить ограничения процесса. Структура rlimit
состоит из двух полей:
rlim_t rlim_cur;
rlim_t rlim_max;
определяющих, соответственно, изменяемое (soft) и жесткое (hard) ограничение. Первое определяет текущее ограничение процесса на данный ресурс, а второе — максимальный возможный предел потребления ресурса. Например, изменяемое ограничение на число открытых процессом файлов может составлять 64, в то время как жесткое ограничение равно 1024.
Любой процесс может изменить значение текущего ограничения вплоть до максимально возможного предела. Жесткое ограничение может быть изменено в сторону увеличения предела потребления ресурса только процессом с привилегиями суперпользователя. Обычные процессы могут только уменьшить значение жесткого ограничения. Обычно ограничения устанавливаются при инициализации системы и затем наследуются порожденными процессами (хотя в дальнейшем могут быть изменены).
Вообще говоря, максимальный возможный предел потребления ресурса может иметь бесконечное значение. Для этого необходимо установить значение rlim_max
равным RLIM_INFINITY
. В этом случае физические ограничения системы (например, объем памяти и дискового пространства) будут определять реальный предел использования того или иного ресурса.
Различные ограничения и связанные с ними типы ресурсов приведены в табл. 2.21.
Таблица 2.21. Ограничения процесса (значения аргумента resource)
Ограничение | Тип ресурса | Эффект |
---|---|---|
RLIMIT_CORE |
Максимальный размер создаваемого файла core, содержащего образ памяти процесса. Если предел установлен равным 0, файл coreсоздаваться не будет. | После создания файла core запись в этот файл будет остановлена при достижении предельного размера. |
RLIMIT_CPU |
Максимальное время использования процессора в секундах. | При превышении предела процессу отправляется сигнал SIGXCPU . |
RLIMIT_DATA |
Максимальный размер сегмента данных процесса в байтах, т.е. максимальное значение смещения брейк-адреса. | При достижении этого предела последующие вызовы функции brk(2) завершатся с ошибкой ENOMEM . |
RLIMIT_FSIZE |
Максимальный размер файла, который может создать процесс. Если значение этого предела равно 0, процесс не может создавать файлы. | При достижении этого предела процессу отправляется сигнал SIGXFSZ . Если сигнал перехватывается или игнорируется процессом, последующие попытки увеличить размер файла закончатся с ошибкой EFBIG . |
RLIMIT_NOFILE |
Максимальное количество назначенных файловых дескрипторов процесса. | При достижении этого предела, последующие попытки получить новый файловый дескриптор закончатся с ошибкой EMFlLE . |
RLIMIT_STACK |
Максимальный размер стека процесса. | При попытке расширить стек за установленный предел отправляется сигнал SIGSEGV . Если процесс перехватывает или игнорирует сигнал и не использует альтернативный стек с помощью функции sigaltstack(2) , диспозиция сигнала устанавливается на действие по умолчанию перед отправкой процессу. |
RLIMIT_VMEM |
Максимальный размер отображаемой памяти процесса в байтах. (Предел определен в версиях System V.) | При достижении этого предела последующие вызовы brk(2) или mmap(2) завершатся с ошибкой ENOMEM . |
RLIMIT_NPROC |
Максимальное число процессов с одним реальным UID. Определяет максимальное число процессов, которые может запустить пользователь. (Предел определен в версиях BSD UNIX.) | При достижении этого предела, последующие вызовы fork(2) для порождения нового процесса завершатся с ошибкой EAGAIN . |
RLIMIT_RSS |
Максимальный размер в байтах резидентной части процесса (RSS — Resident Set Size). Определяет максимальное количество физической памяти, предоставляемой процессу. (Предел определен в версиях BSD UNIX.) | Если система ощущает недостаток памяти, ядро освободит память за счет процессов, превысивших свой RSS. |
RLIMIT_MEMLOCK |
Максимальный физической памяти (физических страниц) в байтах, который процесс может заблокировать с помощью системного вызова mlock(2) . (Предел определен в версиях BSD UNIX.) | При превышении предела системный вызов mlock(2) завершится с ошибкой EAGAIN . |
В заключение приведем пример программы, выводящий на экран установленные ограничения для процесса:
Читать дальшеИнтервал:
Закладка: