4.4Java Работа с процессами и потоками
Создание процессов
Класс java.lang.ProcessBuilder
После создания потока его можно принудительно завершить или послать ему данные
Создание потоков
Наследование от класса java.lang.Thread – основной
Реализация интерфейса java.lang.Runnable
Пример создания процесса в Java находится в приложении 2. Способы синхронизации потоков
Ключевое слово synchronized – критическая секция, основной
Объявление метода, целиком являющегося критической секцией
Выделение критической секции в теле метода
Использование типов пакета java.util.concurrent
CyclicBarrier
CountDownLatch
ConcurrentMap
BlockingQueue
Модель работы с потоками
В JRE до версии 1.2 использовалась модель Green Threads
Green Threads – имитация потоков операционной системы
JVM берёт на себя заботу о переключении между разными Green Threads
Для ОС все Green Threads управляемого процесса являются единственным потоком
Даже при использовании Green Threads для ОС JVM представляется в виде нескольких потоков, например, потока, в котором запускается сборщик мусора
Преимущества
Теоретически выше скорость переключения между Green Threads (реально работает очень медленно)
Требуется меньше ресурсов
Возможность создания большего количества Green Threads, по сравнению с потоками
Недостатки
Невозможно выполнить Green Threads на разных процессорах
В единицу времени выполняется только один Green Thread
Начиная с версии 1.2 в JRE по умолчанию используется модель потоков ОС, но модель Green Threads также поддерживается
Особенности работы с потоками Java в ОС Solaris
В ОС Solaris для Java начиная с версии 1.2 возможна использование модели MхN для работы с потоками
Рисунок 19. Java Solaris M:N модель
Управление задачами
java.util.concurrent.ThreadPoolExecutor – реализация пула потоков
java.util.concurrent.ScheduledThreadPoolExecutor – дополнительная возможность выполнять задания по расписанию или периодически
5Управление и синхронизация процессов и потоков 5.1Функции создания процессов и управления ими
Функция fork
pid_t fork(void);
Вызов функции приводит к созданию почти полной копии текущего процесса, запущенного с момента вызова функции fork
Возвращаемое значение – идентификатор потока, позволяющий определить, является ли выполняющийся процесс исходным или порождённым
В исходном процессе возвращается идентификатор порождённого процесса
В порождённом процессе возвращается 0
Возвращает -1 в случае, если создать дополнительный процесс не удалось (код ошибки заносится в errno)
Отличия порождённого процесса от исходного
идентификатор процесса (PID, PPID)
израсходованное время ЦП (оно обнуляется в момент создания)
сигналы процесса-родителя, требующие ответа
заблокированные файлы (record locking)
Прототип функции описан в файле unistd.h
Тип возвращаемого значения описан в файле sys/types.h
Дополнительная информация http://www.opengroup.org/onlinepubs/009695399/functions/fork.html
Семейство функций exec и переменная environ
int execl(const char *path, const char *arg0, ... /*, (char *)0 */);
int execv(const char *path, char *const argv[]);
Запуск нового процесса и завершение выполнения текущего процесса: замена текущего процесса новым
Возвращаемое значение
В случае ошибки -1 (код ошибки заносится в errno)
В случае успеха возвращаемое значение отсутствует, поскольку текущий процесс успешно завершается
Отличия между вариантами функции в её семействе определяются набором параметров
Прототипы функций описаны в файле unistd.h
extern char **environ; – дополнительно используемая глобальная переменная
Инициализируется как указатель на массив указателей на строки переменных среды (environment strings)
Дополнительная информация http://www.opengroup.org/onlinepubs/009695399/functions/exec.html
Семейство функций waitpid
pid_t wait(int *stat_loc);
pid_t waitpid(pid_t pid, int *stat_loc, int options);
Ожидание завершения одного или нескольких дочерних процессов
Функция позволяет получить информацию только об одном завершённом процессе, для получения информации о нескольких процессах функцию нужно вызвать несколько раз
Варианты работы в зависимости от значения параметра pid
pid = -1: выполняется ожидание завершения любого дочернего процесса (вызов waitpid эквивалентен вызову wait)
pid > 0: выполняется ожидание завершения дочернего процесса с указанным идентификатором
pid = 0: выполняется ожидание завершения дочернего процесса с идентификатором группы процесса, равным идентификатору группы текущего процесса
pid < -1: выполняется ожидание завершения дочернего процесса с идентификатором группы процесса, равным идентификатору группы, заданному абсолютным значением pid
Параметр stat_loc содержит указатель на информацию о причине завершения дочернего процесса, извлекаемую с помощью макросов
Параметр options задаётся в соответствии со значениями именованных констант, позволяет обеспечить неблокирующий вызов функции и отфильтровать завершённые процессы, по которым уже возвращалось состояние в предыдущих вызовах функции
Возвращаемое значение
В случае успеха – идентификатор завершившегося процесса
В случае ошибки -1 (код ошибки заносится в errno)
Прототип функции описан в файле sys/wait.h
Тип возвращаемого значения описан в файле sys/types.h
Дополнительная информация http://www.opengroup.org/onlinepubs/009695399/functions/waitpid.html
Функция kill
int kill(pid_t pid, int sig);
Посылает сигнал процессу или группе процессов
Варианты работы в зависимости от значения параметра pid
pid = -1: выполняется отправка сигнала всем процессам (за исключением системных процессов), к которым допустимо отправлять сигналы текущему процессу
pid > 0: выполняется отправка сигнала процессу с указанным идентификатором
pid = 0: выполняется отправка сигнала процессам с идентификатором группы процесса, равным идентификатору группы текущего процесса
pid < -1: выполняется отправка сигнала процессам с идентификатором группы процесса, равным идентификатору группы, заданному абсолютным значением pid
Прототип функции описан в файле signal.h
Дополнительная информация http://www.opengroup.org/onlinepubs/009695399/functions/kill.html
Функция signal
void (*signal(int sig, void (*func)(int)))(int);
Задаёт функцию обратного вызова для обработки поступившего сигнала текущему процессу
Параметр sig определяет значение сигнала, для которого назначается обработчик
Варианты работы в зависимости от значения параметра func
SIG_DFL – к указанному сигналу подключается обработчик по умолчанию
SIG_IGN – процесс не обрабатывает поступление указанного сигнала
Указатель на функцию – к указанному сигналу подключается обработчик в виде заданной указателем функции
Возвращаемое значение – указатель на функцию обратного вызова, являющуюся старым обработчиком сигнала
Прототип функции описан в файле signal.h
Дополнительная информация http://www.opengroup.org/onlinepubs/009695399/functions/signal.html
|