WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!


Pages:     | 1 |   ...   | 28 | 29 || 31 | 32 |

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

9.3.2 Передний план и фоновый режим Задания могут быть либо на переднем плане (foreground), либо фоновыми (background). На переднем плане в любой момент времени может быть только одно задание. Задание на переднем плане – это то задание, с которым происходит взаимодействие пользователя; оно получает ввод с клавиатуры и посылает вывод на экран (если ввод или вывод не перенаправили куда-либо еще). Напротив, фоновые задания не получают ввода с терминала; как правило, такие задания не нуждаются во взаимодействии с пользователем.

Некоторые задания исполняются очень долго и во время их работы не происходит ничего интересного. Пример таких заданий – компилирование программ, а также сжатие больших файлов. Нет никаких причин смотреть на экран и ждать, когда эти задания выполнятся. Такие задания следует пускать в фоновом режиме. В это время можно работать с другими программами.

Задания также можно (временно) приостанавливать (suspend). Затем приостановленному заданию можно дать указание продолжать работу на переднем плане или в фоновом режиме. При возобновлении исполнения приостановленного задания его состояние не изменяется – задание продолжает выполняться с того места, где его остановили.

Прерывание задания – действие отличное от приостановки задания.

При прерывании (interrupt) задания процесс погибает. Прерывание заданий обычно осуществляется нажатием соответствующей комбинации клавиш, обычно это Ctrl-C. Восстановить прерванное задание никаким образом невозможно. Следует также знать, что некоторые программы перехватывают команду прерывания, так что нажатие комбинации клавиш Ctrl-C может не прервать процесс немедленно. Это сделано для того, чтобы программа могла уничтожить следы своей работы прежде, чем она будет завершена. На практике некоторые программы прервать таким способом нельзя.

9.3.3 Перевод заданий в фоновый режим и уничтожение заданий Начнем с простого примера. Рассмотрим команду yes, которая на первый взгляд покажется бесполезной. Эта команда посылает бесконечный поток строк, состоящих из символа «y», в стандартный вывод:

/home/larry# yes y y y y y Последовательность таких строк будет бесконечно продолжаться.

Уничтожить этот процесс можно нажатием клавиши прерывания, которая обычно является комбинацией Ctrl-C. Поступим теперь иначе. Чтобы на экран не выводилась эта бесконечная последовательность, перенаправим стандартный вывод команды yes на /dev/null. Как отмечалось выше, устройство /dev/null действует как «черная дыра»: все данные, посланные в это устройство, пропадают. С помощью этого устройства очень удобно избавляться от слишком обильного вывода некоторых программ:

/home/larry# yes > /dev/null Теперь на экран ничего не выводится. Однако и приглашение командной оболочки также не возвращается. Это происходит потому, что команда yes все еще работает и посылает свои сообщения, состоящие из букв y на /dev/null. Уничтожить это задание также можно нажатием клавиш прерывания.

Допустим теперь, что вы хотите, чтобы команда yes продолжала работать, но при этом и приглашение командной оболочки должно вернуться на экран. Для этого можно команду yes перевести в фоновый режим, и она будет там работать, не общаясь с вами.

Один способ перевести процесс в фоновый режим – приписать символ «&» к концу команды. Пример:

/home/larry# yes > /dev/null & \verb+[1] 164+ /home/larry# Как видно, приглашение командной оболочки опять появилось.

Однако, что означает «[1] 164» И действительно ли команда yes продолжает работать Сообщение «[1]» представляет собой номер задания (job number) для процесса yes. Командная оболочка присваивает номер задания каждому исполняемому заданию. Поскольку yes является единственным исполняемым заданием, ему присваивается номер 1. Число «164» является идентификационным номером, соответствующим данному процессу (PID), и этот номер также дан процессу системой. Как мы увидим дальше, к процессу можно обращаться, указывая оба этих номера.

Итак, теперь у нас есть процесс команды yes, работающий в фоне и непрерывно посылающий поток из букв y на устройство /dev/null. Для того, чтобы узнать статус этого процесса, нужно исполнить команду jobs, которая является внутренней командой оболочки /home/larry# jobs [1]+ Running yes >/dev/null &- /home/larry# Мы видим, что эта программа действительно работает. Для того, чтобы узнать статус задания, можно также воспользоваться командой ps, как это было показано выше.

Для того, чтобы прервать работу задания, используется команда kill. В качестве аргумента этой команде дается либо номер задания, либо PID. В рассмотренном выше случае номер задания был 1, так что команда /home/larry# kill %прервет работу задания. Когда к заданию обращаются по его номеру, а не PID, тогда перед этим номером в командной строке нужно поставить символ процента.

Теперь введем команду jobs снова, чтобы проверить результат предыдущего действия:

/home/larry# jobs [1]+ Terminated yes >/dev/null /home/larry# Фактически задание уничтожено, и при вводе команды jobs в следующий раз на экране о нем не будет никакой информации.

Уничтожить задание можно также, используя идентификационный номер процесса (PID). Этот номер, наряду с идентификационным номером задания, указывается во время старта задания. В нашем примере значение PID было 164, так что команда /home/larry# kill была бы эквивалентна команде /home/larry# kill %При использовании PID в качестве аргумента команды kill вводить символ «%» не требуется.

9.3.4 Приостановка и продолжение работы заданий Предложим еще один метод, с помощью которого процесс можно перевести в фоновый режим. Процесс запускается обычным образом (на переднем плане), затем приостанавливается командой stop, а потом запускается повторно в фоновом режиме.

Запустим сначала процесс командой yes на переднем плане, как это делалось раньше /home/larry# yes > /dev/null Как и ранее, поскольку процесс работает на переднем плане, приглашение командной оболочки на экран не возвращается.

Теперь вместо того, чтобы прервать задание комбинацией клавиш Ctrl-C, задание можно приостановить (suspend, буквально – «подвесить»). «Подвешенное» задание не будет уничтожено, его выполнение будет временно остановлено до тех пор, пока оно не будут возобновлено. Для приостановки задания надо нажать соответствующую комбинацию клавиш, обычно это Ctrl-Z /home/larry# yes > /dev/null {ctrl-Z} [1]+ Stopped yes >/dev/null /home/larry# Приостановленный процесс попросту не выполняется. На него не тратятся вычислительные ресурсы процессора. Приостановленное задание можно запустить с той же точки, как будто бы оно и не было приостановлено.

Для возобновления выполнения задания на переднем плане можно использовать команду fg (от слова «foreground» – передний план):

/home/larry# fg yes >/dev/null Командная оболочка еще раз выведет на экран название команды, так что пользователь будет знать, какое именно задание он в данный момент запустил на переднем плане. Приостановим это задание еще раз нажатием клавиш Ctrl-Z, но в этот раз запустим его в фоновый режим командой bg (от слова «background» – фон). Это приведет к тому, что данный процесс будет работать так, как если бы при его запуске использовалась команда с символом «&» в конце (как это делалось в предыдущем разделе) /home/larry# bg [1]+ yes &>/dev/null & /home/larry# При этом приглашение командной оболочки возвращается. Сейчас команда jobs должна показывать, что процесс yes действительно в данный момент работает; этот процесс можно уничтожить командой kill, как это делалось раньше.

Для того чтобы приостановить задание, работающее в фоновом режиме, нельзя пользоваться комбинацией клавиш Ctrl-Z. Прежде чем приостанавливать задание, его нужно перевести на передний план командой fg и лишь потом приостановить. Таким образом, команду fg можно применять либо к приостановленным заданиям, либо к заданию, работающему в фоновом режиме.

Между заданиями в фоновом режиме и приостановленными заданиями есть большая разница. Приостановленное задание не работает и на него не тратятся вычислительные мощности процессора. Это задание не выполняет никаких действий. Приостановленное задание занимает некоторый объем оперативной памяти компьютера, хотя оно может быть перенесено в «своп». Напротив, задание в фоновом режиме выполняется, использует память и совершает некоторые действия, которые, возможно, требуются пользователю, но он в это время может работать с другими программами.

Задания, работающие в фоновом режиме, могут пытаться выводить некоторый текст на экран. Это будет мешать работать над другими задачами. Например, если ввести команду /home/larry# yes & (стандартный вывод не был перенаправлен на устройство /dev/null), то на экран будет выводиться бесконечный поток символов y. Этот поток невозможно будет остановить, поскольку комбинация клавиш Ctrl-C не воздействует на задания в фоновом режиме. Чтобы остановить эту выдачу, надо использовать команду fg, а затем уничтожить задание комбинацией клавиш Ctrl-C.

Сделаем еще одно замечание. Обычно командой fg и командой bg воздействуют на те задания, которые были приостановлены последними (эти задания будут помечены символом «+» рядом с номером задания, если ввести команду jobs). Если в одно и то же время работает одно или несколько заданий, задания можно помещать на передний план или в фоновый режим, задавая в качестве аргументов команды fg или команды bg их идентификационный номер (job ID). Например, команда /home/larry# fg %помещает задание номер 2 на передний план, а команда /home/larry# bg %помещает задание номер 3 в фоновый режим. Использовать PID в качестве аргументов команд fg и bg нельзя. Более того, для перевода задания на передний план можно просто указать его номер. Так, команда /home/larry# %будет эквивалентна команде /home/larry# fg %Важно помнить, что функция управления заданием принадлежит оболочке. Команды fg, bg и jobs являются внутренними командами оболочки.

9.4 Механизмы межпроцессного взаимодействия в ОС Unix При решении задачи синхронизации процессов и их взаимодействия посредством различных механизмов, предоставляемых ОС, может потребоваться использование следующих системных вызовов:

создание, завершение процесса, получение информации о процессе: fork, exit, getpid, getppid и т. д.;

синхронизация процессов: signal, kill, sleep, alarm, wait, paus), semop, semctl, semcreate и т. д.;

создание информационного канала, разделяемой памяти, очереди сообщений и работа с ними: pipe, mkfifo, read, write, msgget, shmget, msgctl, shmctl и т. д.

Механизм межпроцессного взаимодействия (Inter-Process Communication Facilities – IPC) включает средства, обеспечивающие возможность синхронизации процессов при доступе к совместно используемым ресурсам, – семафоры (semaphores);

средства, обеспечивающие возможность посылки процессом сообщений другому произвольному процессу, – очереди сообщений (message queries);

средства, обеспечивающие возможность наличия общей для процессов памяти, – сегменты разделяемой памяти (shared memory segments);

средства, обеспечивающие возможность «общения» процессов, как родственных, так и нет, через пайпы или каналы (pipes).

Наиболее общим понятием IPC является ключ, хранимый в общесистемной таблице и обозначающий объект межпроцессного взаимодействия, доступный нескольким процессам. Обозначаемый ключом объект может быть очередью сообщений, набором семафоров или сегментом разделяемой памяти. Ключ имеет тип key-t, состав которого зависит от реализации и определяется в файле . Ключ используется для создания объекта межпроцессного взаимодействия или получения доступа к существующему объекту.

Семафоры Для работы с семафорами поддерживаются три системных вызова:

semget – для создания и получения доступа к набору семафоров;

semop – для манипулирования значениями семафоров (системный вызов, который позволяет процессам синхронизоваться на основе использования семафоров);

semctl – для выполнения разнообразных управляющих операций над набором семафоров.

Прототипы перечисленных системных вызовов описаны в файлах #inсlude #inсlude Системный вызов semget имеет синтаксис int semid = semget (key_t key, int count, int flag) параметрами которого является ключ или уникальное имя сегмента (key), набора семафоров и дополнительные флаги (flag), определенные в , число семафоров в наборе семафоров (count), обладающих одним и тем же ключом. Системный вызов возвращает идентификатор набора семафоров semid. Живучесть такого семафора определяется живучестью ядра, т. е. объект семафор будет уничтожен тогда и только тогда, когда произойдет перезагрузка ядра либо его принудительно удалят.

После вызова semget индивидуальный семафор идентифицируется идентификатором набора семафоров и номером семафора в этом наборе.

Флаги системного вызова semget приведены ниже в таблице.

Таблица 4.Флаги системного вызова semge Флаг Описание Вызов semget создает новый семафор для данного ключа. Если флаг IPC_CREAT не задан, а набор сеIPC_CREAT мафоров с указанным ключом уже существует, то обращающийся процесс получит идентификатор существующего набора семафоров Флаг IPC_EXLC вместе с флагом IPC_CREAT предназначен для создания (и только для создания) IPC_EXLC набора семафоров. Если набор семафоров уже существует, semget возвратит -1, а системная переменная errno будет содержать значение EEXIST Младшие 9 бит флага задают права доступа к набору семафоров (табл. 4.2).

Таблица 4.Константы режима доступа при создании нового объекта IPC Константа Описание S_IRUSR Владелец – чтение S_IWUSR Владелец – запись S_IRGRP Группа – чтение S_IWGRP Группа – запись S_IROTH Прочие – чтение S_IWOTH Прочие – запись Таким образом, флаг создания семафора можно указать так:

int flag = S_IRUSR | S_IWUSR | S_IRGRP | IPC_CREAT;

Системный вызов semctl имеет формат int semctl (int semid, int sem_num, int command, union semun arg) где semid – это идентификатор набора семафоров; sem_num – номер семафора в группе; command – код операции; arg – указатель на структуру, содержимое которой интерпретируется по-разному, в зависимости от операции.

Объединение имеет вид union semun { int val; /* устанавливает значение семафора только для SETVAL */ struct semid_ds *buf;

/* используется командами IPC_STAT и IPC_SET */ unsigned short *array; /* используется командами SETALL и GETALL */ };

Объединение semun всегда должен быть переопределен в глобальной секции программы. Структура semid_ds выглядит следующим образом:

struct semid_ds { struct ipc_perm sem_perm; /* разрешения на операции */ struct sem *sem_base; /* указатель на массив семафоров в наборе */ ushort sem_nsems; /* количество семафоров */ time_t sem_otime; /* время последнего вызова semop() */ time_t sem_ctime; /* время создания последнего IPC_SET */ };

Вызов semctl позволяет:

уничтожить набор семафоров или индивидуальный семафор в указанной группе (IPCRMID);

вернуть значение отдельного семафора (GETVAL) или всех семафоров (GETALL);

установить значение отдельного семафора (SETVAL) или всех семафоров (SETALL);

вернуть число семафоров в наборе семафоров (GETPID).

Основным системным вызовом для манипулирования семафором является int semop (int semid, struct sembuf *op_array, int count) где semid – это ранее полученный дескриптор группы семафоров;

op_array – массив структур sembuf struct sembuf { short sem_num; /* номер семафора: 0,1,2..n */ short sem_op; /* операция с семафором */ short sem_flg; /* флаги операции: 0, IPC_NOWAIT, SEM_UNDO */ };

определенных в файле и содержащих описания операций над семафорами группы, a count – количество элементов массива.

Значение, возвращаемое системным вызовом, является значением последнего обработанного семафора.

Если указанные в массиве op_array номера семафоров не выходят за пределы общего размера набора семафоров, то системный вызов последовательно меняет значение семафора (если это возможно) в соответствии со значением поля «операция». Возможны три случая:

Pages:     | 1 |   ...   | 28 | 29 || 31 | 32 |






© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.